컨테이너에서 진단 정보 수집

다른 시나리오에서 .NET Core 문제를 진단하는 데 유용한 진단 도구를 Docker 컨테이너에서도 사용할 수 있습니다. 다만 일부 도구를 컨테이너에서 사용하려면 특별한 단계가 필요합니다. 이 문서에서는 Docker 컨테이너에서 성능 추적을 수집하고 덤프를 수집하는 도구를 사용하는 방법을 설명합니다.

컨테이너에서 .NET CLI 도구 사용

이 문서의 적용 대상: ✔️ .NET Core 3.1 SDK 이상 버전

.NET Core 전역 CLI 진단 도구(dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitordotnet-trace)는 다양한 환경에서 작동하도록 설계되었으며 모두 Docker 컨테이너에서 직접 작동해야 합니다. 따라서 이러한 도구는 컨테이너에서 .NET Core 3.1 이상을 대상으로 하는 .NET Core 시나리오에 대한 진단 정보를 수집하는 데 기본 설정되는 방법입니다.

이전 단락의 링크에서 단일 파일 변형을 다운로드하여 .NET SDK 없이 이러한 도구를 설치할 수도 있습니다. 이러한 설치에는 .NET 런타임 버전 3.1 이상의 전역 설치가 필요하며, 이는 .NET 설치 설명서에 규정된 방법을 따르거나 공식 런타임 컨테이너를 사용하여 얻을 수 있습니다.

사이드카 컨테이너에서 .NET Core 전역 CLI 도구 사용

.NET Core 전역 CLI 진단 도구를 사용하여 다른 컨테이너의 프로세스를 진단하려면 다음과 같은 추가 요구 사항을 염두에 두어야 합니다.

  1. 사이드카 컨테이너의 도구가 대상 컨테이너의 프로세스에 액세스할 수 있도록 컨테이너가 프로세스 네임스페이스를 공유해야 합니다.
  2. .NET Core 전역 CLI 진단 도구는 .NET Core 런타임이 /tmp 디렉터리에 쓰는 파일에 액세스해야 하므로 볼륨 탑재를 통해 대상 컨테이너와 사이드카 컨테이너가 /tmp 디렉터리를 공유해야 합니다. 이것은 예를 들어 컨테이너가 공통 볼륨 또는 Kubernetes emptyDir 볼륨을 공유하도록 하면 가능합니다. /tmp 디렉터리를 공유하지 않고 사이드카 컨테이너에서 진단 도구를 사용하려고 하면 “호환되는 .NET 런타임 실행 중 아님”이라는 프로세스에 대한 오류가 표시됩니다.

컨테이너에서 PerfCollect 사용

이 도구의 적용 대상: ✔️ .NET Core 2.1 이상 버전

PerfCollect 스크립트는 성능 추적을 수집하는 데 유용하며, .NET Core 3.0 이전에 추적을 수집하는 데 권장되는 도구입니다. 컨테이너에서 PerfCollect를 사용하는 경우 다음 요구 사항을 염두에 두세요.

  • PerfCollect에는 perf 도구를 실행하기 위한 추가 기능이 필요합니다. 필요한 최소 기능 집합은 PERFMONSYS_PTRACE입니다. 일부 환경에는 SYS_ADMIN이 필요합니다. 필요한 기능을 갖춘 컨테이너를 시작합니다. 최소 집합이 작동하지 않으면 전체 집합을 사용해 보세요.

  • PerfCollect는 프로파일링하는 앱이 시작하기 전에 일부 환경 변수를 설정해야 합니다. 이러한 변수는 Dockerfile에서 또는 컨테이너를 시작할 때 설정할 수 있습니다. 이러한 변수는 일반적인 프로덕션 환경에서 설정하면 안 되므로 프로파일링될 컨테이너를 시작할 때 추가하는 것이 일반적입니다. PerfCollect에 필요한 두 변수는 다음과 같습니다.

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

참고 항목

.NET 7로 앱을 실행하는 경우 이전 환경 변수 외에 DOTNET_EnableWriteXorExecute=0도 설정해야 합니다.

참고 항목

.NET 6은 .NET 런타임 동작을 구성하는 환경 변수에 대해 COMPlus_ 대신 접두사 DOTNET_을 표준화합니다. 그러나 COMPlus_ 접두사도 계속 작동합니다. 이전 버전의 .NET 런타임을 사용하는 경우에도 환경 변수에 COMPlus_ 접두사를 사용해야 합니다.

사이드카 컨테이너에서 PerfCollect 사용

한 컨테이너에서 PerfCollect를 실행하여 다른 컨테이너의 .NET Core 프로세스를 프로파일링하려는 경우 다음 차이를 제외하면 환경은 거의 동일합니다.

  • 이전에 언급한 환경 변수( DOTNET_PerfMapEnabled, DOTNET_EnableEventLog)는 대상 컨테이너(PerfCollect를 실행하는 컨테이너가 아님)에 대해 설정해야 합니다.
  • PerfCollect를 실행하는 컨테이너에는 SYS_ADMIN 기능이 있어야 합니다(대상 컨테이너가 아님).
  • 두 컨테이너는 프로세스 네임스페이스를 공유해야 합니다.