Linux
找出高 CPU 使用率的 apache 程序實際上在做什麼?
目前我們的伺服器存在一些問題,我們似乎間歇性地讓 apache 程序執行並執行,佔用 100% 的 CPU。
執行 top 時,我們看到以下內容:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/apache2 -k start 23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/apache2 -k start
我想嘗試找出導致此問題的腳本(或任何腳本),所以我嘗試了:
strace -p 20788
但這根本沒有顯示任何輸出(我已經離開它大約 10 分鐘,它什麼也沒顯示)。據我了解,這可能意味著它陷入了無限循環,並且沒有任何“系統呼叫”可以顯示。
我還能做些什麼來展示發生了什麼嗎?
謝謝
**編輯 -**忘了提,這是一個任何時候都有幾百個使用者的實時伺服器!所以我真的不能隨便嘗試更改配置選項並重新啟動 apache。
編輯 2 - 當 PHP 沒有配置 –enable-debug 時,來自 gdb 的回溯(bt)似乎沒有那麼有用 - 它只顯示“execute()”,但我需要知道 PHP 腳本是什麼實際執行..還有其他方法嗎?
#0 0x00007f6c143fb0c5 in ?? () from /usr/lib/apache2/modules/libphp5.so #1 0x00007f6c143b040b in execute () from /usr/lib/apache2/modules/libphp5.so #2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so #3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so #4 0x00007f6c1441ae7d in ?? () from /usr/lib/apache2/modules/libphp5.so #5 0x00007f6c18912508 in ap_run_handler () #6 0x00007f6c1891297e in ap_invoke_handler () #7 0x00007f6c18922570 in ap_process_request () #8 0x00007f6c1891f398 in ?? () #9 0x00007f6c18918fa8 in ap_run_process_connection () #10 0x00007f6c189271d0 in ?? () #11 0x00007f6c1892793a in ?? () #12 0x00007f6c189284e7 in ap_mpm_run () #13 0x00007f6c188fd4a4 in main ()
好吧,如果你覺得勇敢:
gdb -p 20788
然後發出
bt
查看堆棧幀,例如順便說一句,還要
ltrace
提一下——也試試。UPD。: 好吧,既然現在我們知道 Apache 確實在執行某些東西,那你為什麼不看看
mod_status
輸出——擴展的呢?
一個非常簡單的方法是使用
htop
. 您可以對高 CPU 程序進行排序,然後使用
- s 代表
strace
一個程序- l 用於
lsof
查看程序的打開文件- L 到
ltrace
.我發現至少有一個選項可以找到生成負載的腳本,您當然可以在生產 Web 伺服器上使用它進行調試。