1. 程式人生 > >後臺伺服器CPU使用率高 問題分析方法

後臺伺服器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