Recolha de despejos de memória

Use despejos de memória para analisar as causas de uma instância de máquina virtual (VM) que não responde.

Para recolher despejos de memória principais no Compute Engine, tem de configurar as suas VMs para receberem um sinal de interrupção não ocultável (NMI) e, em seguida, executar um comando SendDiagnosticInterrupt para acionar um pânico do kernel ou um ecrã azul no seu sistema operativo. Um kernel panic ou um ecrã azul inicia uma recolha de core dumps pelo sistema operativo convidado. Estes despejos de memória podem ser usados para fins de depuração, especialmente em cenários difíceis de reproduzir, como um bloqueio do kernel.

Antes de começar

  • O envio de sinais NMI é contabilizado na quota da API Consultas predefinida. Para mais informações, consulte os limites de taxa da API.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

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

    gcloud

    1. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.

Funções necessárias

Para garantir que a sua conta de utilizador ou de serviço tem a autorização necessária para enviar sinais de NMI para uma VM, peça ao seu administrador para conceder à sua conta de utilizador ou de serviço a função de Administrador de instâncias do Compute (v1) (roles/compute.instanceAdmin.v1) do IAM no seu projeto. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém a autorização compute.instances.sendDiagnosticInterrupt , que é necessária para enviar sinais NMI para uma VM.

O administrador também pode conceder esta autorização à sua conta de utilizador ou de serviço com funções personalizadas ou outras funções predefinidas.

Vista geral

Para usar descargas de memória para ajudar a depurar uma VM que não responde ou um problema de segurança, tem de concluir os seguintes passos:

  1. Configure a sua VM para gerar despejos de memória
  2. Envie um sinal NMI para gerar despejos de memória
  3. Reveja os despejos de memória

Limitações

Para VMs com o arranque seguro ativado, tem de desativar o arranque seguro antes de enviar um sinal de interrupção NMI. Para ver instruções, consulte o artigo Modificar opções de VMs protegidas numa instância de VM.

Configurar VM

A resposta de uma MV à receção de um sinal de interrupção NMI depende da configuração do sistema operativo da MV.

Cada sistema operativo escreve os respetivos registos de despejo de memória numa localização diferente. Por exemplo, nos sistemas operativos Ubuntu, o ficheiro de despejo de falhas é guardado em /var/crash/ por predefinição.

Para configurar o SO convidado de modo a gerar um despejo de falhas quando é recebido um sinal NMI, reveja a documentação do sistema operativo suportado.

Sistema operativo Links para instruções Notas adicionais
Ubuntu Ubuntu: Kernel crash dump Para VMs Linux, tem de configurar o kernel para falhar quando recebe o sinal de interrupção NMI.

Para configurar o kernel para falhar, adicione o seguinte ao ficheiro de configuração:
kernel.unknown_nmi_panic=1
SUSE Linux Enterprise Server (SLES) Configure a memória do crashkernel para a análise de despejos de memória do núcleo
Red Hat Enterprise Linux (RHEL) Use ambos os seguintes documentos:
SO otimizado para contentores (COS) Ativar o despejo de falhas do kernel em instâncias do COS do GCE Apenas o COS 93 e posterior suportam a geração de kdump através do sinal NMI.
Windows Gere um kernel ou um despejo de memória completo em caso de falha do sistema

As VMs de cliente Windows não mantêm ficheiros de despejo de memória, a menos que sejam membros de um domínio do AD ou que se verifique o seguinte:

  • O registo define AlwaysKeepMemoryDump como 1
  • O disco tem mais de 25 GB de espaço livre

Para mais informações, consulte o artigo Armazenamento de despejos do kernel e comportamento de limpeza no Windows 7

Envie NMI para gerar despejos de memória

Depois de configurar a VM, pode enviar o sinal NMI para a VM através da CLI do Google Cloud ou do REST.

gcloud

Para enviar o sinal NMI, use o comando instances send-diagnostic-interrupt.

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

Substitua o seguinte:

  • VM_NAME: ID ou nome da instância da VM da qual quer recolher despejos de memória
  • ZONE: a zona onde a sua VM está localizada

O resultado é semelhante ao seguinte:

<Empty Response>

Para ver uma lista completa das saídas, consulte a secção seguinte neste documento sobre "Respostas de comandos NMI".

REST

  1. Opcional. Se ainda não estiver disponível, crie uma chave da API. Para mais informações sobre a criação de chaves da API, consulte o artigo Criar uma chave da API.

  2. Para enviar o sinal NMI, faça um pedido POST ao método sendDiagnosticInterrupt.

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

    Por exemplo, pode usar o comando curl para fazer o pedido da seguinte forma:

    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
    

    Substitua o seguinte:

    • PROJECT_ID: ID do projeto no qual criar a VM
    • ZONE: a zona onde a sua VM está localizada
    • VM_NAME: ID ou nome da instância da VM da qual quer recolher despejos de memória
    • API_KEY: a sua chave da API

    O resultado é semelhante ao seguinte:

    <Empty Response>

    Para ver uma lista completa das saídas, consulte a secção seguinte neste documento acerca das "Respostas aos comandos NMI".

Respostas de comandos NMI

Quando tenta enviar um sinal de NMI, é devolvida uma das seguintes respostas.

Estado Corpo Notas
ÊXITO <Empty Response> SUCCESS mostra que o sinal NMI é enviado para o sistema operativo. Não garante que o despejo de memória seja recolhido nem que a VM seja encerrada ou reiniciada. Estes comportamentos são determinados pela configuração do sistema operativo.
FAIL UNSUPPORTED_OPERATION Isto ocorre quando o sistema operativo não recebe o sinal NMI. Existem vários motivos para tal. Os cenários comuns são a migração em direto da VM ou a VM não estar configurada corretamente para receber sinais de NMI.
Para resolver este problema, pode experimentar o seguinte:
  • Confirme se a VM está configurada corretamente. Consulte Configurar VM.
  • Aguarde e repita o pedido SendDiagnosticInterrupt.
FAIL Required 'compute.instances.sendDiagnosticInterrupt' permission for [..] O comando falhou porque o utilizador que está a fazer o pedido não tem autorizações suficientes.

Para resolver este problema, pode atribuir uma função ao utilizador que contenha a autorização compute.instances.sendDiagnosticInterrupt.

Reveja os despejos de memória

Reveja o ficheiro de despejo de falhas na localização configurada ou predefinida para o seu sistema operativo.

Por exemplo, nos sistemas operativos Ubuntu, por predefinição, o ficheiro de despejo de falhas é guardado em /var/crash/.