php-fpm 平滑重啟為什麼不平滑 - 引數 process_control_timeout

小宇渣渣渣發表於2019-04-19

線上不出點問題, 似乎今天就不是週五了.

突然報警群裡出現了某一條資料, 反饋沒有上報成功, 中間流程執行完, 後面沒再執行了(細思極恐)

無語。。。

想了想剛才有發版, 但是不是這個引起的還不確定 (我們目前沒有灰度釋出-_-)

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. 等等, 應該是平滑重啟,怎麼會中斷?

首先思考中斷可能的原因:

  1. 程式碼某個點執行時間過長,timeout
  2. 資源不夠,比如記憶體溢位中斷
  3. 程式碼bug、異常
  4. 伺服器斷電
  5. ....

這些問題應該不會, 這個被中斷的服務 沒有依賴的服務請求, 也沒有複雜的業務邏輯.(不要問為啥沒問題,因為這是我寫的+_+)

5. 平滑重啟為什麼不平滑?

藉助著搜尋引擎的力量, 找問題就變得傻瓜起來

  1. 記 php-fpm 重啟導致的 程式執行中斷問題 yq.aliyun.com/articles/22…

  2. 重啟php-fpm時請求發生502錯誤的原因及解決:process_control_timeout www.04007.cn/article/439…

  3. PHP-FPM引數 www.jianshu.com/p/795a1a181…

  4. 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 平滑重啟為什麼不平滑 - 引數 process_control_timeout

將 php-fpm.conf 的 process_control_timeout 配置為20

進行 kill -USR2 11

正常輸出結果.

結論

後續是否有副作用還需要在生產環境驗證

服務釋出優化也不僅於此

為什麼要每次重啟fpm

比如能不能用其他方式使快取失效呢?

相關文章