En .NET, en realidad tenemos dos métodos comunes para el monitoreo de indicadores de rendimiento, uno es la herramienta CLI dotnet-counters
y el otro es a nivel de código EventListener
.
Utilice contadores de dotnet
dotnet-counters
Es una herramienta de monitoreo de indicadores de desempeño para el monitoreo temporal del estado de la operación y la investigación preliminar del desempeño. Puede observar el valor del contador de rendimiento publicado a través de la API de EventCounter . Por ejemplo, puede conducir rápidamente a un uso anormal de la CPU del monitor de velocidad o la aplicación .NET Core, para comprender el usoPerfView
odotnet-trace
si hay acciones sospechosas antes de una investigación exhaustiva de problemas de rendimiento más graves.
- de contadores de dotnet
mando
- los contadores de dotnet recopilan
- lista de contadores de dotnet
- monitor dotnet-counters
- contadores de dotnet ps
Para instalar la herramienta CLI dotnet-counters, puede utilizar el siguiente comando:
dotnet tool install --global dotnet-counters
El comando de actualización es el siguiente:
dotnet tool update dotnet-counters --global
Después de instalar la herramienta, podemos ver los procesos que se pueden monitorear:
dotnet-counters ps
12268 dotnet C:\Program Files\dotnet\dotnet.exe
16324 dotnet C:\Program Files\dotnet\dotnet.exe
Luego de obtener el ID del proceso, podemos monitorearlo con el siguiente comando:
dotnet-counters monitor -p 12268
Para supervisar específicos EventSources
, puede proporcionar una lista separada por un espacio EventSources
, como se muestra a continuación:
dotnet-counters monitor -p 12268 System.Runtime MyEventSource
Por defecto, cuando EventSource
monitoreamos, captura todos los contadores. Si queremos rastrear ciertos contadores individualmente, podemos especificarlos de la siguiente manera:
dotnet-counters monitor -p 12268 System.Runtime[cpu-usage,gc-heap-size]
Para el monitor, podemos configurar la frecuencia de actualización, que se puede configurar mediante --refresh-interval
parámetros:
dotnet-counters monitor -p 12268 --refresh-interval 3 System.Runtime[cpu-usage,gc-heap-size]
EventCounters en el código
EventListener
Proporciona una forma de suscribirse y consumir eventos de registro en proceso (En proceso) y EventListener
puede recibir EventSource
eventos de registro de la distribución. Estos eventos cubren el comportamiento de GC, JIT, ThreadPool e interoperabilidad.
创建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