[英]How to deal with PHP-FPM finishing state?
我有一個使用NGINX和PHP-FPM的網站。 您可能知道PHP-FPM有一個狀態頁面,其中包含有關其進程的詳細信息。 我的問題是,隨着時間的推移,許多進程狀態變為“完成”,並且在我重新加載PHP-FPM之前不會改變它們的“完成”狀態。
糟糕的是,“完成”過程被視為活動過程,當活動過程的數量超過pm.max_children時,我的網站上發生了不好的事情。
我知道一些php-fpm池參數來殺死空閑進程,但我找不到參數來殺死一段時間后完成proccesses。
如何處理PHP-FPM整理狀態? 是否有配置參數在一段時間后終止這些“完成”過程? 這可能是NGINX和PHP-FPM之間的錯誤配置嗎? “完成”狀態的原因是什么?
這是php-fpm狀態的圖像。 紅軍正在完成狀態,這正是我想要解決的問題。 請求URI是我網站的不同頁面。
謝謝你的知識。
PD1:現在我每15分鍾重新加載PHP-FPM並且“修復”或多或少完成狀態...但我認為這可能是一個重要的性能問題,流量更多。
PD2:到目前為止,我認為可以解決的唯一解決方案是讀取php-fpm狀態頁面,獲取所有具有完成狀態的procceses並通過pid殺死proccesses超過任意請求持續時間。
有同樣的問題。 這是我用作臨時解決方案的內容:
使用以下內容創建一個PHP文件:
<?php
fastcgi_finish_request();
?>
編輯php.ini:
auto_append_file = /path/to/your/file.php
我有這樣的問題,這是我的修復:
事實證明我們在某些情況下使用了無效的Memcached密鑰。 這導致Memcached死亡而沒有錯誤,PHP進程仍然活着。
https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes
這兩個評論都沒有解決或解釋問題背后的根本原因。 在殺死這些進程時執行PD2方法的示例代碼應該是這樣的:
<?php
while (true) {
$data_json = file_get_contents("http://localhost/fpmstatus?json&full");
$data = json_decode($data_json, true);
foreach ($data['processes'] as $proc) {
if ($proc['state'] === "Finishing") {
$pid = $proc['pid'];
$duration = $proc['request duration'] / 1000000.0;
echo json_encode(compact("pid", "duration"));
if ($duration > 60) {
passthru("kill -9 " . $pid);
echo " KILLED\n";
} else {
echo "\n";
}
}
}
echo count($data['processes']);
echo "\n";
sleep(30);
}
運行此代碼時,我確實發現error.log中會出現這樣的錯誤:
2017/08/06 13:46:42 [錯誤] 20#20:* 9161 recv()失敗(104:通過對等方重置連接)從上游讀取響應頭,客戶端:77.88.5.19,server:hostname1,request: “GET /?p = 9247 HTTP / 1.1”,上游:“fastcgi:// uni x:/run/php/php7.0-fpm.sock:”,主機:“hostname2”
顯而易見的不匹配是請求由“hostname1”的塊處理,而“hostname2”的塊不再存在(不再)。 我不能肯定地說這是原因。 在聲明server_name _;
之后,還有“完成”請求server_name _;
阻止,但它們比之前發生的任何事情都要少。
我的服務器在apache代理配置中設置了enablereuse = on。 刪除此修復了“整理”問題。
也列在問題中: https : //serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.