Почему падает php7-fpm при повышенной нагрузке на MariaDB?
Добрый день. Есть сервер - 2 ядра, 8Гб ОЗУ. На нем приложение на php, СУБД - MariaDB.
Так вот если в БД прилетает злой запрос, то PHP7.1-fpm отказывает в обслуживании и получаю заветные 502 от nginx. Помогает рестарт php-fpm. В логах ничего, серьезно.
Например падает при следующих условиях:
CPU: 80%, IO На диск 70%, RAM - 30% свободно. В своп система не уходит и все остальные сервисы работают полноценно и отзывчиво.
Размер БД - 40Гб.
Спасибо.
Может быть max_execution_time слишком велик и попросту пул процессов фпм заканчивается на таких злых запросах? Плюс, возможно у фпм установлена политика со статичным пулом.
В логах постоянно ругается только на WARNING: [pool www] server reached pm.max_children setting (5), consider raising it.
Когда БД нагружена, процессы php-fpm висят, не умирают, но и не обслуживают. В логи ничего не пишут.
Дмитрий, я вот что думаю. злой запрос настолько злой, что блокируется существенная часть бд на его выполнение, поэтому при установлении соединений от фпм они просто ожидают окончания блокировки. По статистике видно, что есть высокая нагрузка на дисковый io, получается база там какие-то конкретные непотребства выотряет. Возможно есть какой то способ базу поинспектировать, поведение совсем не здоровое, она как минимум всякие слоу и транзакционные логи заваливать должна.
JimmDiGreez, частично верно. Но опять пример:
Делает Битрикс в базе какой-нить DELETE злой, PHP-FPM не обслуживает. Делаю `systemctl restart php7.1-fpm` и секунд 5 все работает отлично, после чего падает. Можно это списать на то, что прерывается выполнение php скрипта, который плющит базу, но нет, это не так.
Опять же, при mysqldump, php намертво падает и nginx говорит, что не может передать на .соккет PHP-FPM'а. Обычно когда даже система жутко занята, ушла в своп или LA выше крыши, то оно пытается выполниться, а здесь эффект как будто сервис PHP-FPM просто остановлен.
Дмитрий, ну, почему же. fpm, вроде как, не падает. Просто процессы висят, вероятно на коннектах к бд. Пул, как я вижу, позволяет лишь 5 доп процессов, поэтому они быстро кончаются и там уже начинается ругань, мол фпм не работает. Но расширять пул, конечно, не вариант в данном случае. Думаю тут дело в базе, она либо блокируется сама, либо блокирует какие-то важные таблицы и не отпускает. Как себя чувствует база во время выполнения этих запросов? Можно ли к ней подключиться через стандартный клиент например и погонять запросики по таблицам, проверяя, нет ли чего-то зависшего?
Либо падение происходит потому что параметр idle_timeout по умолчанию 30 секунд и их не хватает, либо превышен лимит дочерних процессов у FAST CGI. Можно увеличить лимиты memory_limit и max_execution_time, read_buffer time в конфиге Марии. Не уверен, что это сильно поможет. Лучше проставьте индексы в БД, чтобы злые запросы стали добрее и укладывались в таймауты.