2012-02-15 70 views
0

在切諾基1.2.101的FastCGI上,一些運行Archlinux/php-fpm 5.3.9的服務器出現間歇性問題。我使用的是緩存插件,建立和使用邏輯像提供靜態緩存文件:PHP-FPM/FastCGI + exit()導致CPU峯值

$cache_file = md5($host . $uri) . '.cache'; 
if(file_exists($cache_file)) { 
    $cache_file_contents = file_get_contents($cache_file) 
    exit($cache_file_contents); 
} 
// else build/save the $cache_file 

幾道工序將在PHP-FPM吊上exit()通話慢日誌結束。當時的負載峯值,100%CPU使用率(幾乎)完全轉移到網絡服務器,PHP頁面開始返回500 - 內部服務器錯誤。有時候服務器會自行恢復,其他的我需要重新啓動php-fpm和cherokee。

  • 我已經配置做了PHP-FPM的FastCGI設置一個

  • 即使這是一個VPS我會試探性地排除IO上的文件系統等作爲緩存文件應該已經被加載。我一直沒能趕上它的行爲與vmstat

  • pm.max_requests設置爲500,但不知道如果exit()調用與進程的循環干擾測試。

  • php-fpm日誌顯示了很多WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)。這似乎是php-fpm調節池中子進程數量的正常部分,儘管

有關故障排除的任何提示,我們將不勝感激。這裏有3個東西,我發現,提出了一些紅旗:

http://www.php.net/manual/en/function.exit.php#96930

https://serverfault.com/questions/84962/php-via-fastcgi-terminated-by-calling-exit#85008

Errors when calling exit() function for fastCGI?

+0

對於二次探測,您可以嘗試使用strace來查看特定進程正在執行的操作:'strace -p PID' – Marki555 2013-02-22 11:45:55

回答

0

我最終使用在評論中引用了Python的異常捆綁方式在http://www.php.net/manual/en/function.exit.php

在主要指標。PHP

class SystemExit extends Exception {} 

try{ 
    /* Resume loading web-app */ 
} 
catch (SystemExit $e) {} 

在從問題緩存邏輯,取代exit($cache_file_contents);

while (@ob_end_flush()); 
flush(); 
echo $cache_file_contents; 
throw new SystemExit(); 

這緩解了PHP-fpm的慢日誌,顯示在該exit()掛起。我並不完全相信它解決了潛在的問題,但它已經清理了日誌文件。

1

這可能與通過輸出到服務器(軌I/O以及)。通過讓您的網絡服務器爲靜態緩存文件提供服務,您可以避開FPM。除此之外,我建議你使用這個PHP塊代替,以減少內存/ I/O一點點:

if (file_exists($cache_file)) 
{ 
    readfile($cache_file) 
    exit; 
} 

readfile

如果您不想使用exit(我個人從未遇到過在PHP中使用FastCGI時遇到的問題),您應該清理代碼,以便不必使用exit(例如,你可以return或看看你的代碼流爲什麼你需要使用退出並消除這個問題。