컨테이너에서 진단 정보 수집
다른 시나리오에서 .NET 문제를 진단하는 데 유용한 동일한 진단 도구가 Docker 컨테이너에서도 작동합니다. 다만 일부 도구를 컨테이너에서 사용하려면 특별한 단계가 필요합니다. 이 문서에서는 Docker 컨테이너에서 성능 추적을 수집하고 덤프를 수집하는 도구를 사용하는 방법을 설명합니다.
컨테이너에서 .NET CLI 도구 사용
이 문서의 적용 대상: ✔️ .NET Core 3.1 SDK 이상 버전
.NET 글로벌 CLI 진단 도구(dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor 및 dotnet-trace)는 다양한 환경에서 작동하도록 설계되었으며 모두 Docker 컨테이너에서 직접 작동해야 합니다. 따라서 이러한 도구는 컨테이너에서 .NET Core 3.1 이상을 대상으로 하는 .NET 시나리오에 대한 진단 정보를 수집하는 데 선호되는 방법입니다.
이전 단락의 링크에서 단일 파일 변형을 다운로드하여 .NET SDK 없이 이러한 도구를 설치할 수도 있습니다. 이러한 설치에는 .NET 런타임 버전 3.1 이상의 전역 설치가 필요하며, 이는 .NET 설치 설명서에 규정된 방법을 따르거나 공식 런타임 컨테이너를 사용하여 얻을 수 있습니다.
사이드카 컨테이너에서 .NET Core 전역 CLI 도구 사용
.NET 글로벌 CLI 진단 도구를 사용하여 다른 컨테이너의 프로세스를 진단하려는 경우 다음 추가 요구 사항을 염두에 두세요:
- 사이드카 컨테이너의 도구가 대상 컨테이너의 프로세스에 액세스할 수 있도록 컨테이너가 프로세스 네임스페이스를 공유해야 합니다.
- .NET 글로벌 CLI 진단 도구는 .NET 런타임이 /tmp 디렉터리에 쓰는 파일에 액세스해야 하므로 볼륨 마운트를 통해 대상과 사이드카 컨테이너 간에 /tmp 디렉터리를 공유해야 합니다. 이것은 예를 들어 컨테이너가 공통 볼륨 또는 Kubernetes emptyDir 볼륨을 공유하도록 하면 가능합니다. /tmp 디렉터리를 공유하지 않고 사이드카 컨테이너에서 진단 도구를 사용하려고 하면 “호환되는 .NET 런타임 실행 중 아님”이라는 프로세스에 대한 오류가 표시됩니다.
컨테이너에 PerfCollect
사용
이 도구의 적용 대상: ✔️ .NET Core 2.1 이상 버전
PerfCollect
스크립트는 성능 추적을 수집하는 데 유용하며, .NET Core 3.0 이전에 추적을 수집하는 데 권장되는 도구입니다. 컨테이너에서 PerfCollect
를 사용하는 경우 다음 요구 사항을 염두에 두세요.
PerfCollect
에는perf
도구를 실행하기 위한 추가 기능이 필요합니다. 필요한 최소 기능 집합은PERFMON
및SYS_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 프로세스를 프로파일링하려는 경우에도 환경은 거의 동일합니다. 차이점은 다음과 같습니다.
- 이전에 언급한 환경 변수(
DOTNET_PerfMapEnabled
,DOTNET_EnableEventLog
)는 대상 컨테이너(PerfCollect
를 실행하는 컨테이너가 아님)에 대해 설정해야 합니다. PerfCollect
를 실행하는 컨테이너에는SYS_ADMIN
기능이 있어야 합니다(대상 컨테이너가 아님).- 두 컨테이너는 프로세스 네임스페이스를 공유해야 합니다.
.NET