如何定位死迴圈或高CPU使用率 linux

2021-07-09 03:08:52 字數 2578 閱讀 5744

使用top觀察是否存在cpu使用率過高現象

對cpu使用率過高的程序的所有執行緒進行排序

ps h -e -o pid,tid,pcpu,cmd --sort=pcpu |grep ***
得到如下結果,其中執行緒2909使用了7.8%的cpu.
2907 2913 0.0 ./***
2907 2909 7.8 ./***
也可以通過檢視/proc中的資訊來確定高cpu執行緒. 列印了4列,執行緒id,執行緒名,使用者時間和核心時間(排名未分先後)
awk '' /proc/2907/task/*/stat
使用gdb attach nmsagent所在的程序,在gdb中使用 info threads顯示所有執行緒

gdb

gdb>attach 2907

gdb>info threads

得到如下結果,可以發現2909執行緒的編號是12

13 thread 0xad5f2b70 (lwp 2908)  0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

12 thread 0xad58eb70 (lwp 2909) 0x006e0422 in __kernel_vsyscall ()

11 thread 0xad52ab70 (lwp 2910) 0x006e0422 in __kernel_vsyscall ()

10 thread 0xad4f8b70 (lwp 2911) 0x006e0422 in __kernel_vsyscall ()

9 thread 0xad4c6b70 (lwp 2912) 0x006e0422 in __kernel_vsyscall ()

8 thread 0xad3feb70 (lwp 2913) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

7 thread 0xace08b70 (lwp 2914) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

6 thread 0xac607b70 (lwp 2915) 0x006e0422 in __kernel_vsyscall ()

5 thread 0xac5e6b70 (lwp 2916) 0x006e0422 in __kernel_vsyscall ()

4 thread 0xac361b70 (lwp 2917) 0x006e0422 in __kernel_vsyscall ()

3 thread 0xac2fdb70 (lwp 2918) 0x006e0422 in __kernel_vsyscall ()

2 thread 0xac1fcb70 (lwp 2919) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

* 1 thread 0xb78496d0 (lwp 2907) 0x006e0422 in __kernel_vsyscall ()

使用thread 切換執行緒,使用bt顯示執行緒棧

gdb>thread 12

gdb>bt

得到如下執行緒棧

#0  0x006e0422 in __kernel_vsyscall ()

#1 0x001cca26 in nanosleep () from /lib/tls/i686/cmov/libc.so.6

#2 0x001fc2dc in usleep () from /lib/tls/i686/cmov/libc.so.6

#3 0x0806b510 in osptaskdelay ()

#4 0x0805c710 in cdispatchtask::nodemsgsendtosock() ()

#5 0x0805cc74 in dispatchtaskentry ()

#6 0x0806a8e9 in osptasktemplatefunc(void*) ()

#7 0x00d4780e in start_thread () from /lib/tls/i686/cmov/libpthread.so.0

#8 0x002027ee in clone () from /lib/tls/i686/cmov/libc.so.6

得到程序id 21465

ps -e |grep cmu

4996 ? 00:00:25 cmu_fjga_sp3

21465 pts/5 00:08:10 cmu

得到執行緒時間, 其中最佔cpu的是 epollrecvtask 21581

ps -el |grep 21465
21465 21580 pts/5 00:00:00 timerman task
21465 21581 pts/5 00:09:02 epollrecvtask
21465 21582 pts/5 00:00:00
使用 strace -p 21581 得到執行緒棧

如何定位死迴圈或高CPU利用率linux

sudo gdb pid 程序號 最近在完成乙個比較大的多執行緒c 離線服務程式後,發現經常會出現卡住的情況,表現為cpu利用率100 左右,一直沒找到 原因,就採用了乙個笨到方法,每小時重啟一次服務 這樣做仍然會有好多資料進不了庫,不是治本的方法,前幾天決定徹底解決這個問題,搜尋發現了gdb的乙個...

linux程序CPU使用率高問題定位

使用工具 perf,flamegraph perf 內置於linux核心原始碼樹中的效能剖析工具。工作原理 對監控事件進行取樣。brendan gregg的個人 上使用perf工具的案例 flamegraph 操作流程 perf record e cycles g call graph dwarf ...

cpu使用率低負載高

cpu低而負載高也就是說等待磁碟i o完成的程序過多,就會導致佇列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去執行別的任務或空閒,具體場景有如下幾種。場景一 磁碟讀寫請求過多就會導致大量i o等待 上面說過,cpu的工作效率要高於磁碟,而程序在cpu上面執行需要訪問磁碟檔案,這個時候...