Отладка MySQLs "слишком много соединений" - PullRequest
1 голос
/ 14 июля 2009

Я пытаюсь отладить ошибку, полученную на рабочем сервере. Иногда MySQL сдается, и мое веб-приложение не может подключиться к базе данных (я получаю ошибку «слишком много подключений»). Сервер посещает несколько тысяч человек в день, а ночью я выполняю несколько заданий cron, которые иногда выполняют тяжелую работу MySQL (перебирая 50 000 строк, вставляя и удаляя дубликаты и т.д.)

  • Сервер запускает apache и mysql на одной машине
  • MySQL имеет довольно стандартную конфигурацию (максимальное количество подключений)
  • Веб-приложение использует PHP

Как мне отладить эту проблему? Какие файлы журнала мне следует прочитать? Как мне найти «злой» сценарий? Странно то, что если я перезагружаю сервер MySQL, он снова начинает работать.

Редактировать:

  • Различные приложения / скрипты используют разные коннекторы для своей базы данных (в основном это mysqli, но также и Zend_Db)

Ответы [ 4 ]

2 голосов
/ 14 июля 2009

Это не обязательно длительный запрос SQL.

Если вы откроете соединение в начале страницы, оно не будет выпущено до тех пор, пока не завершится PHP-сценарий, даже если не выполняется ни один запрос.

Вы должны добавить некоторые статистические данные на свои страницы, чтобы найти самые медленные и наиболее посещаемые. Раннее закрытие соединения поможет, если это возможно.

2 голосов
/ 14 июля 2009

Попробуйте использовать постоянные соединения (mysql_pconnect), это поможет снизить нагрузку на сервер, вызванную постоянным открытием и закрытием соединений MySQL.

2 голосов
/ 14 июля 2009

Во-первых, используйте innotop (Google для него), чтобы отслеживать ваши соединения. В основном он ориентирован на статистику InnoDB, но он может ставить для показа всех соединений, в том числе не входящих в транзакцию.

В противном случае полезно следующее: используйте постоянные соединения / пулы соединений в своих веб-приложениях. Увеличьте ваши максимальные соединения.

0 голосов
/ 14 июля 2009

Начальной точкой, вероятно, является использование mysqladmin processlist для получения списка процессов на сервере MySQL. Следующий шаг зависит от того, что вы найдете.

...