본문 바로가기
카테고리 없음

docker dotnet dump 사용방법

by keisoft 2024. 10. 9.
 

Docker 환경에서 dotnet dump를 사용하는 방법은 일반적으로 다음과 같은 단계를 따릅니다. dotnet dump는 .NET 애플리케이션의 덤프 파일을 생성하고, 디버깅을 위한 정보를 제공하여 애플리케이션의 비정상 종료, 메모리 누수, 성능 문제 등을 분석할 수 있게 도와줍니다. Docker 컨테이너 내의 .NET 프로세스에 접근하여 덤프 파일을 생성하고, 해당 덤프 파일을 분석하는 방법을 알아보겠습니다.

1. Docker 컨테이너에 dotnet-dump 설치

Docker 컨테이너 내에서 dotnet-dump가 설치되어 있는지 확인하고, 설치되지 않았다면 수동으로 설치해야 합니다. 보통 Docker 이미지에 .NET SDK가 설치되어 있으면 사용할 수 있습니다.

Dockerfile에 다음과 같은 구문을 추가하여 dotnet-dump 도구를 설치할 수 있습니다:

dockerfile
코드 복사
# .NET 6 이상을 사용한다면, SDK 이미지 기반으로 도구를 설치 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build # dotnet-dump 도구 설치 RUN dotnet tool install --global dotnet-dump ENV PATH="$PATH:/root/.dotnet/tools"

만약 컨테이너가 이미 실행 중이라면 다음 명령어를 사용하여 dotnet-dump를 컨테이너 내부에 설치할 수도 있습니다.

bash
코드 복사
docker exec -it <container-name> dotnet tool install --global dotnet-dump

2. 컨테이너에서 덤프 파일 생성

먼저, Docker 컨테이너에서 실행 중인 .NET 애플리케이션의 프로세스 ID(PID)를 찾아야 합니다. 이를 위해 컨테이너 내부에 접속한 후 다음 명령어를 사용하여 프로세스 목록을 확인하세요:

bash
코드 복사
docker exec -it <container-name> ps aux

또는 다음 명령어로 .NET 프로세스만 필터링하여 볼 수 있습니다:

bash
코드 복사
docker exec -it <container-name> ps aux | grep dotnet

출력 예시:

sql
코드 복사
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 10 12.0 1.2 123456 7890 ? Sl 14:30 0:05 dotnet /app/MyApp.dll

여기서 PID는 프로세스 ID입니다. 예를 들어, PID가 10이라고 가정합니다.

다음으로, dotnet dump를 사용하여 덤프 파일을 생성합니다:

bash
코드 복사
docker exec -it <container-name> dotnet-dump collect --process-id 10 --output /tmp/MyAppDump.dmp

이 명령어는 MyAppDump.dmp라는 덤프 파일을 /tmp 디렉토리에 생성합니다. --process-id 옵션은 덤프를 생성할 특정 프로세스의 ID를 지정하는 데 사용됩니다.

  • 옵션 설명:
    • --process-id <PID>: 덤프를 생성할 프로세스 ID를 지정합니다.
    • --output <파일 경로>: 덤프 파일이 저장될 경로를 지정합니다.
    • --type <mode>: 덤프 파일의 종류를 지정할 수 있습니다 (full, heap, mini). 기본값은 full입니다.

3. 덤프 파일을 호스트로 복사

Docker 컨테이너 내부에 생성된 덤프 파일을 호스트로 복사하여 분석해야 할 경우, 다음 명령어를 사용하여 복사할 수 있습니다:

bash
코드 복사
docker cp <container-name>:/tmp/MyAppDump.dmp ./MyAppDump.dmp

위 명령어는 컨테이너의 /tmp/MyAppDump.dmp 파일을 호스트의 현재 디렉토리에 MyAppDump.dmp라는 이름으로 복사합니다.

4. 덤프 파일 분석

덤프 파일을 생성한 후, 이를 분석하기 위해 다양한 도구를 사용할 수 있습니다. 주로 dotnet dump나 Visual Studio를 사용하여 덤프 파일을 분석합니다.

1) dotnet dump analyze 사용

dotnet dump를 사용하여 덤프 파일을 분석하려면 다음과 같이 명령어를 실행합니다:

bash
코드 복사
dotnet-dump analyze MyAppDump.dmp

이후 analyze 콘솔에서 다양한 명령어를 사용할 수 있습니다:

  • clrstack: 관리 스레드의 호출 스택을 표시합니다.
  • dumpheap: 힙의 객체 목록을 덤프합니다.
  • dumpobj <address>: 특정 객체의 주소를 사용하여 객체 정보를 덤프합니다.
  • quit: 분석 모드를 종료합니다.

2) Visual Studio 사용

Visual Studio를 사용하여 덤프 파일을 분석할 수도 있습니다.

  1. Visual Studio를 열고 File > Open > File...을 선택합니다.
  2. 덤프 파일(.dmp)을 선택하여 열면 Visual Studio에서 자동으로 분석을 시작합니다.
  3. Threads, Heap, Modules 등 다양한 메모리 및 성능 분석 도구를 사용할 수 있습니다.

5. 컨테이너 내 프로세스 접근 문제 해결

Docker에서 dotnet dump를 사용할 때 특정 설정이 부족하여 process ID에 접근할 수 없는 경우가 있습니다. 다음과 같은 문제 해결 방법을 시도해 보세요:

  • 컨테이너에 디버그 권한 부여:
    bash
    코드 복사
    docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -it <image-name>
    이렇게 하면 dotnet dump 도구가 프로세스에 접근할 수 있게 됩니다.
  • docker run 명령어를 사용할 때 --cap-add=SYS_PTRACE 및 --security-opt seccomp=unconfined 옵션을 추가하면 디버그 권한을 부여할 수 있습니다.
  • COMPlus_EnableDiagnostics 환경 변수 설정:
    bash
    코드 복사
    docker run -e COMPlus_EnableDiagnostics=1 <image-name>
    이를 통해 .NET 프로세스에 대한 진단 정보 접근이 활성화됩니다.
  • Docker 컨테이너를 실행할 때 다음과 같이 환경 변수를 추가하여 .NET 진단 기능을 활성화할 수 있습니다:

예시 요약

  1. 컨테이너 내부에서 dotnet dump 도구 설치:
  2. bash
    코드 복사
    docker exec -it <container-name> dotnet tool install --global dotnet-dump
  3. 프로세스 ID 확인:
  4. bash
    코드 복사
    docker exec -it <container-name> ps aux
  5. 덤프 파일 생성:
  6. bash
    코드 복사
    docker exec -it <container-name> dotnet-dump collect --process-id <PID> --output /tmp/MyAppDump.dmp
  7. 덤프 파일 호스트로 복사:
  8. bash
    코드 복사
    docker cp <container-name>:/tmp/MyAppDump.dmp ./MyAppDump.dmp
  9. 덤프 파일 분석:
  10. bash
    코드 복사
    dotnet-dump analyze MyAppDump.dmp

위의 절차를 따라 dotnet dump를 Docker 환경에서 사용하는 방법을 참고하시고, 필요한 경우 디버깅 권한 및 설정을 추가하여 성공적으로 덤프 파일을 수집하고 분석해보세요. 추가적으로 궁금한 점이 있다면 언제든지 알려주세요!