
查看輸出,top
我注意到間歇性地有一個或兩個 Apache 進程消耗大量 CPU - 50% - 90% 之間
CPU 使用率的峰值大約每 10 秒左右就會出現和消失。
還有各種其他 Apache 進程正在運行,消耗量在 2% - 4% 之間
我研究了各種方法來嘗試追蹤哪個虛擬主機/網站負責這些過程。然而,因為它們來得快去得也快,所以我找不到可靠的方法來做到這一點。
我已經嘗試過lsof
,也查看了輸出,server-status
但由於進程持續時間不長,進程 ID 被重新使用,並且不可能將其綁定到導致問題的虛擬主機。
例如,如果我lsof
在有問題的進程 ID 上運行,它會列出十幾個不同的虛擬主機日誌文件,這些文件在過去幾秒鐘內共享該進程 ID。我確信有一個虛擬主機有問題,但我不知道是哪一個。
我還檢查了 MySQL 慢查詢日誌,這沒有顯示任何有趣的內容。
答案1
我的建議:在日誌中加入回應時間。
它並不完美,因為不能保證導致高峰的請求比其他請求需要更長的時間來服務,但有可能,並且為您提供了調查的起點。
為此,您需要定義一個新的 LogFormat 和 CustomLog,其中包含 %D 參數。參見阿帕契mod_log_config 文檔。
另一個選項可能有點太低級,但可以讓您了解負載的性質,即使用 -f 追蹤子進程,使用 -c 顯示每次呼叫的 cpu 時間來追蹤 apache 父進程,例如strace -f -c -p <apache parent pid>
一旦您知道花費最多時間的系統調用,您就可以直接追蹤它們。例如,假設伺服器花費大量時間執行 write(),那麼您可以執行strace -f -e trace=write -p <apache parent pid>
,並更詳細地查看這些呼叫。