Docker 환경에서 dotnet dump를 사용하는 방법은 일반적으로 다음과 같은 단계를 따릅니다. dotnet dump는 .NET 애플리케이션의 덤프 파일을 생성하고, 디버깅을 위한 정보를 제공하여 애플리케이션의 비정상 종료, 메모리 누수, 성능 문제 등을 분석할 수 있게 도와줍니다. Docker 컨테이너 내의 .NET 프로세스에 접근하여 덤프 파일을 생성하고, 해당 덤프 파일을 분석하는 방법을 알아보겠습니다.
1. Docker 컨테이너에 dotnet-dump 설치
Docker 컨테이너 내에서 dotnet-dump가 설치되어 있는지 확인하고, 설치되지 않았다면 수동으로 설치해야 합니다. 보통 Docker 이미지에 .NET SDK가 설치되어 있으면 사용할 수 있습니다.
Dockerfile에 다음과 같은 구문을 추가하여 dotnet-dump 도구를 설치할 수 있습니다:
만약 컨테이너가 이미 실행 중이라면 다음 명령어를 사용하여 dotnet-dump를 컨테이너 내부에 설치할 수도 있습니다.
2. 컨테이너에서 덤프 파일 생성
먼저, Docker 컨테이너에서 실행 중인 .NET 애플리케이션의 프로세스 ID(PID)를 찾아야 합니다. 이를 위해 컨테이너 내부에 접속한 후 다음 명령어를 사용하여 프로세스 목록을 확인하세요:
또는 다음 명령어로 .NET 프로세스만 필터링하여 볼 수 있습니다:
출력 예시:
여기서 PID는 프로세스 ID입니다. 예를 들어, PID가 10이라고 가정합니다.
다음으로, dotnet dump를 사용하여 덤프 파일을 생성합니다:
이 명령어는 MyAppDump.dmp라는 덤프 파일을 /tmp 디렉토리에 생성합니다. --process-id 옵션은 덤프를 생성할 특정 프로세스의 ID를 지정하는 데 사용됩니다.
- 옵션 설명:
- --process-id <PID>: 덤프를 생성할 프로세스 ID를 지정합니다.
- --output <파일 경로>: 덤프 파일이 저장될 경로를 지정합니다.
- --type <mode>: 덤프 파일의 종류를 지정할 수 있습니다 (full, heap, mini). 기본값은 full입니다.
3. 덤프 파일을 호스트로 복사
Docker 컨테이너 내부에 생성된 덤프 파일을 호스트로 복사하여 분석해야 할 경우, 다음 명령어를 사용하여 복사할 수 있습니다:
위 명령어는 컨테이너의 /tmp/MyAppDump.dmp 파일을 호스트의 현재 디렉토리에 MyAppDump.dmp라는 이름으로 복사합니다.
4. 덤프 파일 분석
덤프 파일을 생성한 후, 이를 분석하기 위해 다양한 도구를 사용할 수 있습니다. 주로 dotnet dump나 Visual Studio를 사용하여 덤프 파일을 분석합니다.
1) dotnet dump analyze 사용
dotnet dump를 사용하여 덤프 파일을 분석하려면 다음과 같이 명령어를 실행합니다:
이후 analyze 콘솔에서 다양한 명령어를 사용할 수 있습니다:
- clrstack: 관리 스레드의 호출 스택을 표시합니다.
- dumpheap: 힙의 객체 목록을 덤프합니다.
- dumpobj <address>: 특정 객체의 주소를 사용하여 객체 정보를 덤프합니다.
- quit: 분석 모드를 종료합니다.
2) Visual Studio 사용
Visual Studio를 사용하여 덤프 파일을 분석할 수도 있습니다.
- Visual Studio를 열고 File > Open > File...을 선택합니다.
- 덤프 파일(.dmp)을 선택하여 열면 Visual Studio에서 자동으로 분석을 시작합니다.
- Threads, Heap, Modules 등 다양한 메모리 및 성능 분석 도구를 사용할 수 있습니다.
5. 컨테이너 내 프로세스 접근 문제 해결
Docker에서 dotnet dump를 사용할 때 특정 설정이 부족하여 process ID에 접근할 수 없는 경우가 있습니다. 다음과 같은 문제 해결 방법을 시도해 보세요:
- 컨테이너에 디버그 권한 부여:
bash코드 복사docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -it <image-name>
- docker run 명령어를 사용할 때 --cap-add=SYS_PTRACE 및 --security-opt seccomp=unconfined 옵션을 추가하면 디버그 권한을 부여할 수 있습니다.
- COMPlus_EnableDiagnostics 환경 변수 설정:
bash코드 복사docker run -e COMPlus_EnableDiagnostics=1 <image-name>
- Docker 컨테이너를 실행할 때 다음과 같이 환경 변수를 추가하여 .NET 진단 기능을 활성화할 수 있습니다:
예시 요약
- 컨테이너 내부에서 dotnet dump 도구 설치:
-
bash코드 복사docker exec -it <container-name> dotnet tool install --global dotnet-dump
- 프로세스 ID 확인:
-
bash코드 복사docker exec -it <container-name> ps aux
- 덤프 파일 생성:
-
bash코드 복사docker exec -it <container-name> dotnet-dump collect --process-id <PID> --output /tmp/MyAppDump.dmp
- 덤프 파일 호스트로 복사:
-
bash코드 복사docker cp <container-name>:/tmp/MyAppDump.dmp ./MyAppDump.dmp
- 덤프 파일 분석:
-
bash코드 복사dotnet-dump analyze MyAppDump.dmp
위의 절차를 따라 dotnet dump를 Docker 환경에서 사용하는 방법을 참고하시고, 필요한 경우 디버깅 권한 및 설정을 추가하여 성공적으로 덤프 파일을 수집하고 분석해보세요. 추가적으로 궁금한 점이 있다면 언제든지 알려주세요!