資源監視
資源監視涉及在指定期間內持續測量資源使用率。 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>();
上述 程式碼:
- 具現化一個新的 ServiceCollection 執行個體,鏈結對 AddLogging 和 AddResourceMonitoring 擴充方法的呼叫。
- 從
ServiceCollection
執行個體中建置一個新的 ServiceProvider 執行個體。 - 從
ServiceProvider
執行個體中取得 IResourceMonitor 介面的執行個體。
重要
Microsoft.Extensions.Diagnostics.ResourceMonitoring 套件假設取用者會向 Microsoft.Extensions.Logging
套件註冊記錄提供者。 如果您未註冊記錄,對 AddResourceMonitoring
的呼叫將會擲回例外狀況。 此外,您可以根據Debug
指南設定類別的Microsoft.Extensions.Diagnostics.ResourceMonitoring
記錄層級,以啟用內部連結庫記錄。
此時,搭配 IResourceMonitor
實作,您將使用 IResourceMonitor.GetUtilization 方法要求資源使用率。 GetUtilization
方法會傳回包含下列資訊的 ResourceUtilization 執行個體:
- ResourceUtilization.CpuUsedPercentage:CPU 使用量 (以百分比表示)。
- ResourceUtilization.MemoryUsedPercentage:記憶體使用量 (以百分比表示)。
- ResourceUtilization.MemoryUsedInBytes:記憶體使用量 (以位元組為單位)。
- ResourceUtilization.SystemResources:系統資源。
- SystemResources.GuaranteedMemoryInBytes:保證的記憶體 (以位元組為單位)。
- SystemResources.MaximumMemoryInBytes:最大記憶體 (以位元組為單位)。
- SystemResources.GuaranteedCpuUnits:單位中保證的 CPU。
- SystemResources.MaximumCpuUnits:單位中的最大 CPU。
使用 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。