zoukankan      html  css  js  c++  java
  • .NET必知的EventCounters性能指标监视器

    在.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 Filesdotnetdotnet.exe
         16324 dotnet C:Program Filesdotnetdotnet.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($"	Name = "{eventData.PayloadNames[i]}" Value = "{payloadString}"");
                }
                Console.WriteLine("
    ");
            }
    

    参考

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

  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/yyfh/p/13972594.html
Copyright © 2011-2022 走看看