Короткая: Мы достигаем максимального количества подключений и видим очень низкую производительность MySQL в часы пиковой работы и не можем определить, является ли это проблемой загрузки или проблемой конфигурации.
Долго: Для начала, вот наши спецификации сервера, размещенного в Digital Ocean:
Ядра: 20
Объем памяти:
всего использованного свободного общего буфера / доступного кеша Mem: 62 ГБ 48 ГБ 4,7 ГБ 216 МБ 10 ГБ 14 ГБ
Снимок панели управления MySQL WorkBench:
Панель инструментов MySQL Workbench
Обычно у нас есть более 200 записей в списке процессов, почти все из которых являются «открывающими таблицами», «закрывающими таблицами» и, что немного реже, «очисткой». В записях очистки есть КОМАНДА killed
и NULL
ИНФОРМАЦИЯ (SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
). Единственные запросы, которые, как мы видим, занимают очень много времени, - это некоторые INSERTS в таблицы с интенсивным использованием и команды UPDATE с первичным ключом в WHERE для таблиц с тяжелым us. Их состояние - «обновление» в списке процессов.
Настройки MySQL .cnf:
key_buffer_size=1G
myisam_sort_buffer_size=1073741824
max_length_for_sort_data=8388608
max_sort_length=8388608
sort_buffer_size=1073741824
join_buffer_size=1073741824
preload_buffer_size=1073741824
read_buffer_size=1073741824
read_rnd_buffer_size=1073741824
thread_cache_size=450
max_allowed_packet=100M
max_connections=400
lock_wait_timeout=50
wait_timeout=120
table_open_cache_instances=10
table_open_cache=6000
table_definition_cache=6000
innodb_flush_method=O_DIRECT
innodb_buffer_pool_size=46G
innodb_buffer_pool_instances=46
У нас есть более 800 баз данных на нашем единственном действующем сервере, и многие тысячи пользователей используют приложение, которое делает частые запросы к серверу с множеством отдельных обновлений или вставок, которые необходимо синхронизировать с несколькими пользователями.
Вопрос:
Учитывая настройки .cnf и спецификации нашего сервера в отношении снимка панели управления MySQL WorkBench, должны ли мы испытывать такое же замедление / соединение, которое мы наблюдаем с этой конфигурацией? Мы постоянно увеличиваем максимальное количество подключений и получаем SQLSTATE[HY000] [2002] Resource temporarily unavailable
ошибки в PHP из PDO.
Есть ли у кого-нибудь предложения по повышению производительности? Различные настройки конфигурации? Мы знаем долгосрочные решения, например, размещение крупных клиентов на отдельных серверах, но есть ли способ оптимизировать наш сервер в краткосрочной перспективе? Наше приложение и веб-сайт практически недоступны в часы пик.
Дополнительная статистика:
Linux 4.0.4-301.fc22.x86_64 25.04.2016 _x86_64_ (20 ЦП)
avg-cpu:% user% nice% system% iowait% steal% idle
8,51 0,01 0,67 0,28 0,35 90,18
Устройство: tps kB_read / s kB_wrtn / s kB_read kB_wrtn vda
269,78 1681,90 2180,52 37679232421 48849706700
Мои деньги идут на "конфигурацию" - но, вероятно, все наоборот ... Я подозреваю, что вы настроили слишком много.
Мне кажется, вы «настраивали» производительность своего сервера. прямо в землю.
Если вы использовали скрипт «настройки» - прекратите это делать.
Например... table_definition_cache=6000
и table_open_cache=6000
... каково этому оправдание?
Большинство параметров, которые вы настроили не по умолчанию, кажутся догадками.
Если вы не проверили каждый этих настроек, индивидуально, до и после того, как вы их сделали, индивидуально ... ну, вы, наверное, видите, к чему я иду ... они, вероятно, неоправданны, и вам, вероятно, будет лучше без них. Больше не всегда лучше. Чем больше, тем сложнее жонглировать.
Я бы ожидал хороших вещей, если бы вы просто закомментировали почти все этих настроек, кроме innodb_*
и позволить серверу работать с большим количеством параметров при их значениях по умолчанию.