使用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得到如下結果,可以發現2909執行緒的編號是12gdb>attach 2907
gdb>info threads
13 thread 0xad5f2b70 (lwp 2908) 0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1使用thread 切換執行緒,使用bt顯示執行緒棧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 ()
gdb>thread 12得到如下執行緒棧gdb>bt
#0 0x006e0422 in __kernel_vsyscall ()得到程序id 21465#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
ps -e |grep cmu得到執行緒時間, 其中最佔cpu的是 epollrecvtask 215814996 ? 00:00:25 cmu_fjga_sp3
21465 pts/5 00:08:10 cmu
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上面執行需要訪問磁碟檔案,這個時候...