у меня запущено приложение на фейсбуке, которое в настоящее время насчитывает 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
источник
skip-name-resolve
отключено и можно ли его включить?Ответы:
Я написал несколько постов в StackExchnage
Пожалуйста, прочитайте их для руководства, которое вам нужно.
Теперь о более насущных проблемах: вы упомянули, что у вас есть 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?
Попробуйте!
источник
Если это так, проверьте тонкие улучшения / снижения производительности в http://mysql.rjweb.org/doc.php/myisam2innodb
innodb_flush_log_at_trx_commit = 1
- вызывает запись в журнал после каждой транзакции. Подумайте об использовании
= 2
.max_connections
-SHOW GLOBAL STATUS LIKE 'max_used_connections'
- это покажет вам , сколько вам нужно с момента запуска.
кеш запросов:
Это может быть больно. Выше, скажем,
50M
КК тратит слишком много времени на обслуживание. Иметь этоON
тоже может быть расточительным. Делать,SHOW GLOBAL STATUS LIKE 'Qc%'
чтобы проверить эффективность.источник