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

使用dotnet-counters

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

-- 摘自 dotnet-counters

命令


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

dotnet tool install --global dotnet-counters

更新命令如下所示:

dotnet tool update dotnet-counters --global

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

dotnet-counters ps
12268 dotnet C:\Program Files\dotnet\dotnet.exe
16324 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. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会--建立练习环境

    书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...

  3. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  4. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  5. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  6. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  7. Visual Studio (VS IDE) 你必须知道的功能和技巧 - 【.Net必知系列】

    前言 本文主要阐述一些Visual Studio开发下需要知道的少部分且比较实用的功能,也是很多人忽略的部分.一些不常用而且冷门的功能不在本文范围,当然本文的尾巴[.Net必知系列]纯属意淫,如有雷同 ...

  8. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  9. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

随机推荐

  1. TTL电平,CMOS电平,232/485电平,OC门,OD门基础知识

     1.RS232电平 或者说串口电平,有的甚至说计算机电平,所有的这些说法,指得都是计算机9针串口 (RS232)的电平,采用负逻辑, -15v ~ -3v 代表1 +3v ~ +15v 代表0 2. ...

  2. 0基础如何更快速入门Linux系统?学完Linux有哪些就业方向?

    Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布. 它的主要特性:Linux文件一切皆文件.完全开源免费. ...

  3. 【C语言/C++编程学习笔记】:通俗易懂讲解 - 链表!学不会?不存在的!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  4. 【C语言编程入门】Do you know 函数?不知道了吧,我来告诉你!

    ☆ 函数 在前面我们已经讲过了一些简单的函数,如程序的主函数main().标准输出函数printf().在C语言中,大多数功能都是依靠函数来实现的.But,你知道什么是函数吗?我猜你肯定不知道. 那么 ...

  5. lvs搭建dr负载均衡集群

    一,查看本地centos的版本: [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ...

  6. .Net Mvc学习——ASP.NET MVC中常用的ActionResult类型

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  7. 记2020年初对SimpleGUI源码的阅读成果

    2020春节,阅读了下SimpleGUI源码,我一直喜欢边阅读,边手绘图片,所以这里只贴几张图片. 一,什么是SimpleGUI ? https://gitee.com/Polarix/simpleg ...

  8. kettle学习笔记(三)— 定时任务的脚本执行

    kettle-定时任务 Kettle 的定时任务可以用kettle中的job工作来定时转换(缺点窗口不可关闭),同时也可以使用bat脚本来启动kettle的 '.ktr'转换. 注:这里对定时任务的时 ...

  9. 初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯

    初探RT-Thread系统在GD32E103x芯片上的使用,点亮LED灯 前言 ​ 随着中美贸易战的加剧,很多公司越来越重视使用国产技术的重要性.使用国产技术,一方面可规避国外对技术的封锁造成产品核心 ...

  10. CDH+Kylin三部曲之三:Kylin官方demo

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...