1. 讲故事
上一篇我们聊到了如何调试.NET Native AOT 程序,这是研究一个未知领域知识的入口,这篇我们再来看下如何对 Native AOT 程序进行轻量级的APM监控,当然这里的轻量级更多的是对 AOT 中的coreclr内容的挖掘。
1. 一个简单的例子
用一个不断的往内存中囤积数据的例子来演示吧,然后观察内存的趋势变化,参考代码如下:
这里要注意的是,AOT在 ilc 编译的过程中会采用,言外之意就是 默认是不加入的,这个组件的源码在 目录下,主要是采用 ipc 的方式与接收者进行通讯。
如果有点懵的话可以简单的理解成这东西是,msdn 上也给了一张对比图,参考如下:
说了这么多,言外之意就是要把 保留,方式就是在 csproj 中配置 EventSourceSupport =true 即可,参考如下:
接下来用 进行 public 发布,参考如下:
程序启动好之后,接下来用来洞察一下程序的托管堆,CPU 等各种指标,安装方式可以参考链接:https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters
从上图中我们确实也真真切切的看到了进程的各个指标,有些朋友可能会好奇,如果我没开 EventPipe还能挖到这些信息吗?这当然是可以的,不过这就需要你对 coreclr 底层有一定的了解度了。
2. 如何用windbg去挖
首先要知道的是sos 在 aot 中用不了的,但用不了不代表我们没办法,因为 sos 也是从 coreclr 中挖取的数据,那为什么我就不能自己去挖呢?
- 如何挖托管堆数据
sos 是在coreclr 的 全局数组中挖取的数据,言外之意我也可以手工的去挖,然后拼凑成托管堆 ,参考如下:
这个数组就对应着 0代,1代,2代,LOH代,POH代 等数据。
- 如何知道当前机器的内存总量和CPU核心数
这个数据在dump分析过程中非常重要,它可以表示当前机器的robust能力,这些数据在 coreclr 的 和 全局变量中,参考如下:
可以看到当前机器的内存总量是 31G(32G),同时机器的CPU=12。
- 如何挖掘GC触发信息
捕获gc的触发可以有效的获取gc的触发代,触发原因,以及当前的托管堆静态和动态阈值情况,对我们洞察程序非常有帮助,那如何捕获呢?可以对gc触发的必经之路上下一个断点即可,比如: 。
接下来洞察内部的 gc_heap::settings 结构,信息如下:
从上面的输出中可以看到当前GC的信息特别多:0xd次触发,并且是压缩式的回收,触发的是 0代,原因是代满了,当前机器还可使用的内存是 16G。
虽然 .NET AOT 越来越成熟,但目前还是不能对 gcheap 进行sos级的分析,暂时只能手工的挖掘整理,不过我相信在 .NET10 或者 11 上应该能够得到完整的支持,毕竟这势不可挡!
到此这篇traceparts(traceparts零件库)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/13962.html