php-fpm 平滑重啓爲何不平滑 - 參數 process_control_timeout

線上不出點問題, 彷佛今天就不是週五了.php

忽然報警羣裏出現了某一條數據, 反饋沒有上報成功, 中間流程執行完, 後面沒再執行了(細思極恐)html

無語。。。nginx

想了想剛纔有發版, 可是不是這個引發的還不肯定 (咱們目前沒有灰度發佈-_-)緩存

1. 從日誌中豐富問題信息

首先我得肯定下這條數據的到達時間, error日誌查, 查看業務日誌是否有太重要的打點信息, 經過從access日誌裏面, 定位到這條問題數據請求時間爲 10:22:42bash

2. 10:22 咱們作了什麼?

經過查看聊天記錄,10點多有個上線操做, 而且別的項目以前一上線就抱怨說可能就會有502出現, 由此我想咱們發佈服務中間可能操做了什麼出現的問題服務器

嗯。。萬事不求人, 看下php-fpm的日誌就知道啥時候上過線了(咱們構建項目會重啓fpm).socket

發現php-fpm.log文件內容:php-fpm

[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錯誤:oop

[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.conf 的 process_control_timeout 配置爲20

進行 kill -USR2 11

正常輸出結果.

結論

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

服務發佈優化也不只於此

爲何要每次重啓fpm

好比能不能用其餘方式使緩存失效呢?

結束

更多有趣的計算機技術關注 呆呆熊一點通 :

相關文章
相關標籤/搜索