Linux

找出高 CPU 使用率的 apache 程序實際上在做什麼?

  • March 24, 2018

目前我們的伺服器存在一些問題,我們似乎間歇性地讓 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 伺服器上使用它進行調試。

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