资源监视

资源监视涉及在指定时间段内持续度量资源利用率。 Microsoft.Extensions.Diagnostics.ResourceMonitoring NuGet 包提供了一系列定制 API,专用于监视 .NET 应用程序的资源利用率。

IResourceMonitor 接口提供了用于检索有关进程资源利用率的实时信息的方法。 此接口支持检索与 CPU 和内存使用情况相关的数据,并且当前与 Windows 和 Linux 平台兼容。 默认情况下,所有资源监视诊断信息会发布到 OpenTelemetry,因此无需自行手动发布。

此外,资源监视库会报告各种诊断指标。 有关详细信息,请参阅诊断指标:Microsoft.Extensions.Diagnostics.ResourceMonitoring

示例资源监视使用情况

以下示例演示了如何使用 IResourceMonitor 接口检索有关当前进程的 CPU 和内存使用情况的信息。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring;
using Microsoft.Extensions.Logging;
using Spectre.Console;

var services = new ServiceCollection()
    .AddLogging(static builder => builder.AddConsole())
    .AddResourceMonitoring();

var provider = services.BuildServiceProvider();

var monitor = provider.GetRequiredService<IResourceMonitor>();

前面的代码:

重要

Microsoft.Extensions.Diagnostics.ResourceMonitoring 包会假定使用者将向 Microsoft.Extensions.Logging 包注册日志记录提供程序。 如果未注册日志记录,则调用 AddResourceMonitoring 将引发异常。 此外,可以按照指南Microsoft.Extensions.Diagnostics.ResourceMonitoring类别配置Debug日志级别来启用内部库日志记录。

此时,使用 IResourceMonitor 实现时,将使用 IResourceMonitor.GetUtilization 方法请求资源利用率。 GetUtilization 方法会返回 ResourceUtilization 实例,其中包含以下信息:

使用 Spectre.Console 扩展资源监视

扩展此示例后,可以利用 Spectre.Console,这是一个备受推崇的 .NET 库,旨在简化具有视觉吸引力的跨平台控制台应用程序的开发。 借助 Spectre,你将能够以表格格式呈现资源利用率数据。 以下代码演示了如何使用 IResourceMonitor 接口访问有关当前进程的 CPU 和内存使用情况的详细信息,然后在表中显示此数据:

await StartMonitoringAsync(monitor, token);

async Task StartMonitoringAsync(IResourceMonitor monitor, CancellationToken cancellationToken)
{
    var table = new Table()
        .Centered()
        .Title("Resource Monitoring", new Style(foreground: Color.Purple, decoration: Decoration.Bold))
        .Caption("Updates every three seconds. *GTD: Guaranteed ", new Style(decoration: Decoration.Dim))
        .RoundedBorder()
        .BorderColor(Color.Cyan1)
        .AddColumns(
        [
            new TableColumn("Time").Centered(),
            new TableColumn("CPU %").Centered(),
            new TableColumn("Memory %").Centered(),
            new TableColumn("Memory (bytes)").Centered(),
            new TableColumn("GTD / Max Memory (bytes)").Centered(),
            new TableColumn("GTD / Max CPU (units)").Centered(),
        ]);

    await AnsiConsole.Live(table)
        .StartAsync(async ctx =>
        {
            var window = TimeSpan.FromSeconds(3);
            while (cancellationToken.IsCancellationRequested is false)
            {
                var utilization = monitor.GetUtilization(window);
                var resources = utilization.SystemResources;

                table.AddRow(
                    [
                        $"{DateTime.Now:T}",
                        $"{utilization.CpuUsedPercentage:p}",
                        $"{utilization.MemoryUsedPercentage:p}",
                        $"{utilization.MemoryUsedInBytes:#,#}",
                        $"{resources.GuaranteedMemoryInBytes:#,#} / {resources.MaximumMemoryInBytes:#,#}",
                        $"{resources.GuaranteedCpuUnits} / {resources.MaximumCpuUnits}",
                    ]);

                ctx.Refresh();
                await Task.Delay(window);
            }
        });

    Console.CancelKeyPress += (_, e) =>
    {
        e.Cancel = true;
        cancellationTokenSource.Cancel();
    };
}

前面的代码:

  • 创建取消令牌源和取消令牌。
  • 创建一个新 Table 实例,并使用标题、描述文字和列对其进行配置。
  • 执行 Table 实例的实时呈现,从而传入每三秒调用一次的委托。
  • IResourceMonitor 实例获取当前资源利用率信息,并将其显示为 Table 实例中的新行。

下面是上述代码的输出示例:

资源监视应用输出示例。

有关此示例的源代码,请参阅资源监视示例

Kubernetes 探测

除了资源监视之外,存在于 Kubernetes 群集中的应用还会通过诊断探测来报告其运行状况。 Microsoft.Extensions.Diagnostics.Probes NuGet 包为 Kubernetes 探测提供支持。 它会外部化各种运行状况检查,以便与各种 Kubernetes 探测保持一致,例如:

  • 运行情况
  • 就绪情况
  • 启动

该库可将当前应用运行状况传达给 Kubernetes 托管环境。 如果进程报告处于不正常状态,Kubernetes 不会向其发送任何流量,从而提供恢复或终止的进程时间。

要添加对 Kubernetes 探测的支持,请添加对 Microsoft.Extensions.Diagnostics.Probes 的包引用。 在 IServiceCollection 实例上,调用 AddKubernetesProbes

另请参阅