找出程式cpu使用率高的原因

2021-09-22 22:17:03 字數 2360 閱讀 8034

確定是cpu過高

使用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顯示所有執行緒

gdbgdb>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

ps + strace

得到程序id 21465

ps -e |grep cmu

4996 ?        00:00:25 cmu_fjga_sp3

21465 pts/5    00:08:10 cmu

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

找出程式cpu使用率高的原因

確定是cpu過高 使用top觀察是否存在cpu使用率過高現象 找出執行緒 對cpu使用率過高的程序的所有執行緒進行排序 ps h e o pid,tid,pcpu,cmd sort pcpu grep 得到如下結果,其中執行緒2909使用了7.8 的cpu.2907 2913 0.0 2907 29...

cpu使用率低負載高

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

控制CPU使用率

我使用的是ubuntu 14.04版本,用的是自帶的系統監視器來觀察cpu使用率的變化。1.首先來說說怎麼控制cpu使用率,當程式執行乙個死迴圈的時候,使用率就會變成100 而當程式進入idle的時候,使用率就會很低 在別的程式不啟動的情況下 那麼控制cpu使用率就是調整它idle和busy的時間比...