1. 程式人生 > >linux cpu佔用率分析

linux cpu佔用率分析

http://blog.leanote.com/post/github-yihengliucc/linux-cpu%E5%8D%A0%E7%94%A8%E7%8E%87%E5%88%86%E6%9E%90

  • 使用top命令檢視可能會有程序佔用率非常高,這個數值是程序內各個執行緒佔用cpu的累加值。

    關於第三行CPU(s)的理解為: 
    %us 使用者空間佔用CPU百分比,當有多個CPU時,則分母為全部CPU計算能力之和。 
    %sy 核心空間佔用CPU百分比,當有多個CPU時,則分母為全部CPU計算能力之和。 
    單個程序的CPU的利用率理解為: 
    當前任務共享從上次螢幕重新整理時的CPU時間,以CPU總時間的百分比表示。在一個真實的SMP環境中,如果Irix Mode被設定成off,top將工作在Solaris Mode下,即一個任務的CPU利用率將以CPU的總數分開顯示,要切換Irix/Solaris Mode,按I

    就行。 
    比如程序佔用各CPU使用率總和為10%,則TOP命令顯示結果為160%(10%*16核),所以當前圖片中Tomcat實際佔用各CPU總和使用率為106%/16=6.625%與主機總體負載基本一致。

  1. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2. 14094 root 150315m10m7308 S 891%2.21:49.01 gateway
  • 使用top -H p pid 命令可以檢視程序內各個執行緒佔用CPU百分比
  1. top中可以看到有107個執行緒,但是下面9個執行緒佔用CPU很高,下面以執行緒
    14086為主,分析其為何high CPU
  2. PID USER PR NI VIRT RES SHR S %CPU MEM TIME+ COMMAND
  3. 14086 root 250922m914m538m R 10110.021:35.46 gateway
  4. 14087 root 250922m914m538m R 10110.010:50.22 gateway
  5. 14081 root 250922m914m538m S
    9910.08:57.36 gateway
  • 使用命令gstack檢視程序中各個執行緒的函式呼叫棧 
    gstack pid > gstack.log,這裡的pid是上面查出的
  1. #gstack 14094 > gstack.log
  2. gstack.log中查詢執行緒ID14086,由於函式棧會暴露函式細節,因此只顯示了兩個函式楨,執行緒ID14086對應執行緒號是37
  3. Thread37(Thread0x4696ab90(LWP 14086)):
  4. #0 0x40000410 in __kernel_vsyscall ()
  5. #1 0x40241f33 in poll () from /lib/i686/nosegneg/libc.so.6
  • 使用命令gcore可以轉存程序映像及記憶體上下文 
    gcore pid 改命令生成core.pid檔案
  1. #gcore 14094
  2. 該命令生成core檔案core.14094
  • 使用strace命令檢視系統呼叫和花費的時間 
    strace -T -r -c -p pid,-c引數顯示統計資訊,去掉此引數可以檢視每個系統呼叫話費的時間及返回值。
  1. % time seconds usecs/call calls errors syscall
  2. --------------------------------------------------------------------------
  3. 99.9922.68387933856702 poll
  • 用gdb除錯core檔案,併線程切換到37號(程序號在gstack命令中可以看到)執行緒
  1. gcore和實際的core dump時產生的core檔案幾乎一樣,只是不能用gdb進行某些動態除錯
  2. (gdb) gdb gateway core.14094
  3. (gdb) thread 37
  4. [Switching to thread 37(Thread0x4696ab90(LWP 14086))]#00x40000410in __kernel_vsyscall ()
  5. (gdb)where
  6. #0 0x40000410 in __kernel_vsyscall ()
  7. #1 0x40241f33 in poll () from /lib/i686/nosegneg/libc.so.6
  8. 可以根據詳細的函式棧進行gdb除錯,列印一些變數值,並結合原始碼分析為何會poll呼叫佔用很高的CPU
  9. 因為程式碼涉及到公司產權,顧不在此做詳細分析,需要明白的是分析的流程和使用的命令。
  10. 流程為:程序ID->執行緒ID->執行緒函式呼叫棧->函式耗時和呼叫統計->原始碼分析