在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener.

使用dotnet-counters

dotnet-counters是一个性能指标监视工具,用于临时运行状态监视和初级性能调查。它可以观察通过 EventCounter API发布的性能计数器值。例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中引发的异常率,以了解在使用 PerfView 或 dotnet-trace 深入调查更严重的性能问题之前是否有任何可疑操作。

-- 摘自 dotnet-counters

命令

  • dotnet-counters collect

  • dotnet-counters list

  • dotnet-counters monitor

  • dotnet-counters ps


安装dotnet-counters CLI工具,可通过如下命令:

dotnet tool install --global dotnet-counters

更新命令如下所示:

dotnet tool update dotnet-counters --global

安装完工具之后,我们可以进行查看可监视的进程:

dotnet-counters ps12268 dotnet C:\Program Files\dotnet\dotnet.exe16324 dotnet C:\Program Files\dotnet\dotnet.exe

获取到进程ID后,我们可以通过如下命令进行监视:

dotnet-counters monitor -p 12268

监视特定的EventSources,可以提供以一个空格分隔开的EventSources列表,如下所示:

dotnet-counters monitor -p 12268 System.Runtime MyEventSource

在默认的情况下,我们对于EventSource监视时,它捕获的是所有的计数器。如果我们想单独跟踪某几个计数器那么可通过如下方式进行指定:

dotnet-counters monitor -p 12268 System.Runtime[cpu-usage,gc-heap-size]

对于监视器我们可以设置刷新频率,可以通过--refresh-interval参数来设置:

dotnet-counters monitor -p 12268  --refresh-interval 3   System.Runtime[cpu-usage,gc-heap-size]

代码中的EventCounters

EventListener提供了进程内(In-Process)订阅和消费日志事件的方式,EventListener可以接收到来自EventSource分发的日志事件。这些事件内涵盖了GC、JIT、ThreadPool和interop的行为。

创建EventListener

在下面我们进行重写OnEventSourceCreated方法,该方法会在调用时接收一个EventSource对象,我们可以通过EventSource对象的Name属性去筛选我们感兴趣的日志事件,筛选后我们需要显示的调用EnableEvents方法向感兴趣的日志事件发起订阅。

    internal sealed class MyEventListener : EventListener{protected override void OnEventSourceCreated(EventSource eventSource){if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime")){EnableEvents(eventSource, EventLevel.Verbose, (EventKeywords)(-1));}}}

事件消费

接下来我们需要进行重写OnEventWritten,关于日志事件相关的信息会被封装成一个EventWrittenEventArgs对象,我们不仅可以通过它获取当前日志事件的所有信息,而且我们还可以进行获取到EventSource对象。Payload包含了不同属性的值ReadOnlyCollection<object>, 而PayLoadNames ReadOnlyCollection<object>中包含了不同的属性名称,我们现在可以通过如下方式进行获取这些属性:

        protected override void OnEventWritten(EventWrittenEventArgs eventData){Console.WriteLine($"ThreadID = {eventData.OSThreadId} ID = {eventData.EventId} Name = {eventData.EventName}");for (int i = 0; i < eventData.Payload.Count; i++){string payloadString = eventData.Payload[i]?.ToString() ?? string.Empty;Console.WriteLine($"\tName = \"{eventData.PayloadNames[i]}\" Value = \"{payloadString}\"");}Console.WriteLine("\n");}

参考

https://stackoverflow.com/questions/61081063/get-total-number-of-allocations-in-c-sharp

.NET必知的EventCounters性能指标监视器相关推荐

  1. 程序猿必知英语词汇总结

    程序员必知1700英语单词 这篇文章对英语基础不好的小白特别有帮助 转自:https://blog.csdn.net/z770816239/article/details/80043967 1. fi ...

  2. Android 性能优化必知必会(2020-5-16)

    做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以 ...

  3. MySQL必知必会01:一个完整的存储过程

    阅读整理自<MySQL 必知必会>- 朱晓峰,详细内容请登录 极客时间 官网购买专栏. 文章目录 创建 MySQL 数据库 确认字段 创建数据表 查看表结构 查看数据库中的表 设置主键 插 ...

  4. 程序员必知8大排序3大查找(三)

    前两篇 <程序员必知8大排序3大查找(一)> <程序员必知8大排序3大查找(二)> 三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表(以后谈) 一.顺序查找的基 ...

  5. Android 开发者必知的开发资源

    英文原文:Bongzimo  翻译: ImportNew-黄小非 译文链接:http://www.importnew.com/3988.html Android 开发者必知的开发资源 随着Androi ...

  6. Python工程师求职必知的经典面试题

    最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学 ...

  7. servlet必知细节(三)-- DefaultServlet

    servlet必知细节(三)-- DefaultServlet 缺省servlet:org.apache.catalina.servlets.DefaultServlet,作用是处理其他servlet ...

  8. servlet必知细节(二)--servlet执行过程

    servlet必知细节(二)--servlet执行过程 我们知道,servlet没有main函数,那么,servlet是怎么调用的呢? 实际上,servlet 是由tomcat调用的,tomcat调用 ...

  9. servlet必知细节(一)

    servlet必知细节(一) 今天复习了一下servlet,有过一些编程经验后,与最初学习servlet相比,对servlet理解的角度不同了,最初只是学习了如何写一个servlet,api怎么用,现 ...

最新文章

  1. bzoj1624:[Usaco2008 Open] Clear And Present Danger 寻宝之路
  2. Android面试题目之六---Handler,Looper和MessageQueue深入研究
  3. 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化
  4. php俩个字符串合并,php分割合并两个字符串的函数实例
  5. GetModuleFileName 获取当前进程主模块完整路径
  6. linux下oracle数据库升级,Oracle数据库在LinuxAS4升级
  7. HDU4577(2013年ACM杭州赛区邀请赛B题)
  8. 代码雨代码源复制_小程序基于Parser添加长按复制、代码高亮等功能
  9. 【LeetCode1046】最后一块石头的重量(堆heap)
  10. 这次,甘肃的老百姓办理就医再也不用等了
  11. 小众却顽强的编程语言 Erlang ,你了解多少?
  12. 为什么要学数据结构?| 原力计划
  13. Nssm Edit XXX
  14. SMART Utility for mac (硬盘检测工具)
  15. 12c emcc Algorithm negotiation fail
  16. idea更换源_在Intelij IDEA中修改阿里Maven源
  17. mysql sql 分析工具下载_DB Query Analyzer下载
  18. CATIA二次开发过程中几个问题
  19. python实现千牛客服自动回复语_千牛自动回复语大全
  20. 人工智能教学中的功利文化视野

热门文章

  1. 指派问题(匈牙利算法)
  2. C语言程序设计第三次作业
  3. 三:Java之Applet
  4. .net Repeater知识知多少
  5. JDeveloper中文乱码问题
  6. 从别的地方转来的 网址
  7. python3 tkinter电子书_Python3 Tkinter-Text
  8. 迁移聊天记录到Teams
  9. [PHP] 多表外连接性能测试及优化
  10. 苹果ios用js的Date()出现NaN问题解决办法