다음을 통해 공유


리소스 모니터링

리소스 모니터링에는 지정된 기간 동안 리소스 사용률을 지속적으로 측정하는 작업이 포함됩니다. 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>();

앞의 코드가 하는 역할은 다음과 같습니다.

Important

Microsoft.Extensions.Diagnostics.ResourceMonitoring 패키지는 소비자가 Microsoft.Extensions.Logging 패키지에 로깅 공급자를 등록한다고 가정합니다. 로깅을 등록하지 않으면 AddResourceMonitoring 호출에서 예외가 throw됩니다.

이 시점에서 IResourceMonitor 구현에서는 IResourceMonitor.GetUtilization 메서드를 사용하여 리소스 사용률을 요청하게 됩니다. GetUtilization 메서드는 다음 정보가 포함된 ResourceUtilization 인스턴스를 반환합니다.

Spectre.Console로 리소스 모니터링 확장

이 예를 확장하면 시각적으로 매력적인 플랫폼 간 콘솔 애플리케이션 개발을 간소화하도록 설계된 잘 알려진 .NET 라이브러리인 Spectre.Console을 활용할 수 있습니다. 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 인스턴스를 만듭니다.
  • 3초마다 호출되는 대리자를 전달하여 Table 인스턴스의 라이브 렌더링을 수행합니다.
  • IResourceMonitor 인스턴스에서 현재 리소스 사용률 정보를 가져와 Table 인스턴스에 새 행으로 표시합니다.

다음은 이전 코드의 출력 예입니다.

Example Resource Monitoring app output.

이 예의 소스 코드는 리소스 모니터링 샘플을 참조하세요.

Kubernetes 프로브

리소스 모니터링 외에도 Kubernetes 클러스터 내에 존재하는 앱은 진단 프로브를 통해 상태를 보고합니다. Microsoft.Extensions.Diagnostics.Probes NuGet 패키지는 Kubernetes 프로브에 대한 지원을 제공합니다. 이는 다양한 Kubernetes 프로브에 맞춰 다양한 상태 확인을 외부화합니다. 예를 들면 다음과 같습니다.

  • 활동성
  • 준비
  • Startup 클래스

라이브러리는 앱의 현재 상태를 Kubernetes 호스팅 환경에 전달합니다. 프로세스가 비정상으로 보고되면 Kubernetes는 프로세스에 트래픽을 보내지 않고 복구 또는 종료할 프로세스 시간을 제공합니다.

Kubernetes 프로브에 대한 지원을 추가하려면 Microsoft.Extensions.Diagnostics.Probes에 패키지 참조를 추가합니다. IServiceCollection 인스턴스에서 AddKubernetesProbes를 호출합니다.

참고 항목