aaLiweipeng 2019-04-29
背景和初步排查
1是error log 丢日志了
2是程序执行过程中操作完sendPresent后down掉了,导致没写入mongo
-第一个情况工作多年的经验来看应该不至于,那就先根据第二种情况继续查吧
[[email protected]~]$ grep "2017 05:28" /var/log/php-fpm.log [25-Jun-2017 05:28:01] NOTICE: Terminating ...
跟订单时间刚好吻合,那肯定有必要研究下了
熟悉下 php-fpm 的管理
php-fpm 是通过 php-fpm这个命令进行管理的,我们先看下这个命令
man php-fpm
这里有提到,php-fpm then responds to several POSIX signals php-fpm 会对下面几个信号作(自己的)处理
动手验证下
sudo kill -QUIT {php-fpm-pid}
[26-Jun-2017 13:58:22] NOTICE: Finishing ... [26-Jun-2017 13:58:22] NOTICE: exiting, bye-bye!
sudo kill -TERM {php-fpm-pid}
[26-Jun-2017 13:59:21] NOTICE: Terminating ... [26-Jun-2017 13:59:21] NOTICE: exiting, bye-bye!
sudo kill -USR2 12583
[26-Jun-2017 14:00:48] NOTICE: Reloading in progress ... [26-Jun-2017 14:00:48] NOTICE: reloading: execvp("/usr/sbin/php-fpm", {"/usr/sbin/php-fpm", "--daemonize"}) [26-Jun-2017 14:00:48] NOTICE: using inherited socket fd=8, "10.30.60.87:9000" [26-Jun-2017 14:00:48] NOTICE: using inherited socket fd=8, "10.30.60.87:9000" [26-Jun-2017 14:00:48] NOTICE: fpm is running, pid 12696 [26-Jun-2017 14:00:48] NOTICE: ready to handle connections
从验证结果推断
在 05:28:01这个时间有人给php-fpm 发送了SIGTERM信号,在这个点发生很可能是个定时任务, 确认果然是这样 28 5 * * * root /etc/init.d/php-fpm restart> /dev/null
我们的 php-fpm 管理
killproc -p ${pidfile} php-fpm
, 显然从日志结果来个是kill -TERM . 文档里也说了默认信号就是TERMkillproc sends signals to all processes that use the specified executable. If no signal name is specified, the signal SIGTERM is sent.看下这个情况下nginx的反应
总结原因
替代方案
killproc -p ${pidfile} php-fpm
这句 改成 killproc -p ${pidfile} php-fpm -QUIT
与sa 的问答
sa 说了3点意见
我回复
尾声
改成 SIGQUIT 信号nginx里还是有 104: Connection reset by peer, 看来手册里说SIGQUIT: graceful stop 也不能保证一次请求里的所有动作都执行完啊
最终结果 去掉这个定时重启php-fpm 的任务, 已经3个多月了,没发现问题,oh yeah~
参考文档
总结