資源監視

資源監視涉及在指定期間內持續測量資源使用率。 Microsoft.Extensions.Diagnostics.ResourceMonitoring NuGet 套件提供專為監視 .NET 應用程式資源使用率量身打造的 API 集合。

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 的呼叫將會擲回例外狀況。

此時,搭配 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 執行個體中的新資料列。

以下是上述程式碼輸出的範例:

Example Resource Monitoring app output.

如需此範例的原始程式碼,請參閱資源監視範例

Kubernetes 探查

除了資源監視之外,Kubernetes 叢集內存在的應用程式也會透過診斷探查報告其健康情況。 Microsoft.Extensions.Diagnostics.Probes NuGet 套件提供 Kubernetes 探查的支援。 其會將符合各種 Kubernetes 探查的各種健康情況檢查外部化,例如:

  • 活躍度
  • 準備就緒
  • 啟動

程式庫會將應用程式目前的健康情況傳達給 Kubernetes 裝載環境。 如果流程回報為狀況不良,Kubernetes 不會將任何流量傳送至此流程,進而提供流程復原或終止的時間。

若要新增 Kubernetes 探查的支援,請新增 Microsoft.Extensions.Diagnostics.Probes 的套件參考。 在 IServiceCollection 執行個體上,呼叫 AddKubernetesProbes

另請參閱