CLR垃圾回收导致高CPU占用率

 

最近刚看完《CLR Via C#》,正好碰上了一个关于垃圾回收的问题:
 
环境:
AMD Dual-core Processor x 4
Windows2003 Server SP2
IIS 6.0
 
现象:
当系统中某个高优先级的线程(基本优先级是13)100%占用一个核之后,所有其他7个核都被w3wp占用,CPU的使用率都是100%。
 
分析:
在高CPU情况下对w3wp做了个dump,从dump中看出所有线程都在进行垃圾回收。结合《CLR Via C#》中关于GC的介绍,有如下几点值得注意:
1. CLR的GC有两种工作模式:workstation和server模式。两种模式的切换可以通过如下链接的方法改动:
2. 在服务器上的IIS缺省工作在server模式下。这种模式会为每个CPU的核分配一个GC线程,从而让每个线程的GC行为表现一致。
3. GC线程工作在正常优先级上(通常是8)。
 
原因:
当某个GC线程抢不到CPU的时候,CLR会认为系统资源紧张(尽管这不是实际情况),然后让所有的GC线程开始工作,这样所有的CPU资源就被完全占用。
 
解决方案:
把IIS改成workstation模式。
 
备注:
在问题的调研过程中,我发现很多人都碰到过这种现象,而原因大部分都是和逻辑相关,也就是确实系统做了很多和内存相关的操作,从而使用了大量的CPU。而我的问题发生时系统什么都没有做,那个导致问题的高优先级线程就是一个死循环,和w3wp无任何交互。另外通过和微软的技术支持联系,他们说他们也是第一次碰到我的这种情况。所以我希望这里几下这个线索,希望对大家有所帮助。

 

你可能感兴趣的:(CLR垃圾回收导致高CPU占用率)