fast-je
@fast-je
Пишу на php.

Как исправить ошибку: Too many connections в MySQL?

На проекте в MySQL выскакивает ошибка иногда: Too many connections

Иногда я имею ввиду, думаю это происходит когда идет наплыв онлайна на сайте и кроны у меня которые каждую минуту выполняются, может в совокупности когда еще начинает выполнятся крон резкий скачок запросов и появляется ошибка.
Может пару раз за день такое, было max_connections 100, а потом поменял на 150 перезагрузил сервер и снова повалило куча ошибок, но когда уже дальше работать стал вроде одна вылезла и все, ну типа реже стало.

использую mysqli
создается всегда объект бд для работы, а так закрываю соединение.

public function __destruct()
{
    mysqli_close($this->link);
}


а при запросе соединения показывает практически постоянно 17-18
А вообще диапазон небольшой, 17 -25.

5dd44ce78320c927501890.png

Делаю еще так

Show processlist;

показывает эти 17 подключений, иногда больше и но большая часть из них спит.

Бд у меня около 500мб, на серваке 10гб озу, 8 ядер. Я думаю 150 коннектов для бд это много.
Хотя может и все ок.

Вообщем прошу направить, подсказать.

В чем может быть проблема ?
Может я вообще не так замеряю ? А если неправильно то как ?
  • Вопрос задан
  • 3124 просмотра
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Чаще всего причиной является либо говнокод, либо пконнект.

При переходе с mysql api на mysqli многие не учитывают, что каждое новое обращение к mysqli connect, в отличие от mysql connect, создает новое подключение. И таким обраом из одного и того же скрипта создается множество подключений.

Ну и обязательный карго культ - как только похапист узнает про pconnect, он тут же тащит его к себе в норку, и огребает те самые too many connections.

И это при том, что при 150 одновременных коннектах можно держать 50000 онлайн пользователей спокойно. Всего-то надо выкинуть пконнект, создавать соединение строго 1 раз и оптимизировать запросы.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) Нет смысла руками рвать соединение, при завершении скрипта коннект закроется автоматически. В вашем же случае весьма вероятна ситуация что коннект порвали зря и скрипт еще не отработал до конца.
2) Онлайн порядка 500-1000 чел.Для запаса я бы поднял количество соединений до 1/4 онлайна. Зависит конечно от специфики сайта, но иногда их реально не хватает если сервер с активным взаимодействием с бэкендом.
3) Для драйвера бд пишется враппер, не по тому что это модно или прям необходимо для работы, а как раз на такие случаи, в логику врапера пишется опциональное логирование запросов и сразу видно "кто где срал", сколько реально запросов бегает и что вообще происходит. Тогда можно что-то решать на уровне много/мало и куда что крутить. В частности, может оказаться что коннект происходит чаще чем вы думаете и вовсе не там где задумывалось...
Ответ написан
@vitaly_il1
DevOps Consulting
По-моему, вы начали не с того.
connections - вещь довольно "дешевая" и не проблема увеличить лимит connections.
Смотреть надо на другие метрики - slow queries и IO, плюс активизировать/оптимизировать cache.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы