MySQL не справляется с нагрузкой от веб-приложения, нужны логи для дальнейшего разбора
Приветствую!
Я являюсь одним из разработчиков некоего программного комплекса (PHP), использующего для нужд хранения информации базу данных MySQL. В прошлое воскресенье, при выполнении довольно сложных запланированных задач, MySQL с трудом выдержала нагрузки, сопровождаемые большим количеством таймаутов ожидания блокировки (Lock wait timeout exceeded; try restarting transaction) и огромным количеством простых запросов, ожидающих своей очереди в InnoDB queue уже как около 3-х (!) часов.
Вопрос заключается в следующем: через небольшой промежуток времени, а именно уже в эти выходные, будут выполнятся подобные по объему и сложности задачи. Есть необходимость подготовиться, чтобы либо на месте понять причину блокировок и найти просчеты архитектуры, либо (приоритетнее) получить максимальное количество полезной информации для дальнейшего разбора, например: состояние блокировок в определенное время, запросы, блокирующие таблицы, запросы, которые так и не получили возможность выполниться из-за блокировки. Одного лога медленных запросов будет не достаточно. Какими инструментами можно собрать подобную информацию?
Возможно, кто-либо уже сталкивался с подобными проблемами и имеет представление, как их решать?
Однозначно вам надо было бы выложить свой my.cnf
и параметры сервера mysql
а также включить mysql slow query log и выложить его сюда.
Советы ставь перкону тут больше от лукавого чем в помощь.
Производительность выросла в несколько раз, до этого были жуткие тормоза на большом количестве одновременных запросов, а с таблицами в несколько сот тысяч строк вообще еле-еле ворочался. Сейчас все летает. В принципе, достаточно несколько директив в my.cnf добавить.
У меня для таких целей был скриптик, работающий в фоне: раз в 5 секунд считает количество активных тредов MySQL, и если кол-во запросов больше N, то он дампит исполняющиеся запросы в лог-файл.
Именно таким способом были выявлены основные блокирующие запросы.
Для FreeBSD, запускался через screen:
#!/bin/sh
HOSTNAME=`hostname -s`
DIR="/var/log/mlog.$HOSTNAME"
pass='testpass'
while :
do
threads=`mysql -uroot -p$pass -B -e "show status"|grep ^Threads_running|cut -f 2`
# если тредов больше 60, пишем в лог:
if [ "$threads" -gt 60 ] ; then
{
mysqladmin -uroot -p$pass processlist --verbose |grep -v Sleep|sed 's| ||g'
iostat -dNx 2 2
} |gzip > "$DIR/`date "+%Y-%m-%d_%H:%M:%S"`.list.gz"
fi
sleep 5
done
именно техническая установка — да, вполне возможно, что полчаса. принятие решения, оценка рисков и прочие подготовительные формальности — заметно больше времени.
Кроме my.cnf было бы полезно ещё указать конфигурацию сервера (минимально — сколько памяти и cpu) и посмотреть «top» в момент нагрузки.
У меня было похожее когда нагрузка стала вырастать на сервере. Настраивал постепенно через my.cnf и добавлением памяти.
Тут нашёл достаточно много интересных советов и идей: www.mysqlperformanceblog.com/
Почитайте статейки по работе MySQL.
Если у Вас настройки сервера те которые по-умолчанию то, рекомендую их исправить на правильные — в сети есть информация, как правильно настроить InnoBD конф-ю для максимального роста производительности сервера.
Также для MySQL нужно быстрое «железо».
Вам с первых ответов рекомендуют ставить Percona, но уверяю Вас не стоит прибегать к Percona,MySQL InnoBD уже подрос и не плох, как были предыдущие версии.
Вообщем начните с этого, а потом посмотрите логи.удачи.