网站放上服务器一段时间后,占用CPU会非常高,导致网站访问速度变得非常缓慢。在网站变慢时抓取了几次dump之后,发现线程47占用CPU时间非常厉害。输入如下命令,得到如下内容
0:083> ~47k Child-SP RetAddr Call Site 00000000`08eceb40 000007fe`f12823af mscorwks!SVR::gc_heap::relocate_survivors_in_plug+0x3c 00000000`08ecebd0 000007fe`f12824f6 mscorwks!SVR::gc_heap::relocate_survivors_in_brick+0x3f 00000000`08ecec00 000007fe`f1279974 mscorwks!SVR::gc_heap::relocate_survivors+0x106 00000000`08ecec60 000007fe`f18842df mscorwks!SVR::gc_heap::relocate_phase+0xc4 00000000`08ecece0 000007fe`f132337d mscorwks!SVR::gc_heap::plan_phase+0x9ff 00000000`08ecee40 000007fe`f1886d85 mscorwks!SVR::gc_heap::gc1+0x6d 00000000`08eceea0 000007fe`f18e9acf mscorwks!SVR::gc_heap::garbage_collect+0x2f5 00000000`08ecef10 000007fe`f1343553 mscorwks!SVR::gc_heap::gc_thread_function+0x7f 00000000`08ecef70 00000000`7751652d mscorwks!SVR::gc_heap::gc_thread_stub+0x93 00000000`08ecf9c0 00000000`7764c541 kernel32!BaseThreadInitThunk+0xd 00000000`08ecf9f0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
上面的确是GC问题,但是不知道下一步该怎么定位到代码了。有多个GC线程都在疯狂使用CPU,程序Virtual bytes 8G左右,但是实际的内存是1G多。服务器是24G内存,就算真的占用了这么多,也不至于变慢啊。
再来一个,好多线程都在
0:047> ~83s ntdll!ZwWaitForSingleObject+0xa: 00000000`776712fa c3 ret 0:083> ~84s ntdll!ZwWaitForSingleObject+0xa: 00000000`776712fa c3 ret
问题已解决,分配大对象引起GC关闭,感谢各位!
在做垃圾回收,如果垃圾回收占用时间较多的话,可能原因包括,大对象较多,被回收的对象释放非托管资源缓慢,内存泄漏。
大对象不多,超过0.5M的就3个,请教下下一步应该怎么定位问题,现在只知道是GC频繁引起的CPU占用飙升。
什么命令能够查看是那个托管代码引起线程47的CPU占用呢?万分感谢!
看不懂如果是CPU间歇性变高,那一般是GC在回收了