一、背景
运控软件在正常运行中,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时间片占用。