如何定位死迴圈或高CPU使用率(linux)
確定是CPU過高
使用top觀察是否存在CPU使用率過高現象
找出執行緒
對CPU使用率過高的程式的所有執行緒進行排序
ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx
得到如下結果,其中執行緒2909使用了7.8%的CPU.
2907 2913 0.0 ./xxx
2907 2909 7.8 ./xxx
也可以通過檢視/proc中的資訊來確定高CPU執行緒. 列印了4列,執行緒ID,執行緒名,使用者時間和核心時間(排名未分先後)
awk '{print $1,$2,$14,$15}' /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
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
ps -eL |grep 21465
21465 21579 pts/5 00:00:00 CamApp
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 得到執行緒棧
相關文章
- Linux中如何檢視CPU使用率?Linux
- Oracle優化案例-定位start with connect by遞迴死迴圈資料(二十二)Oracle優化遞迴
- 如何解決cpu使用率過高的問題
- CPU使用率低負載高負載
- Java程式CPU使用率高排查Java
- shell死迴圈指令碼示例指令碼
- HashMap死迴圈的原因分析HashMap
- cpu使用率過高問題(Java)Java
- weblogic程式高CPU使用率分析WebC程式
- Linux檢視CPU使用率Linux
- java死迴圈while(true)vsfor(;;)JavaWhile
- cpu使用率低負載高,原因分析負載
- 關於CPU使用率高的awr分析
- Linux 迴圈Linux
- MySQL 5.7定位消耗CPU高的SQLMySql
- 在Unity中檢測死迴圈和卡死Unity
- 一次線上死迴圈的排查
- postMessage 死迴圈與 window.parent
- Oracle CPU使用率過高問題處理Oracle
- .netcore利用perf分析高cpu使用率NetCore
- JAVA CPU100%與執行緒死鎖定位Java執行緒
- Linux shell迴圈Linux
- linux while 迴圈LinuxWhile
- Win10系統中LSAISO程式CPU使用率過高如何解決Win10AI
- 18. 再說迴圈~列表和迴圈的高階操作
- 迴圈高階綜合練習
- win10怎麼減少cpu使用率_win10cpu使用率過高的解決方法Win10
- 恆訊科技分析:如何解決SQL Server CPU使用率過高的問題?SQLServer
- 效能分析(2)- 應用程式 CPU 使用率過高案例
- CPU 使用率低高負載的原因,看看這篇!負載
- [BUG反饋]function get_parent_category() 死迴圈FunctionGo
- 熟悉 Vue ?你能解釋這個死迴圈嗎?Vue
- 那些坑你沒商量的程式碼死迴圈
- 多執行緒 HashMap 死迴圈 問題解析執行緒HashMap
- 如何定位 golang 程式 hang 死的 bugGolang
- JavaScript的map迴圈、forEach迴圈、filter迴圈、reduce迴圈、reduceRight迴圈JavaScriptFilter
- Win7系統下cpu使用率高怎麼辦?Win7
- oracle_CPU佔用率高時的問題定位Oracle