一、背景
运控软件在正常运行中,CPU打到100%
;闲置时,CPU占用率仍然达到60%
。在系统限制时抓到的dump文件。
二、占用爆高分析
1. 使用!threadpool
查看实际CPU占用率
软件在闲置时,CPU占用率仍然达到了
61%
2. 使用`!runaway
查看线程CPU时间片使用情况
除0号主线程(UI线程)外,存在4个线程CPU时间片占用异常
3. 切换到指定线程,使用k
命令查看线程栈
以5号线程为例,其他线程类似。
-
使用
k
命令查看当前线程栈,考虑为单开线程循环执行某任务。
-
使用
!name2ee
查看SecsGemTemplate
对应的模块地址。
-
使用
!savemodule
导出模块代码。
-
反编译模块代码,查看
SecsGemTemplate.Open
中ConcurrentQueue<IReceive>.get_Count
对应代码逻辑。
-
发现
while
循环中,未添加Thread.Sleep
,导致一直占用CPU时间片。
三、解决方案
单开线程,执行while循环时,需添加Thread.Sleep
释放CPU时间片占用。