簡體   English   中英

如何處理PHP-FPM整理狀態?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM