Linux

如何理解 Apache 忙於什麼?

  • April 9, 2013

我在 Linux 伺服器上有 Apache,裡面有一個 Python 腳本(Trac,更具體地說)。以最低流量消耗 99% 的 CPU,平均負載高於 3.00。是否有可能以某種方式理解它在那裡做什麼 - 磁碟、網路、哪些文件等?是否有一些工具可以分析特定程序正在忙什麼?

編輯:strace apache2 -X向我展示了很多具有相似內容的行:

stat("/home/foo/apache/conf.d/trac-XXX.conf", {st_mode=S_IFREG|0644, st_size=1014, ...}) = 0
open("/home/foo/apache/conf.d/trac-XXX.conf", O_RDONLY|O_CLOEXEC) = 6
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a93021000
fstat(6, {st_mode=S_IFREG|0644, st_size=1014, ...}) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a9301e000
read(6, "contents of my trac-XXX.conf"..., 4096) = 1014
read(6, "", 4096)                       = 0
close(6)               

目錄中的每個文件都有相同的行/home/foo/apache/conf.d/(我有數百個)。您知道如何解釋這些資訊並解決問題嗎?看起來 Apache 正在重新載入每個 HTTP 請求的所有配置文件。

您可以使用strace( man strace)。作為根嘗試

strace `ps -e | grep apache2 | awk '{ print "-p"$1 }'`

或類似的,trac而不是apache2。您可能還想將LogLevel配置為debug.

以下編輯是在黑暗中的狂野拍攝,不熟悉 Trac。

Trac 票 3833 osimons 後面的評論中指出:

例如,如果您不使用 mod_python,而是使用簡單的 CGI 設置,則環境會為每個請求完全重新載入。這樣的請求基本上沒有歷史記錄——啟動 Python 程序,載入模組,啟動 Trac 處理,當請求完成時,整個 Python 程序終止。

這也有效的原因是因為請求特定資訊(如您的預覽範例)作為參數傳遞給請求對象 - 在 req 上下文中可用。

所以問題是,您是使用mod_python還是純 CGI 來執行 Trac?如果您使用的是純 CGI,那麼很清楚為什麼每次請求都會讀取 Trac 配置文件。

引用自:https://serverfault.com/questions/497367