When the DPC uses too much CPU

现在用联想的一个X200,最近发现CPU总是不闲着,用电池消耗的也特别快,用Process Explorer看了一下,报告说DPC占很多的CPU时间:

dpc

这个很不懂,要是一般的进程,杀掉就可以了,比如传说中的firefox就喜欢吃内存和CPU(其实很多时候是flash闹的),DPC叫 Deferred Procedure Call, 是Windows用来处理中断的玩意,这个东西咋办呢?

研究了一下发现 Windows DDK 的 tracelog 不错。 Windows DDK是驱动开发的工具包,其实我只要里面的一个tracelog.exe,和tracerpt.exe,网上找不到,害得我去当了最新的Windows DDK 7.0。参见这里:How much time is your driver spending in its DPCs and ISRs?

运行:

tracelog -start  -f test01.etl -dpcisr -UsePerfCounter
tracelog -stop
tracerpt test01.etl -report d.txt -df

结果如下(节选):

DPC processor utilization for the whole trace
+--------------------------------------------------------+
| Processor   Utilization         Module   Address       |
+--------------------------------------------------------+
|         0        18.34%   ntkrnlpa.exe  8050327A       |
|         1         0.00%   ntkrnlpa.exe  8050327A       |
|         0        16.92%    chdau32.sys  A5CC2DC6       |
|         1         0.00%    chdau32.sys  A5CC2DC6       |

ntkrnlpa.exe没啥好看的,windows kernel,看看chdau32.sys吧,在同一个文件中:

+--------------------------------------------------------------------------------+
| Distribution of chdau32.sys (A5CC2DC6) DPC execution times for the whole trace |
+--------------------------------------------------------------------------------+
| Lower Bound         Upper Bound            Count             Percent           |
+--------------------------------------------------------------------------------+
|           0                   1                0                0.00%          |
.......
|          50                 100                0                0.00%          |
|         100                 250                0                0.00%          |
|         250                 500                0                0.00%          |
|         500                1000              636               13.94%          |
|        1000                2500             3927               86.06%          |
+--------------------------------------------------------------------------------+
|                                             4563              100.00%          |
+--------------------------------------------------------------------------------+

这个肯定是有问题的,因为windows建议DPC的处理不能超过100ms,这个显然超过了很多,所以这就是罪魁祸首了。这个驱动属于Conexant 20561 SmartAudio HD, Disable掉这个驱动,果然CPU就没有人占用了!DPC也基本就是0了。
这个驱动别的地方没有,只有联想的网站上有,更新到最新的,还是不能解决这个问题,只好Disable他了。不过有趣的是,当我播放一点音乐或者弄点什么声音的时候,它的DPC处理就很好!真有意思……

另外还有两个工具,一个是DPC Latency Check的工具,这个工具显示目前系统的Latency,Latency高的系统播放电影、声音的时候就会产生不连贯的现象。我的系统默认就是黄色的!但是如果disable了Conexant 20561的该死的声卡,或者播放点音乐,它就变成绿色的了。

另外一个是微软的RATTv3,这个提供跟tracelog很类似的功能,不过结果不是很准确,也能弄出点结果来。而且,它还有GUI呢——一个Tray Icon.

发表评论

电子邮件地址不会被公开。 必填项已用*标注