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 более полезен в других средах.