Доброго времени суток!
После реализации нескольких крупных рассылок (~ 1 млн писем в каждой) дошли руки "причесать" проект и отладить ошибки, которые давно мозолят глаза. В логах ежедневно встречается порядка 500 ошибок:
SQLSTATE[HY000]: General error: 2006 Mysql server has gone away
Все ошибки возникают только во время крупных рассылок. То есть, ошибки сыпят только в случаях, когда в несколько потоков пытаемся делать однотипные запросы для выборки данных в шаблон рассылки. Запросы легчайшие. Сами запросы, на которые возвращается ошибка, логируются - постфактум уже после рассылки выполняются за тысячные доли секунды. В разных рассылках запросы разные, но всегда легкие. При этом, во время рассылки нагрузка на mysql незаметна - многократно проверяли и перепроверяли до кровавых слез все показатели zabbix - по всем критериям сервер с mysql на борту во время рассылки чувствует себя отлично, ни на одном из графиков никаких аномалий и всплесков не наблюдается. По ходу дня в пики посещаемости нагрузка бывает многократно выше, чем во время рассылки, но подобных ошибок не возникает. Админ подтверждает, что к количеству запросов и их сложности у него претензий нет.
Собственно, на данный момент все равно нет ни малейшего представления о причинах возникновения ошибки. Есть цель понять ее природу. Гугл не спас, хотя подобных тем достаточно, в большинстве случаев советы стандартные - увеличить значения переменных max_allowed_packet и wait_timeout. Проверил значения - на мастере и на слейвах ооочень большие значения у этих параметров.
Ах да, еще момент, который вероятно, важен в данном случае - все ошибки высыпают в одну конкретную секунду, хотя сама рассылка длится минут 30. То есть, например, рассылка может работать минут 20, потом в лог падает сразу 100 ошибок в течение секунды, а потом она мирно продолжает работу. На графиках zabbix при этом все ровно.
Хотелось бы понять, можно ли получить больше информации об этой ошибке - узнать, какой именно сценарий вызывает ее возникновение?
PDO обратился к mysql, но не получил ответ? Если да, то как он определил, что ответ не получен? Отвалился по какому-то из тайм-аутов? На connection или wait_timeout?
Возможно ли сделать какое-то подробное профилирование в случае возникновения ошибки?
Буду признателен за ответы, если кто-то уже сталкивался с подобной проблемой. Если забыл какие-то важные нюансы упомянуть - допишу, задавайте вопросы, с удовольствием поделюсь информацией.
P.S. Наверное не стоит обсуждать изменение логики рассылок в данный момент (такая идея есть, но сейчас цель именно научиться понимать природу возникновения ошибки).