如何定位死迴圈或高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 得到執行緒棧
相關文章
- 無限for迴圈(死迴圈)
- Linux中如何檢視CPU使用率?Linux
- Oracle優化案例-定位start with connect by遞迴死迴圈資料(二十二)Oracle優化遞迴
- Linux檢視CPU使用率Linux
- Java程式CPU使用率高排查Java
- CPU使用率低負載高負載
- cpu使用率過高問題(Java)Java
- .netcore利用perf分析高cpu使用率NetCore
- ConcurrentHashMap竟然也有死迴圈問題?HashMap
- JAVA CPU100%與執行緒死鎖定位Java執行緒
- Oracle CPU使用率過高問題處理Oracle
- MySQL 5.7定位消耗CPU高的SQLMySql
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- 網站主機CPU或記憶體使用率過高導致網站無法訪問網站記憶體
- win10怎麼減少cpu使用率_win10cpu使用率過高的解決方法Win10
- Win10系統中LSAISO程式CPU使用率過高如何解決Win10AI
- PostgreSQL DBA(88) - Linux(CPU使用率 vs 平均負載)SQLLinux負載
- 在Unity中檢測死迴圈和卡死Unity
- 一次線上死迴圈的排查
- CPU 使用率低高負載的原因,看看這篇!負載
- 效能分析(2)- 應用程式 CPU 使用率過高案例
- 恆訊科技分析:如何解決SQL Server CPU使用率過高的問題?SQLServer
- 如何在 Linux 中找出 CPU 佔用高的程序Linux
- 熟悉 Vue ?你能解釋這個死迴圈嗎?Vue
- [BUG反饋]function get_parent_category() 死迴圈FunctionGo
- cmd執行python死迴圈怎麼解決Python
- 那些坑你沒商量的程式碼死迴圈
- kubectl 如何檢視 node、pod 的 cpu、RAM 使用率?
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 案例:系統的 CPU 使用率很高,但為啥卻找不到高 CPU 的應用?
- python面試題之“該死的for迴圈系列”(二)Python面試題
- 迴圈高階綜合練習
- 程式碼日數:高階迴圈
- Linux雜談:程式鎖核+實時執行緒導致的讀寫鎖死迴圈Linux執行緒
- 效能分析(5)- 軟中斷導致 CPU 使用率過高的案例
- linux系統for迴圈小指令碼Linux指令碼
- 關於如何跳出迴圈?
- for 迴圈與 while 迴圈While
- while迴圈 case迴圈While