Php получает слишком много ошибок соединения с MySQL

Я использую MySQL и PHP с 2 серверами приложений и 1 сервером базы данных. С увеличением количества пользователей (около 1000 к настоящему времени) я получаю следующую ошибку:

SQLSTATE[08004] [1040] Too many connections

Параметр max_connections установлен в 1000 в my.cnf а также mysql.max_persistent установлен в -1 в php.ini,

С момента запуска MaxClients Параметр apache равен 750 и у нас есть 2 сервера приложений.

  • Должен ли я поднять max_connections до 1500, как указано здесь?
  • Или я должен установить mysql.max_persistent до 750 (мы используем PDO с постоянными соединениями по соображениям производительности, поскольку сервер баз данных не совпадает с серверами приложений)?
  • Или я должен попробовать что-то еще?

Заранее спасибо!

2 ответа

Я думаю, что ваши соединения не закрываются достаточно быстро, и они складываются, пока не истечет время по умолчанию. У меня была такая же проблема, и с wait_timeout я все решил.

Вы можете попробовать настроить в my.cnf

set-variable = max_connections=1000 // max connection
set-variable = max_user_connections=100 // max user connection per hour
wait_timeout = 60 // wait timeout for connection in seconds

как прервет все существующие соединения через 60 секунд

Я думаю, что вы должны проверить код PHP, если вы можете избавиться от постоянных соединений.

Проблема с постоянными соединениями заключается в том, что экземпляр php сохраняет их открытыми даже после выхода из скрипта, пока данные не будут отправлены клиенту, а экземпляр php освобожден для следующего клиента.

Другая проблема с постоянными соединениями заключается в том, что некоторый код PHP может оставить сокет с другими настройками, чем при запуске, с другими языковыми стандартами или с временными таблицами.

Если вы можете переписать код, в котором для каждого соединения имеется только один или несколько mysql_connects, а дескриптор базы данных передается в разные части кода или хранится в GLOBAL, влияние потери производительности на постоянные соединения будет незначительным.

И, конечно, нет ничего плохого в удвоении max_connections. В любом случае, с PHP это не очень полезно, так как PHP/Apache потом выходит довольно часто и закрывает дескрипторы. Max_connections более полезен в других средах.

Другие вопросы по тегам