前言
在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各种指标和请求链路,让你知道系统当前的状态和值得优化的点,另外能帮助你发现应用程序的异常,帮助你更方便的定位问题。
对于.NET这样带GC(Garbage Collector 垃圾回收器)的平台来说,GC的指标也尤为重要,采集可以帮助我们分析内存泄漏、优化系统性能等等。在公司内部已经可以采集比较全面的.NET GC指标,如下图所示。
在绝大多数场景它能满足要求,但是如果遇到某时某刻P95延时突然增大,异步任务突然超时,我们想排查这些异常是否因为GC的STW Time(Stop The World Time 指GC运行过程中所有线程被挂起的时间)过长导致的,就没有办法了,因为目前没有采集这些指标。
所以本文就带大家了解一下,如何采集.NET GC STW Time。
方法
如.NET内存性能分析指南中提到的一样,.NET Runtime在运行过程中会发布很多事件,这些事件代表了当前Runtime的运行状态,同样GC在运行过程中也会发布很多事件,我们可以使用 PerfView
工具来收集这样的一些事件。下面是 WorkStationGC
发生GC时的一个事件序列。
Microsoft-Windows-DotNETRuntime/GC/SuspendEEStart //开始暂停托管线程运行 Microsoft-Windows-DotNETRuntime/GC/SuspendEEStop //暂停托管线程完成 Microsoft-Windows-DotNETRuntime/GC/Start // GC开始回收 Microsoft-Windows-DotNETRuntime/GC/Stop // GC回收结束 Microsoft-Windows-DotNETRuntime/GC/RestartEEStart //恢复之前暂停的托管线程 Microsoft-Windows-DotNETRuntime/GC/RestartEEStop //恢复托管线程运行完成
PS: 所有的事件都可以在