点击展开

行业资讯

如何获取GC(垃圾回收器)的STW(暂停)时间?
2022-07-05 08:48:22 | 来源:火狐体育官方登录开户 作者:火狐体育直播吧

  在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各种指标和请求链路,让你知道系统当前的状态和值得优化的点,另外能帮助你发现应用程序的异常,帮助你更方便的定位问题。

  对于样带GC(Garbage Collector 垃圾回收器)的平台来说,GC的指标也尤为重要,采集可以帮助我们分析内存泄漏、优化系统性能等等。在公司内部已经可以采集比较全面的.NET GC指标,如下图所示。

  在绝大多数场景它能满足要求,但是如果遇到某时某刻P95延时突然增大,异步任务突然超时,我们想排查这些异常是否因为GC的STW Time(Stop The World Time 指GC运行过程中所有线程被挂起的时间)过长导致的,就没有办法了,因为目前没有采集这些指标。

  如.NET内存性能分析指南中提到的一样,.NET Runtime在运行过程中会发布很多事件,这些事件代表了当前Runtime的运行状态,同样GC在运行过程中也会发布很多事件,我们可以使用 PerfView 工具来收集这样的一些事件。下面是 WorkStationGC 发生GC时的一个事件序列。

  而 SuspendEEStart(暂停托管线程运行) 到 RestartEEStop(恢复托管线程运行完成) 中经过的时间就是STW Time,我们只需要记录这两个事件的差值,就可以知道本次GC STW的时间有多长。

  BGC的过程比WorkStationGC复杂的很多,但是一样是测量这两个事件花费的时间来采集STW Time,本文不做过多介绍。

  那么我们知道通过计算哪两个指标的差值来获得STW时间,那么应该如何通过代码来采集呢?

  在实现这个需求时,我注意到.NET7有一个新的issue,直接提供了一个API,让我们可以获取到总的GC STW Time,我把重点的信息摘抄和翻译了一下。

  今天我们已经在GetGCMemoryInfo 公开了获取GC处理时间和暂停时间的百分比值的API。

  这个很有用,但是如果我只想要一个分子(即:程序运行以来总的GC暂停时间)。现在没有办法获取到。

  我看到这个API已经和最新的.NET7预览版一起发布,我们下载最新的.NET7 SDK,然后把项目改成.NET7,来试试这个API,代码如下所示:

  API统计的应该会更加准确,我们通过事件来获取多多少少有一点额外的开销,不过误差在可接受的范围内。

  上文中提到了两种方式来获取.NET GC STW Time,我们只需要稍加改造,就可以将STW监控的功能加入APM中,如下图表就是本地测试时采集的一些数据。

  当然通过 EventListener 还可以实现更多的APM信息的采集,大家有兴趣也可以研究看看。

火狐体育直播吧
火狐体育官方登录开户

火狐体育直播吧

联系电话:176 0301 6881

邮箱:sales@finscm.com

火狐体育官方登录开户