почему возникает php-fpm и уничтожение сотен потомков в секунду без нагрузки на сервер?

php7.0-fpm.log показывает, что сотни дочерних элементов создаются в секунду. , а затем немедленно уничтожается. Это происходит без перерыва. Журнал выглядит так:

[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4980 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4978 exited with code 0 after 0.014658 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4981 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4980 exited with code 0 after 0.014354 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4982 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4979 exited with code 0 after 0.015170 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4983 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4981 exited with code 0 after 0.014709 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4984 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4982 exited with code 0 after 0.014741 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4985 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4983 exited with code 0 after 0.014727 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4986 started

Настройки из /etc/php/7.0/fpm/php-fpm.conf :

pid = /run/php/php7.0-fpm.pid
error_log = /var/log/php7.0-fpm.log
include=/etc/php/7.0/fpm/pool.d/*.conf

Настройки из /etc/php/7.0/fpm/pool .d / www.conf :

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/phperrors.log
php_admin_flag[log_errors] = on

Все остальные строки закомментированы ; (настройки по умолчанию). Это Ubuntu 16.04 с пакетами по умолчанию. Версии PHP и Nginx следующие:

php-fpm7.0 -v
PHP 7.0.13-0ubuntu0.16.04.1 (fpm-fcgi)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies

nginx -v
nginx version: nginx/1.10.0 (Ubuntu)

Никакой настройки не производилось (кроме включения ведения журнала). Этот сервер еще не развернут в производстве, поэтому пользовательская нагрузка отсутствует.

Почему php-fpm порождается и немедленно уничтожает сотни дочерних элементов в секунду? Это неправильная конфигурация, или Ubuntu 16.04 поставляется с ошибочной версией php-fpm?

4
задан 9 March 2017 в 10:21
2 ответа

Ни неправильная конфигурация, ни багги-версия. На самом деле, не о чем беспокоиться.

Причина, по которой ваши процессы так быстро выходят и перезапускаются, заключается в том, что вы используете значение по умолчанию для pm.max_requests в вашем конфигурационном файле пула php-fpm, так как оно закомментировано через полуколонну ; символ. Чтобы понять, что такое pm.Параметр max_requests означает, что вы можете прочитать следующее описание, взятое из конфигурации по умолчанию:

pm.max_requests = int

Количество запросов, которые каждый процесс-потомок должен выполнить перед передышкой. Это может быть полезно для работы с памятью утечки в сторонних библиотеках. Для бесконечной обработки запроса укажите '0'. Эквивалент PHP_FCGI_MAX_REQUESTS. Значение по умолчанию: 0.

А ваше - 0, так как оно закомментировано. Вы можете установить его в 100-500 (в зависимости от ваших потребностей), чтобы ваш php-fpm перерабатывал процесс после обработки такого количества запросов.

Кстати, обратите внимание, что эти сообщения в вашем лог-файле только информационные, и ничего страшного в этом нет, так что не волнуйтесь. Этих записей в лог можно избежать, используя значение warning вместо notice для параметра log_level в php-fpm.conf. Он показывает практически всё - чуть меньше уровня debug - так как значение по умолчанию установлено на notice.

Взято из конфигурации по умолчанию:

log_level = string

Error log level. Возможные значения: предупреждение, ошибка, предупреждение, уведомление, отладка. Значение по умолчанию: notice.

Good Luck

6
ответ дан 3 December 2019 в 03:05

Это происходило на одном из моих серверов с Ubuntu 14 (PHP 5) и 16 (PHP 7). В более ранней версии была некоторая задержка, но в последней версии, как только процесс FPM обслуживает один проблемный запрос, он становится безумным.

Я заметил, что проблемные запросы действительно случаются с exec такие же вещи, как в вызвать это . Похоже, что это тесно связано с выполнением чего-то в фоновом режиме (с оператором & ).

Я не могу предложить реальное решение, просто мой сценарий временного обхода, который запускается из cron:

#!/bin/sh -e

v=${1:-7.0}
poolname=${2:-www}

# requires Restart=always and KillMode=process in /lib/systemd/system/php7.0-fpm.service!
retire_fpm() {
  logger -p user.crit -t $0 "$(sudo pkill -e php$v-fpm || sudo pkill -e php-fpm$v || echo "aiee, could not find php fpm version $v to retire" >&2)"
}

if sudo initctl version 2>/dev/null; then # upstart
  logdir=/var/log
  logfile=$logdir/upstart/php$v-fpm.log
else
  logdir=/var/log
  logfile=$logdir/php$v-fpm.log
fi

logfile_huge=$(test -e $logfile && find $logfile -size +200M || true)
if [ -n "$logfile_huge" ]; then
  logger -p user.crit -t $0 "demolishing $logfile to prevent the partition from filling up"
  cp /dev/null $logfile
fi

rotated_logfile_huge=$(test -e $logfile.1 && find $logfile.1 -size +200M || true)
if [ -n "$rotated_logfile_huge" ]; then
  logger -p user.crit -t $0 "demolishing $logfile.1 to prevent the partition from filling up"
  cp /dev/null $logfile.1
fi

if [ ! -e $logfile ]; then
  if ! df -P $logdir/ | awk '/^\// && $5+0 > 50 { exit(1) }'; then
    logger -p user.crit -t $0 "initiating php$v-fpm termination (init will restart it) because there is no $logfile yet the partition is filling up"
  else
    logger -p user.crit -t $0 "initiating php$v-fpm termination (init will restart it) because there is no $logfile, something went awry"
  fi
  retire_fpm
  exit
fi

logfile_grew=$(find $logfile -size +5M || true)

if [ -z "$logfile_grew" ]; then
  exit 0
fi

# 5 lines: handle recovery: one started line, one exited line, three post-signal lines
recent_fast_respawns=$(tail -5 $logfile | egrep -c ' NOTICE: .pool '$poolname'. child .+ exited with code 0 after 0....... seconds from start')

if [ "$recent_fast_respawns" -le 1 ]; then
  logger -p user.notice -t $0 "php$v-fpm log $logfile indicates a lot of recent activity, but only $recent_fast_respawns recent fast respawns, leaving it be"
  exit 0
fi

logger -p user.crit -t $0 "initiating php$v-fpm termination (init will restart it) because $logfile indicates $recent_fast_respawns recent fast respawns"
retire_fpm

Этого никогда не должно было существовать ... и все же я постоянно обновлял его. <вздох>

0
ответ дан 3 December 2019 в 03:05

Теги

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