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バージョンが付属していますか?
設定ミスやバグのあるバージョンではありません。実際、心配することは何もありません。
プロセスが高速で終了して再生成されるのは、セミコロンpm.max_requests
記号でコメント化されているため、php-fpmプール構成ファイルで;
のデフォルト値を使用しているためです。 pm.max_requests
パラメータの意味を理解するには、デフォルト構成から取られた次の説明を読むことができます。
pm.max_requests = int
各子プロセスが再生成する前に実行する必要のあるリクエストの数。これは、サードパーティライブラリのメモリリークを回避するのに役立ちます。無限のリクエスト処理の場合は「0」を指定します。 PHP_FCGI_MAX_REQUESTSと同等です。デフォルト値:0。
そして、コメントされているのであなたは0です。 php-fpmがその量のリクエストを処理した後にプロセスをリサイクルするように、それを100-500(必要に応じて)のようなものに設定できます。
ちなみに、ログファイル内のこれらのメッセージは情報を提供するだけのものであり、何も問題がないので、心配しないでください。これらのログエントリは、log_level
のphp-fpm.conf
パラメータにwarning
ではなくnotice
の値を使用することで回避できます。デフォルト値はdebug
に設定されているため、ほぼすべてが表示されています-notice
レベルより少し小さいです。
デフォルト構成から取得:
log_level =文字列
エラーログレベル。可能な値:アラート、エラー、警告、通知、デバッグ。デフォルト値:通知。
幸運を
これは、Ubuntu 14(PHP 5)および16(PHP 7)を搭載したサーバーの1つで発生しています。以前のバージョンでは多少の遅延がありましたが、最新バージョンでは、FPMプロセスによって1つの問題のあるリクエストが処理されるとすぐに、それが乱暴になります。
問題のある種類のリクエストがexec
に発生することに気づきました https://stackoverflow.com/questions/44400072/php-fpm-forever-respawning-children-when-executing- uglifycss ですが、thisがどのように発生するかはまだわかりません。バックグラウンドでの実行と密接に相関しているようです(&
演算子)。
私は実際の解決策を提供することはできません。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
これは存在すべきではありませんでした...それでも私は時間をかけてそれを更新してきました。 <ため息>