後臺伺服器CPU使用率高 問題分析方法
一、找出cpu使用率高的程序和執行緒:
a、將 cpu 佔用率高的執行緒找出來:
ps H -eo user,pid,ppid,tid,time,%cpu,cmd--sort=%cpu
b、對於多執行緒的服務,通過top命令得到cpu使用率高的程序後,可以使用如下命令檢視該程序下各執行緒cpu使用率
ps -eLo pid,lwp,pcpu | grep PID
c、直接使用 ps Hh -eopid,tid,pcpu | sort -nk3 |tail 獲取對於的程序號和執行緒號
二、gdb除錯cpu使用率高的程序:
對於單執行緒的程式,比較好查,這裡只說一下多執行緒的除錯方法
GDB多執行緒除錯的基本命令
info threads顯示當前可除錯的所有執行緒,每個執行緒會有一個GDB為其分配的ID,後面操作執行緒的時候會用到這個ID。前面有*的是當前除錯的執行緒。
thread ID 切換當前除錯的執行緒為指定ID的執行緒。
break thread_test.c:123 thread all 在所有執行緒中相應的行上設定斷點
thread apply ID1 ID2 command 讓一個或者多個執行緒執行GDB命令command。
thread apply all command 讓所有被除錯執行緒執行GDB命令command。
setscheduler-locking off|on|step :
估計是實際使用過多執行緒除錯的人都可以發現,在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。
off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。
on 只有當前被除錯程式會執行。
step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。
gdb檢視執行緒資訊及切換執行緒:
info threads 檢視當前程序所有執行緒
thread 4 切換到執行緒4
backtrace 檢視當前函式呼叫棧
一般情況下多執行緒的時候,由於是同時執行的,最好設定 set scheduler-locking on
這樣的話,只調試當前執行緒 。
三、檢視執行緒棧
gstack pid