资源监视
资源监视涉及在指定时间段内持续度量资源利用率。 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>();
前面的代码:
- 实例化新的 ServiceCollection 实例,链接对扩展方法的 AddLogging 和 AddResourceMonitoring 的调用。
- 根据
ServiceCollection
实例生成一个新的 ServiceProvider 实例。 - 从
ServiceProvider
实例获取 IResourceMonitor 接口的实例。
重要
Microsoft.Extensions.Diagnostics.ResourceMonitoring 包会假定使用者将向 Microsoft.Extensions.Logging
包注册日志记录提供程序。 如果未注册日志记录,则调用 AddResourceMonitoring
将引发异常。 此外,可以按照指南为Microsoft.Extensions.Diagnostics.ResourceMonitoring
类别配置Debug
日志级别来启用内部库日志记录。
此时,使用 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。