
我的 Apache 狀態如下:
201 requests/sec - 98.8 kB/second - 504 B/request
85 requests currently being processed, 345 idle workers
_____CCW_C_____C__C__C_R____C_WC_________C__C____CW__C__CCC_____
__C____W______C___C___CW__C_C______C__W_C__C_____CCC____C______R
CC_C_______C___C____C______________C______C__C________________C_
___________________C______________________C_______C___C_____C___
CC____C__C___R_____C_C_CC__________C___C___________R____C_C_C___
______C______W_W__W___C____________________C__WCC__R__R_C_______
R__RC________________________C___R____W__C____..................
....................................................
在 4 核心機器上,伺服器負載平均為 2。
IO 利用率為 10-15%,沒有太多突破 70% 的情況。
機器有近 4 GB 可用空間並且使用 0 交換空間。
機器上的站點是 PHP 站點。所有 PHP 程式碼在訪問時都經過最佳化且速度很快,但有時請求會被卡住。卡住的意思;至少 10 秒無響應。我們調試了 PHP 程式碼,但它是相當優化且快速的。我們花了很多時間,直到我們決定測試以下請求:
<html><body>test</body></html>
test.html 頁面。
該靜態資源也會以與 php 頁面「卡住」相同的方式「卡住」。
考慮到系統的健康狀況以及它是靜態文件的事實,這怎麼可能?
我測試了網絡,但是,當 PHP 在網站監控中顯示「緩慢」時,html 測試檔案也需要(遠遠長於)10 秒來載入;
time lynx -dump http://127.0.0.1/test.html
我們迫切地想要解決這個問題,但我們似乎無法解決它。
答案1
也許 Apache 耗盡了文件句柄?您允許它擁有多少個文件句柄?預設的 1024 很快就會成為瓶頸。在 Linux 中,您可以提高檔案的限制/etc/security/limits.conf
。
停頓期間是否有大量磁碟活動?如果您非常詳細地啟用了 Apache 存取日誌和其他日誌,也許是檔案系統提交了最新變更?這不會以任何方式影響 Apache,但你永遠不知道。
為了確保這一點,請/proc/sys/kernel/random/entropy_avail
在攤位期間查看。例如,您可以看到它watch -n1 'cat /proc/sys/kernel/random/entropy_avail'
。如果顯示0
,則您的核心已耗盡熵,並且會阻止 Apache,直到有更多可用熵為止。
如果是這種情況,您可以安裝rng-tools
並執行rngd
守護程序,在真實熵不可用的情況下,它將半隨機數從 /dev/urandom 鏟到 /dev/random 。
答案2
我還沒有深入研究內部結構,但根據我的經驗和我聽說的...如果 PHP 使用嵌入式模組 ( ) 在 Apache 上運行,libphp5.so
那麼Apache 會將PHP(以及可選的任何共享模組)加載到記憶體中每個請求,即使 PHP 程式碼沒有運行。
考慮使用nginx作為 Apache 前面的反向代理。 nginx 在提供靜態資源方面的速度非常快,如果配置正確,確實可以減少繁忙的 Web 伺服器上的負載。為了獲得獎勵積分,請將 PHP 配置為透過 nginx 中的 FastCGI 運行。看一眼本文找出一些原因。這真是一個很棒的方式。上週我用 Ubuntu 10.04、nginx、spawn-fcgi 和 php-cgi 設定了一個新的 Web 伺服器,幾乎沒有花任何時間。根據記錄,PHP 5.3 與 Ubuntu 10.04 捆綁在一起。