记一次 .NET 某电子病历 CPU 爆高分析
发布网友
发布时间:2024-09-28 18:21
我来回答
共1个回答
热心网友
时间:2024-10-02 07:51
某天,一位朋友找我解决程序中出现的CPU爆高问题。直接从问题入手,我们首先使用了!tp命令来验证CPU是否真的爆高。
结果显示CPU使用率高达96%,同时,有61个工作请求未处理,说明下游处理能力可能不足。接下来,我们利用!t -special命令来进一步确认是否是由于GC触发导致的线程频繁停顿。在检查中,我们发现在某一线程上出现了SuspendEE,这表明GC确实处于触发状态。为了更深入地了解问题,我们查看了该线程的非托管栈,发现GC线程正在执行名为gc_thread_function()的函数。通过观察GCSettings,我们发现触发原因是一次诱导式FullGC,原因是代码中调用了GC.Collect()方法。经过分析,发现是商业组件Spire.Pdf在Dispose时手动释放资源触发了此操作。通常,频繁的FullGC表示可能存在性能问题,我们通过查看全局变量full_gc_counts来确定其频率。计算后发现,在17分钟内,全共有113次FullGC发生。这是否算频繁,还需进一步分析。
除了GC的影响,我们还注意到线程池中有大量未处理的工作请求,可能由内部因素造成。通过使用!whttp命令来观察HttpContext,我们得到了两条关键信息。随后,我们将这些发现告知朋友,强调应*xxxLogOutputExcel导出的频率。
综上所述,问题的两个关键触发因素是GC频繁触发和内部工作请求积压。解决方法相对简单,即减少高频点击。同时,保持冷静,耐心解决问题,我们之间的合作会更加顺畅。