코어 덤프 수집


코어 덤프를 사용하여 응답하지 않는 가상 머신(VM) 인스턴스의 원인을 분석합니다.

Compute Engine에서 코어 덤프를 수집하려면 마스크 불가능 인터럽트(NMI) 신호를 수신하도록 VM을 구성한 후 SendDiagnosticInterrupt 명령어를 실행하여 운영체제에 커널 패닉 또는 블루 스크린을 표시합니다. 커널 패닉 또는 블루 스크린에서 게스트 운영체제에 의한 코어 덤프 수집을 시작합니다. 그런 다음 특히 커널 고정과 같이 재현하기 어려운 시나리오에서 이 코어 덤프를 디버깅에 사용할 수 있습니다.

시작하기 전에

  • NMI 신호 전송은 기본 쿼리 API 할당량으로 계산됩니다. 자세한 내용은 API 비율 제한을 참조하세요.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공하는 사용자 인증 정보를 사용합니다.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용 인증을 참조하세요.

필요한 역할

사용자 또는 서비스 계정에 NMI 신호를 VM으로 전송하는 데 필요한 권한이 있는지 확인하려면 관리자에게 프로젝트에 대한 Compute 인스턴스 관리자(v1)(roles/compute.instanceAdmin.v1) IAM 역할을 사용자 또는 서비스 계정에 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 NMI 신호를 VM에 전송하는 데 필요한 compute.instances.sendDiagnosticInterrupt 권한이 포함되어 있습니다.

관리자는 커스텀 역할이나 다른 사전 정의된 역할을 사용하여 사용자 또는 서비스 계정에 이 권한을 부여할 수도 있습니다.

개요

코어 덤프를 사용하여 응답하지 않는 VM 또는 보안 이슈를 디버깅하려면 다음 단계를 완료해야 합니다.

  1. 코어 덤프를 생성하도록 VM 구성
  2. 코어 덤프를 생성하도록 NMI 신호 보내기
  3. 코어 덤프 검토

제한사항

보안 부팅이 사용 설정된 VM의 경우 NMI 인터럽트 신호를 보내기 전에 보안 부팅을 사용 중지해야 합니다. 자세한 내용은 VM 인스턴스에서 보안 VM 옵션 수정을 참조하세요.

VM 구성

NMI 인터럽트 신호 수신에 대한 VM의 응답은 VM의 운영체제 구성에 따라 다릅니다.

각 운영체제는 코어 덤프 로그를 다른 위치에 기록합니다. 예를 들어 Ubuntu 운영체제에서는 크래시 덤프 파일이 기본적으로 /var/crash/에 저장됩니다.

NMI 신호가 수신될 때 게스트 OS가 크래시 덤프를 생성하도록 구성하려면 지원되는 운영체제의 문서를 검토하세요.

운영체제 안내 링크 기타 참고사항
Ubuntu Ubuntu: 커널 크래시 덤프 Linux VM의 경우 NMI 인터럽트 신호를 받으면 커널이 비정상 종료되도록 구성해야 합니다.

커널이 비정상 종료되도록 구성하려면 다음을 구성 파일에 추가합니다.
kernel.unknown_nmi_panic=1
SLES(SUSE Linux Enterprise Server) 커널 코어 덤프 분석을 위한 크래시 커널 메모리 구성
RHEL(Red Hat Enterprise Linux) 다음 문서를 모두 사용합니다.
Container-Optimized OS(COS) GCE COS 인스턴스에서 커널 크래시 덤프 사용 설정 COS 93 이상만 NMI 신호를 사용한 kdump 생성을 지원합니다.
Windows 커널 생성 또는 크래시 덤프 완료

Windows 클라이언트 VM은 다음 조건에 해당하거나 AD 도메인의 멤버에 해당하지 않는 한 메모리 덤프 파일을 유지하지 않습니다.

  • 레지스트리가 AlwaysKeepMemoryDump1로 설정함
  • 디스크의 여유 공간 25GB 이상

자세한 내용은 Windows 7에서 커널 덤프 저장 및 삭제 동작을 참조하세요.

코어 덤프를 생성하도록 NMI 보내기

VM을 구성한 후 Google Cloud CLI 또는 REST를 사용하여 NMI 신호를 VM으로 전송할 수 있습니다.

gcloud

NMI 신호를 전송하려면 instances send-diagnostic-interrupt 명령어를 사용합니다.

gcloud compute instances send-diagnostic-interrupt VM_NAME \
    --zone=ZONE

다음을 바꿉니다.

  • VM_NAME: 코어 덤프를 수집할 VM의 인스턴스 ID 또는 이름입니다.
  • ZONE: VM이 있는 영역입니다.

출력은 다음과 비슷합니다.

<Empty Response>

전체 출력 목록은 'NMI 명령어 응답'에 관한 이 문서의 다음 섹션을 참조하세요.

REST

  1. 선택사항. 사용할 API 키가 아직 없다면 만듭니다. API 키 생성에 대한 자세한 내용은 API 키 만들기를 참조하세요.

  2. NMI 신호를 전송하려면 sendDiagnosticInterrupt 메서드POST 요청을 수행합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY
    

    예를 들어 다음과 같이 curl 명령어를 사용하여 요청하면 됩니다.

    curl --request POST 'https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY' \
      --header 'Authorization: Bearer $(gcloud auth print-access-token)' \
      --header 'Accept: application/json' \
      --compressed
    

    다음을 바꿉니다.

    • PROJECT_ID: VM을 만들 프로젝트의 ID입니다.
    • ZONE: VM이 있는 영역입니다.
    • VM_NAME: 코어 덤프를 수집할 VM의 인스턴스 ID 또는 이름입니다.
    • API_KEY: API 키입니다.

    출력은 다음과 비슷합니다.

    <Empty Response>

    전체 출력 목록은 'NMI 명령어 응답'에 관한 이 문서의 다음 섹션을 참조하세요.

NMI 명령어 응답

NMI 신호를 전송하려고 하면 다음 응답 중 하나가 반환됩니다.

상태 본문 참고
SUCCESS <Empty Response> SUCCESS는 NMI 신호가 운영체제에 전달되었음을 나타냅니다. 코어 덤프가 수집되거나 VM이 종료 또는 재부팅된다는 보장은 없습니다. 이러한 동작은 운영체제 구성에 따라 결정됩니다.
실패 UNSUPPORTED_OPERATION 이 문제는 운영체제가 NMI 신호를 수신하지 못하는 경우에 발생합니다. 여러 가지 이유가 있습니다. 일반적인 시나리오는 VM이 라이브 마이그레이션 중이거나 NMI 신호를 수신하도록 VM이 올바르게 구성되지 않은 경우입니다.
이 문제를 해결하려면 다음을 시도해 보세요.
  • VM이 올바르게 구성되었는지 확인합니다. VM 구성을 참조하세요.
  • 기다렸다가 SendDiagnosticInterrupt 요청을 다시 시도합니다.
실패 Required 'compute.instances.sendDiagnosticInterrupt' permission for [..] 요청하는 사용자에게 충분한 권한이 없으므로 명령어가 실패했습니다.

이 문제를 해결하려면 사용자에게 compute.instances.sendDiagnosticInterrupt 권한이 있는 역할을 할당하면 됩니다.

코어 덤프 검토

구성된 위치 또는 운영체제의 기본 위치에 있는 크래시 덤프 파일을 검토합니다.

예를 들어 Ubuntu 운영체제에서는 기본적으로 크래시 덤프 파일이 /var/crash/에 저장됩니다.