Linux
如何理解 Apache 忙於什麼?
我在 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 配置文件。