Конфигурация MySQL 5.1 InnoDB / 24 ГБ ОЗУ - высокая загрузка bi-xeon

10

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

Теперь я сталкиваюсь с проблемой, что производительность хуже, чем на «меньшей коробке». На обоих серверах я использовал nginx / php fcgi для обслуживания контента.

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

Я бы обожал каждого, кто мог бы дать мне подсказку, что нужно изменить, чтобы он работал более плавно.

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

старый 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

Новая конфигурация на коробке 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

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
Kilian
источник
Хм, skip-name-resolveотключено и можно ли его включить?
Wrikken

Ответы:

7

Я написал несколько постов в StackExchnage

  1. Настройка MySQL для InnoDB и MyISAM
  2. Как держать InnoDB Diskspace под контролем
  3. Еще одна точка зрения на MySQL Diskspace Managament
  4. Точка зрения на оптимизацию InnoDB
  5. InnoDB Fine Tuning

Пожалуйста, прочитайте их для руководства, которое вам нужно.

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

Попробуйте!

RolandoMySQLDBA
источник
это было все о настройке некоторых индексов ... теперь у меня есть несколько столбцов, которые дважды индексируются в других комбинациях ... и у меня сейчас 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
    

    Это может быть больно. Выше, скажем, 50MКК тратит слишком много времени на обслуживание. Иметь это ONтоже может быть расточительным. Делать, SHOW GLOBAL STATUS LIKE 'Qc%'чтобы проверить эффективность.

Рик Джеймс
источник