線上不出點問題, 似乎今天就不是週五了.
突然報警群裡出現了某一條資料, 反饋沒有上報成功, 中間流程執行完, 後面沒再執行了(細思極恐)
無語。。。
想了想剛才有發版, 但是不是這個引起的還不確定 (我們目前沒有灰度釋出-_-)
1. 從日誌中豐富問題資訊
首先我得確定下這條資料的到達時間, error日誌查, 檢視業務日誌是否有過重要的打點資訊, 通過從access日誌裡面, 定位到這條問題資料請求時間為 10:22:42
2. 10:22 我們做了什麼?
通過檢視聊天記錄,10點多有個上線操作, 並且別的專案之前一上線就抱怨說可能就會有502出現, 由此我想我們釋出服務中間可能操作了什麼出現的問題
嗯。。萬事不求人, 看下php-fpm的日誌就知道啥時候上過線了(我們構建專案會重啟fpm).
發現php-fpm.log檔案內容:
[19-Apr-2019 10:22:42] NOTICE: Reloading in progress ...
[19-Apr-2019 10:22:42] NOTICE: reloading: execvp("/usr/local/php-fpm_9000/sbin/php-fpm", {"/usr/local/php-fp
m_9000/sbin/php-fpm", "--daemonize", "--fpm-config", "/usr/local/php-fpm_9000/etc/php-fpm.conf", "--pid", "/
usr/local/php-fpm_9000/var/run/php-fpm.pid"})
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: using inherited socket fd=8, "127.0.0.1:9000"
[19-Apr-2019 10:22:42] NOTICE: using inherited socket fd=8, "127.0.0.1:9000"
[19-Apr-2019 10:22:42] NOTICE: fpm is running, pid 23324
[19-Apr-2019 10:22:42] NOTICE: ready to handle connections
複製程式碼
nginx錯誤:
[error] 66#0: *10 recv() failed (104: Connection reset by peer) while reading response header from upstream
複製程式碼
這個錯誤很熟悉吧,之前文章已經介紹過了.
3. 先下個結論,順著這個想想
釋出服務重啟php-fpm, 導致的程式碼流程執行中斷.
4. 等等, 應該是平滑重啟,怎麼會中斷?
首先思考中斷可能的原因:
- 程式碼某個點執行時間過長,timeout
- 資源不夠,比如記憶體溢位中斷
- 程式碼bug、異常
- 伺服器斷電
- ....
這些問題應該不會, 這個被中斷的服務 沒有依賴的服務請求, 也沒有複雜的業務邏輯.(不要問為啥沒問題,因為這是我寫的+_+)
5. 平滑重啟為什麼不平滑?
藉助著搜尋引擎的力量, 找問題就變得傻瓜起來
-
記 php-fpm 重啟導致的 程式執行中斷問題 yq.aliyun.com/articles/22…
-
重啟php-fpm時請求發生502錯誤的原因及解決:process_control_timeout www.04007.cn/article/439…
-
PHP-FPM引數 www.jianshu.com/p/795a1a181…
-
Graceful Restart (USR2) isn't very graceful bugs.php.net/bug.php?id=…
最後詳細的讀了下最後一篇向官方反饋的bug, php-fpm的平滑重啟不平滑
其中目前建議:
[2013-02-13 15:57 UTC] phpbugs at oops dot mooo dot com
Try setting process_control_timeout to something higher than 0.
複製程式碼
process_control_timeout 引數解釋
引數含義是 設定子程式接受主程式複用訊號的超時時間. 控制子程式處理來自master的訊號的時間,預設為0.如果正在處理請求, 很可能會收到錯誤報警。建議將此引數設定為相同的值 request_terminate_timeout,以便worker有時間完成處理請求。
驗證
<?php
echo 1;
sleep(10);
echo 3;
複製程式碼
訪問中, 進行 kill -USR2 10 報錯:
將 php-fpm.conf 的 process_control_timeout 配置為20
進行 kill -USR2 11
正常輸出結果.
結論
後續是否有副作用還需要在生產環境驗證
服務釋出優化也不僅於此
為什麼要每次重啟fpm
比如能不能用其他方式使快取失效呢?