PHP-FPM ondemand: количество активных детей достигает max_children, затем PHP перестает работать

PHP-FPM ondemand: количество активных детей достигает max_children, затем PHP перестает работать

На моем сервере работает 10 сайтов, очень низкий трафик. Конфигурация:

  • Ubuntu 20.04.5 LTS
  • Nginx 1.18.0 (Убунту)
  • PHP7.4.3

Вnginx.confэто добавлено:

        upstream local_php {
                server unix:/run/php/php7.4-fpm.sock;
        }

Всайты с поддержкойФайлы конфигурации имеют следующие расположения:

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass local_php;
                fastcgi_buffers 16 16k;
                fastcgi_buffer_size 32k;
        }

Мой/etc/php/7.4/fpm/pool.d/www.confимеет:

pm = ondemand
pm.max_children = 15
pm.max_requests = 10

Теперь происходит следующее: мои сайты работают нормально, но файл журнала php показывает, что количество активных потомков неуклонно растет. Примерно через день оно достигает 15, а затем PHP перестает работать. Если посмотреть на список процессов, то можно увидеть потомков всех «возрастов», которые, похоже, просто живут без цели. В файле журнала PHP нет никаких предупреждений, только одно, когда max_childrenдостигается:

WARNING: pid 75057, fpm_pctl_on_socket_accept(), line 518: [pool www] server reached max_children setting (15), consider raising it

Я пытался настроить параметры PHP. С pm = dynamicmax_children достигаются намного быстрее. max_requestsсначала было выше, но его понижение не дало существенного результата. У меня достаточно ресурсов для max_childrenнебольшого увеличения, но это только отсрочит проблему, а не решит ее.

Обратите внимание, что у моего сервера нет проблем с загрузкой. Использование памяти никогда не превышает 35%, а загрузка ЦП стабильно составляет 5%.

Наверное, я делаю что-то не так, потому что, по-моему, детей в какой-то момент должны убить, не так ли?В журнале PHP говорится, что дети уничтожаются, но это всегда уменьшает количество запасных детей, даже активных детей:

DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 2 spare children
DEBUG: pid 232350, fpm_got_signal(), line 82: received SIGCHLD
DEBUG: pid 232350, fpm_event_loop(), line 435: event module triggered 1 events
DEBUG: pid 232350, fpm_children_bury(), line 261: [pool www] child 289966 has been killed by the process management after 12.069386 seconds from start
DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 1 spare children
DEBUG: pid 232350, fpm_got_signal(), line 82: received SIGCHLD
DEBUG: pid 232350, fpm_event_loop(), line 435: event module triggered 1 events
DEBUG: pid 232350, fpm_children_bury(), line 261: [pool www] child 289969 has been killed by the process management after 12.665847 seconds from start
DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 0 spare children

Типичный список процессов с количеством детей до 15:

1390 vps@vps9029:/etc/php/7.4/fpm/pool.d $ ps -elf|grep php
4 S root    15528   15439  0  80   0 -  2397 -      Dec20 pts/1 00:00:00 sudo tail -f php7.4-fpm.log
4 S root    15537   15528  0  80   0 -  1378 -      Dec20 pts/1 00:00:12 tail -f php7.4-fpm.log
4 S root    75057       1  0  80   0 - 59077 -      Dec21 ?     00:00:26 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
5 S www-data   94817   75057  0  80   0 - 84357 -   Dec21 ?     00:00:00 php-fpm: pool www
5 S www-data  104885   75057  0  80   0 - 84302 -   Dec21 ?     00:00:00 php-fpm: pool www
5 S www-data  125566   75057  0  80   0 - 66282 -   Dec21 ?     00:00:01 php-fpm: pool www
5 S www-data  143879   75057  0  80   0 - 65617 -   02:47 ?     00:00:00 php-fpm: pool www
5 S www-data  149198   75057  0  80   0 - 84441 -   03:56 ?     00:00:00 php-fpm: pool www
5 S www-data  149632   75057  0  80   0 - 84582 -   04:02 ?     00:00:08 php-fpm: pool www
5 S www-data  152959   75057  0  80   0 - 84515 -   04:43 ?     00:00:01 php-fpm: pool www
5 S www-data  178687   75057  0  80   0 - 65673 -   09:53 ?     00:00:00 php-fpm: pool www
5 S www-data  182987   75057  0  80   0 - 84178 -   10:46 ?     00:00:00 php-fpm: pool www
5 S www-data  187712   75057  0  80   0 - 84178 -   11:44 ?     00:00:00 php-fpm: pool www
5 S www-data  187713   75057  0  80   0 - 84178 -   11:44 ?     00:00:00 php-fpm: pool www
5 S www-data  197529   75057  0  80   0 - 84386 -   13:59 ?     00:00:00 php-fpm: pool www
5 S www-data  210404   75057  0  80   0 - 65569 -   16:48 ?     00:00:00 php-fpm: pool www
5 S www-data  213858   75057  0  80   0 - 65633 -   17:29 ?     00:00:00 php-fpm: pool www
5 S www-data  214975   75057  0  80   0 - 85465 -   17:44 ?     00:00:00 php-fpm: pool www

решение1

Причина — медленные запросы с одного из установленных сайтов.

Есть довольно много настроек FPM/NGINX, которые управляют жизнью дочерних процессов. Вот мои настройки сейчас, и они, кажется, позволяют контролировать дочерние процессы:

В /etc/php/7.4/fpm/pool.d/www.conf:

pm = ondemand
pm.max_requests = 10
pm.max_children = 15
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s
  • request_terminate_timeout_track_finished = да

В /etc/php/7.4/fpm/php.ini:

max_execution_time = 30
default_socket_timeout = 60

В /etc/nginx/nginx.conf:

keepalive_timeout 55;
fastcgi_read_timeout 60;

Связанный контент