Конфігурація MySQL 5.1 InnoDB / 24 Гб оперативної пам’яті - високе навантаження біксексеном


10

Я запускаю програму facebook, яка наразі має 300 - 600 одночасних користувачів (і зростає). Щоб підготувати апаратне забезпечення до зростання, я змінив свій i7 / 12gb ram / 2x 80gb intel x25 ssd (debian 5.0 / mysql 5.0 / 64bit) на бі-xeon / 24gb ram / 2x 120gb intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 біт).

тепер я стикаюся з проблемою, що продуктивність гірша, ніж на "меншій коробці". На обох серверах я використовував nginx / php fcgi для обслуговування вмісту.

Я використовую тільки innodb, маючи приблизно 65% / 35%. Близько 800 - 1000 к / с, але всі запити прості і ніколи не приєднуються до більше 1 додаткової таблиці. Всі індекси встановлені, і жоден окремий запит не записується у повільний журнал (> 2s). На даний момент у мене є близько 400 Мб даних (близько 1 Гбіт з індексами), очікуючи, що вони подвоюються щомісяця.

Я б обожнював усіх, хто міг би дати нам підказку, що потрібно змінити, щоб зробити це більш гладко.

Стара конфігурація в i7 box виглядала така (змішаний myisam / innodb), досить хороша для 800+ користувачів.

старий мій.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

Нова конфігурація у вікні bi-xeon така (чистий innodb), викликаючи велике навантаження з 300+ користувачами. Близько 30 mysql-процесів, що знаходяться вгорі списку процесів.

Введення / виведення диска:

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

мій.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. Налаштування MySQL для InnoDB та MyISAM
  2. Як тримати InnoDB Diskspace під контролем
  3. Ще одна точка зору на MySQL Diskpace Managament
  4. Точка зору на оптимізацію InnoDB
  5. Тонка настройка InnoDB

Будь ласка, прочитайте їх для необхідних рекомендацій.

Тепер для більш нагальних питань: Ви згадали, що у вас є 400 МБ даних, 1 ГБ з індексами. Такий вид мене лякає, що ваші індекси на 50% більше, ніж дані. Однак, оскільки всі ваші дані є InnoDB і вас влаштовує поточна ефективність запиту, ваші налаштування більш ніж адекватні, особливо 16384 Мб innodb_buffer_pool_size. Це 16 Гб. Ви все там налаштовані. Але зачекайте !!! Ваш innodb_log_file_size дорівнює 128 М? Занадто малий з урахуванням буферного пулу 16 ГБ. Вам слід змінити розмір файлів 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?

Спробувати !!!


все було про встановлення деяких індексів ... тепер у мене є кілька стовпців, які подвійно індексуються в інших комбінаціях ... і у мене зараз 35 ГБ даних і 10'000qps ..., і він працює гладко, як шовк.
Кіліан

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

    Це може бути боляче. Вище, скажімо, 50MQC витрачає занадто багато часу на обслуговування. Маючи це, ONможе бути і марно. Зробіть, SHOW GLOBAL STATUS LIKE 'Qc%'щоб перевірити ефективність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.