背景和初步排查
1是error log 丟日志了
2是程序執行過程中操作完sendPresent后down掉了,導致沒寫入mongo
-第一個情況工作多年的經驗來看應該不至于,那就先根據第二種情況繼續查吧
[wu.daolin@web001.m6~]$ 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~
參考文檔
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選