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会每秒产卵并立即摧毁数百名儿童? 这是一个configuration错误,或者Ubuntu 16.04带有错误的php-fpm版本吗?
错误configuration也没有错误的版本。 事实上,没有什么可担心的。
你的进程退出和快速pm.max_requests
是你在php-fpm池configuration文件中使用了pm.max_requests
的默认值,因为它是通过分号注释的;
符号。 要了解pm.max_requests
参数代表什么,您可以阅读从默认configuration中获取的以下说明:
pm.max_requests = int
每个subprocess在重生之前应执行的请求数量。 这可以解决第三方库中的内存泄漏问题。 对于无尽的请求处理指定“0”。 相当于PHP_FCGI_MAX_REQUESTS。 默认值:0。
而你的评论是0。 你可以将它设置为100-500(取决于你的需要),以便让你的php-fpm在处理这些请求之后回收这个过程。
顺便说一句,你应该注意到这些消息在你的日志文件中是唯一的信息,没有什么错,所以你不用担心。 这些日志条目可以通过使用php-fpm.conf
的log_level
参数的warning
值而不是notice
来php-fpm.conf
。 它几乎显示了一切 – 比debug
级别less一点 – 因为默认值被设置为notice
。
采取从默认configuration:
log_level =string
错误日志级别。 可能的值:警报,错误,警告,通知,debugging。 默认值:通知。
祝你好运
这已经发生在我的一个服务器与Ubuntu 14(PHP 5)和16(PHP 7)。 使用较早的版本,有一些延迟,但是对于最新版本,一旦FPM进程提供单个有问题的请求,它就会变得疯狂。
我注意到有问题的请求确实发生了像在https://stackoverflow.com/questions/44400072/php-fpm-forever-respawning-children-when-executing-uglifycss exec
东西,但我仍然不知道如何这应该导致这一点 。 它似乎与在后台执行的东西密切相关(用&
运算符)。
我不能提供一个实际的解决scheme,只是从cron运行我的fugly解决方法脚本:
#!/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
这应该永远不会存在…然而我一直在更新它。 <感叹>