MySQL 5.1 InnoDB 구성 / 24GB RAM-바이 제온로드


10

현재 300-600 명의 동시 사용자가 있고 증가하는 페이스 북 앱을 실행 중입니다. 하드웨어를 성장시킬 준비를 갖기 위해 i7 / 12gb ram / 2x 80gb 인텔 x25 ssd (debian 5.0 / mysql 5.0 / 64bit)를 bi-xeon / 24gb ram / 2x 120gb 인텔 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 비트).

지금 나는 "작은 상자"보다 성능이 나쁘다는 문제에 직면하고 있습니다. 두 서버 모두 nginx / php fcgi를 사용하여 콘텐츠를 제공했습니다.

나는 약 65 % / 35 %의 읽기 / 쓰기를 갖는 innodb 만 사용하고 있습니다. 약 800-1000 qps이지만 모든 쿼리는 단순하며 둘 이상의 추가 테이블을 조인하지 않습니다. 모든 인덱스가 설정되고 느린 쿼리 (> 2 초)에 개별 쿼리가 기록되지 않습니다. 현재 매월 두 배가 될 것으로 예상하는 약 400MB의 데이터 (색인이있는 약 1GB)가 있습니다.

나는 매끄럽게 작동하도록 변경해야 할 힌트를 줄 수있는 모든 사람들을 좋아합니다.

i7 상자의 이전 구성은 다음과 같았습니다 (myisam / innodb 혼합).

오래된 my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

바이 제온 상자의 새로운 구성은 이와 같으며 (순수 innodb) 300 명 이상의 사용자에게 높은로드를 발생시킵니다. 프로세스 목록 상단에 약 30 개의 mysql 프로세스가 있습니다.

디스크 I / O :

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

흠, skip-name-resolve비활성화되어 있고 활성화 할 수 있습니까?
Wrikken

답변:


7

StackExchnage에 게시물을 작성했습니다.

  1. InnoDB 및 MyISAM을위한 MySQL 튜닝
  2. InnoDB 디스크 공간을 제어 하는 방법
  3. MySQL 디스크 공간 관리 에 대한 또 다른 견해
  4. InnoDB 최적화에 대한 견해
  5. InnoDB 미세 조정

필요한 지침을 보려면이 내용을 읽으십시오.

이제 더 시급한 문제가 발생했습니다. 400MB의 데이터, 1GB의 인덱스가 있다고 언급했습니다. 이런 종류의 색인이 데이터보다 50 % 더 크다는 것이 무섭습니다. 그러나 모든 데이터가 InnoDB이고 현재 쿼리 성능이 만족 스럽기 때문에 특히 16384MB의 innodb_buffer_pool_size 설정이 적당합니다. 16GB입니다. 당신은 모두 거기에 설정되었습니다. 하지만 기다려 !!! innodb_log_file_size는 128M입니까? 16GB 버퍼 풀이 너무 작습니다. ib_logfile 파일의 크기를 조정해야합니다 (innodb_log_file_size를 2047M으로 설정).

스레드별로로드가 발생했을 수 있습니다. 연결 버퍼를 설정하십시오 (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

나에게서 : 왜 MySQL은 내가 메모리 부족이라고 말합니까?

@ DTest에서 : mysql max_connections 변수를 어떻게 계산합니까?

시도 해봐 !!!


그것은 모든 인덱스를 설정하는 것이 전부였습니다 ... 이제 다른 조합으로 이중 인덱스 된 열이 있습니다 ... 35GB의 데이터와 10'000qps가 있습니다 ... 그리고 실크처럼 부드럽게 작동합니다.
Kilian

0
  • MyISAM에서 InnoDB로 일부 테이블을 변환 했습니까?
    그렇다면 http://mysql.rjweb.org/doc.php/myisam2innodb 에서 미묘한 성능 개선 / 성능 저하를 확인 하십시오.
  • innodb_flush_log_at_trx_commit = 1
    - 모든 트랜잭션 후에 로그에 기록 합니다. 사용을 고려하십시오 = 2.
  • max_connections-- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    시작한 후 필요한 수를 알려줍니다.
  • 쿼리 캐시 :

    query_cache_size        = 128M
    query_cache_type        = 1

    다칠 수 있습니다. 위와 50M같이 QC는 유지 보수에 너무 많은 시간을 소비합니다. 그것도 ON낭비가 될 수 있습니다. 수행 SHOW GLOBAL STATUS LIKE 'Qc%'의 효과를 확인 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.