По состоянию на 2019-01-30 14:52 UTC вы все равно можете выиграть 500-балльную награду, потому что ни один из ответов не помог!
На моем веб-сайте Laravel 5.7 возникло несколько проблем, которые, как мне кажется, связаны друг с другом (но происходят в разное время):
-
PDO::prepare(): MySQL server has gone away
-
E_WARNING: Error while sending STMT_PREPARE packet. PID=10
-
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
(Моя база данных часто пытается записать одну и ту же запись дважды в одну и ту же секунду. Мне не удалось выяснить, почему или как ее воспроизвести; это не так) Кажется, это связано с поведением пользователя.) - Каким-то образом эти первые 2 типа ошибок появляются только в моих журналах Rollbar, но не в текстовых журналах на сервере или в моих уведомлениях Slack, как предполагается всем ошибкам (как и все остальные).
В течение многих месяцев я продолжал видеть подобные страшные сообщения в журнале, и я был полностью неспособен воспроизвести эти ошибки (и не смог диагностировать и устранить их).
Я еще не обнаружил каких-либо реальных симптомов и не слышал никаких жалоб от пользователей, но сообщения об ошибках кажутся нетривиальными, поэтому я действительно хочу понять и устранить основные причины.
Я попытался изменить мою конфигурацию MySQL, чтобы использовать max_allowed_packet=300M
(вместо значения по умолчанию 4M), но все еще часто получаю эти исключения в те дни, когда у меня более двух посетителей моего сайта.
Я также установил (изменено с 5М и 10М) следующее из-за этого совета:
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
В качестве дальнейшего фона:
- На моем сайте есть работник очереди, который выполняет задания (
artisan queue:work --sleep=3 --tries=3 --daemon
). - Существует множество заданий в очереди, которые могут быть запланированы на одно и то же время в зависимости от времени регистрации посетителей. Но больше всего я вижу, что произошло одновременно - это 20.
- В журнале медленных запросов MySQL нет записей.
- У меня есть несколько рабочих мест, но я сомневаюсь, что они проблематичны. Один работает каждую минуту, но это действительно просто. Другой запускается каждые 5 минут для отправки определенных запланированных электронных писем, если они ожидаются. А другой запускается каждые 30 минут, чтобы запустить отчет.
- Я выполнял различные запросы
mysqlslap
(хотя я совершенно новичок) и не нашел ничего медленного даже при моделировании сотен одновременно работающих клиентов. - Я использую Ларадок (Докер).
- Мой сервер - DigitalOcean 1 ГБ ОЗУ, 1 vCPU, 25 ГБ SSD. Я также попробовал 2GB RAM без разницы.
- Результаты от
SHOW VARIABLES;
иSHOW GLOBAL STATUS;
здесь
Мой my.cnf
это:
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
max_allowed_packet=300M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow_query_log.log
long_query_time = 10
log_queries_not_using_indexes = 0
Любые идеи о том, что я должен изучить, чтобы диагностировать и исправить эти проблемы? Благодарю.