Esta página explica como criar e usar uma instância de máquina virtual (VM) preemptiva. As VMs preemptivas estão disponíveis com descontos de até 60-91% em comparação ao preço das VMs padrão. No entanto, o Compute Engine poderá interromper (preemptar) essas VMs se precisar recuperar esses recursos para outras tarefas. As VMs preemptivas sempre param após 24 horas. As VMs preemptivas são recomendadas apenas para aplicativos tolerantes a falhas que podem suportar a preempção da VM. Certifique-se de que seu aplicativo possa lidar com preempções antes de decidir criar uma VM preemptiva. Para compreender os riscos e o valor das VMs preemptivas, leia a documentação das instâncias de VM preemptivas .
Antes de começar
- Leia a documentação sobre instâncias de VM preemptivas .
- Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar no Compute Engine selecionando uma das seguintes opções:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
- Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.
- Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.
- Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.
- Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.
- Copie ou baixe o script de desligamento para sua estação de trabalho local.
- Abra o arquivo para edição e altere as seguintes variáveis:
-
[PROGRAM_NAME]
é o nome do processo ou programa que você deseja encerrar. Por exemplo,apache2
ounginx
. -
[LOCAL_USER]
é o nome de usuário com o qual você está conectado à máquina virtual. -
[BUCKET_NAME]
é o nome do intervalo do Cloud Storage onde você quer salvar o arquivo de ponto de verificação do programa. Observe que o nome do bucket não começa comgs://
neste caso.
-
- Salve suas alterações.
- Adicione o script de desligamento a uma nova VM ou a uma VM existente .
A VM foi criada com pelo menos acesso de leitura/gravação ao Cloud Storage. Consulte a documentação de autenticação para obter instruções sobre como criar uma VM com os escopos apropriados.
Você tem um bucket do Cloud Storage e permissão para gravar nele.
No console do Google Cloud, acesse a página Registros .
Selecione seu projeto e clique em Continuar .
Adicione
compute.instances.preempted
ao filtro por rótulo ou campo de pesquisa de texto .Opcionalmente, você também pode inserir um nome de VM se quiser ver operações de preempção para uma VM específica.
Pressione Enter para aplicar os filtros especificados. O console do Google Cloud atualiza a lista de registros para mostrar apenas as operações em que uma VM foi interrompida.
Selecione uma operação na lista para ver detalhes sobre a VM que foi interrompida.
- Leia a documentação sobre instâncias de VM preemptivas .
- Leia sobre scripts de desligamento .
- Conecte-se à sua VM .
Go
Para usar os exemplos Go desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Java
Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Node.js
Para usar os exemplos Node.js desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Python
Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
REST
Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.
Crie uma VM preemptiva
Crie uma VM preemptiva usando a CLI gcloud ou a API Compute Engine. Para usar o console do Google Cloud, crie uma VM Spot .
gcloud
Com
gcloud compute
, use o mesmo comandoinstances create
que você usaria para criar uma VM normal, mas adicione a sinalização--preemptible
.gcloud compute instances create [VM_NAME] --preemptible
onde
[VM_NAME]
é o nome da VM.Ir
Java
Node.js
Pitão
DESCANSAR
Na API, construa uma solicitação normal para criar uma VM , mas inclua a propriedade
preemptible
noscheduling
e defina-a comotrue
. Por exemplo:POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances { 'machineType': 'zones/[ZONE]/machineTypes/[MACHINE_TYPE]', 'name': '[INSTANCE_NAME]', 'scheduling': { 'preemptible': true }, ... }
Cotas de CPU preemptivas
As VMs preemptivas exigem cotas de CPU disponíveis, como as VMs padrão. Para evitar que VMs preemptivas consumam as cotas de CPU de suas VMs padrão, você pode solicitar uma cota especial de "CPU preemptiva". Depois que o Compute Engine conceder a você uma cota de CPU preemptiva nessa região, todas as VMs preemptivas serão contabilizadas nessa cota, e todas as VMs padrão continuarão a ser contabilizadas na cota de CPU padrão.
Em regiões onde não há cota de CPU preemptiva, você pode usar a cota de CPU padrão para iniciar VMs preemptivas. Você também precisa de IP e cota de disco suficientes, como sempre. A cota de CPU preemptiva não fica visível na CLI gcloud ou nas páginas de cota do console do Google Cloud, a menos que o Compute Engine tenha concedido a cota.
Para obter mais informações sobre cotas, visite a página Cotas de recursos .
Iniciar uma VM preemptada
Como qualquer outra VM, se uma VM preemptiva for interrompida ou preemptada, você poderá iniciá-la novamente e trazê-la de volta ao estado
RUNNING
. Iniciar uma VM preemptiva redefine o contador de 24 horas, mas como ainda é uma VM preemptiva, o Compute Engine pode fazer a preempção antes de 24 horas. Não é possível converter uma VM preemptiva em uma VM padrão enquanto ela está em execução.Se o Compute Engine interromper uma VM preemptiva em um grupo de instâncias gerenciadas (MIG) com escalonamento automático ou cluster do Google Kubernetes Engine (GKE), o grupo reiniciará a VM quando os recursos estiverem disponíveis novamente.
Lidar com a preempção com um script de desligamento
Quando o Compute Engine interrompe uma VM, você pode usar um script de desligamento para tentar executar ações de limpeza antes que a VM seja interrompida. Por exemplo, você pode interromper um processo em execução e copiar um arquivo de ponto de verificação para o Cloud Storage . Notavelmente, a duração máxima do período de desligamento é menor para um aviso de preempção do que para um desligamento iniciado pelo usuário. Para obter mais informações sobre o período de desligamento para um aviso de preempção, consulte Processo de preempção na documentação conceitual.
A seguir está um script de desligamento que você pode adicionar a uma VM preemptiva em execução ou adicionar a uma nova VM preemptiva ao criá-la. Este script é executado quando a VM começa a desligar, antes que o comando
kill
normal do sistema operacional interrompa todos os processos restantes. Depois de interromper normalmente o programa desejado, o script executa um upload paralelo de um arquivo de ponto de verificação para um intervalo do Cloud Storage.#!/bin/bash MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx" MY_USER="[LOCAL_USERNAME]" CHECKPOINT="/home/$MY_USER/checkpoint.out" BUCKET_NAME="[BUCKET_NAME]" # For example, "my-checkpoint-files" (without gs://) echo "Shutting down! Seeing if ${MY_PROGRAM} is running." # Find the newest copy of $MY_PROGRAM PID="$(pgrep -n "$MY_PROGRAM")" if [[ "$?" -ne 0 ]]; then echo "${MY_PROGRAM} not running, shutting down immediately." exit 0 fi echo "Sending SIGINT to $PID" kill -2 "$PID" # Portable waitpid equivalent while kill -0 "$PID"; do sleep 1 done echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}" su "${MY_USER}" -c "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/" echo "Done uploading, shutting down."
Para adicionar este script a uma VM, configure o script para funcionar com um aplicativo na sua VM e adicione-o aos metadados da VM.
Este script pressupõe o seguinte:
Identifique VMs preemptivas
Para verificar se uma VM é preemptiva, siga as etapas para Identificar o modelo de provisionamento e a ação de encerramento de uma VM .
Determinar se uma VM foi preemptada
Determine se uma VM foi interrompida com o console do Google Cloud , a CLI gcloud ou a API .
Console
Você pode verificar se uma VM foi interrompida verificando os logs de atividades do sistema.
gcloud
Use o comandogcloud compute operations list
com um parâmetro de filtro para obter uma lista de eventos de preempção no seu projeto.gcloud compute operations list \ --filter="operationType=compute.instances.preempted"
Você pode usar o parâmetro filter para ampliar o escopo dos resultados. Por exemplo, para ver eventos de preempção apenas para VMs em um grupo gerenciado de instâncias:
gcloud compute operations list \ --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_VM_NAME]"
gcloud
retorna uma resposta semelhante a:NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-xxxxxxxx compute.instances.preempted us-central1-f/instances/example-vm-xxx 200 DONE 2015-04-02T12:12:10.881-07:00
Um tipo de operação
compute.instances.preempted
indica que a VM foi preemptada. Você pode usar o comandooperations describe
para obter mais informações sobre uma operação de preempção específica.gcloud compute operations describe \ systemevent-xxxxxxxx
gcloud
retorna uma resposta semelhante a:... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/operations/systemevent-xxxxxxxx startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
DESCANSAR
Para obter uma lista das operações recentes do sistema, envie uma solicitaçãoGET
ao URI das operações da zona.GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations
A resposta contém uma lista de operações recentes.
{ "kind": "compute#operation", "id": "15041793718812375371", "name": "systemevent-xxxxxxxx", "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f", "operationType": "compute.instances.preempted", "targetLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/instances/example-vm", "targetId": "12820389800990687210", "status": "DONE", "statusMessage": "Instance was preempted.", ... }
Para definir o escopo da resposta para mostrar apenas operações de preempção, você pode adicionar um filtro à sua solicitação de API:
operationType="compute.instances.preempted"
. Para ver operações de preempção para uma VM específica, adicione um parâmetrotargetLink
ao filtro:operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[VM_NAME]"
.Como alternativa, você pode determinar se uma VM foi interrompida dentro da própria VM. Isso é útil se você quiser lidar com um encerramento devido a uma preempção do Compute Engine de maneira diferente de um encerramento normal em um script de encerramento . Para fazer isso, basta verificar no servidor de metadados o valor
preempted
nos metadados de instância padrão da sua VM.Por exemplo, use
curl
na sua VM para obter o valor depreempted
:curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google" TRUE
Se esse valor for
TRUE
, a VM foi interrompida pelo Compute Engine; caso contrário, seráFALSE
.Se quiser usar isso fora de um script de desligamento, você pode anexar ?wait_for_change=true ao URL. Isso executa uma solicitação HTTP GET suspensa que retorna apenas quando os metadados foram alterados e a VM foi interrompida.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google" TRUE
Testar configurações de preempção
Você pode executar eventos de manutenção simulados em suas VMs para forçá-las a realizar a preempção. Use esse recurso para testar como seus aplicativos lidam com VMs preemptivas. Leia testando suas políticas de disponibilidade para saber como testar eventos de manutenção em suas VMs.
Você também pode simular a preempção de uma VM parando a VM , o que pode ser usado em vez de simular um evento de manutenção e evita limites de cota.
Melhores práticas
Aqui estão algumas práticas recomendadas para ajudar você a aproveitar ao máximo as instâncias de VM preemptivas.
Usando a API de instância em massa
Em vez de criar VMs únicas, você pode usar a API de instância em massa .
Escolha formatos de máquinas menores
Recursos para VMs preemptivas saem do excesso e fazem backup Google Cloudcapacidade. Geralmente, é mais fácil obter capacidade para tipos de máquinas menores , ou seja, tipos de máquinas com menos recursos, como vCPUs e memória. Você pode encontrar mais capacidade para VMs preemptivas selecionando um tipo de máquina personalizada menor, mas a capacidade é ainda mais provável para tipos de máquinas predefinidas menores. Por exemplo, em comparação com a capacidade do tipo de máquina predefinido
n2-standard-32
, a capacidade do tipo de máquina personalizadon2-custom-24-96
é mais provável, mas a capacidade do tipo de máquina predefinidon2-standard-16
é ainda mais provável.Execute grandes clusters de VM preemptivos fora dos horários de pico
A carga em Google Cloud data centers varia de acordo com o local e a hora do dia, mas geralmente é mais baixa à noite e nos finais de semana. Assim, as noites e os fins de semana são os melhores horários para executar grandes clusters de VMs preemptivos.
Projete seus aplicativos para serem tolerantes a falhas e preempções
É importante estar preparado para o fato de que ocorrerão mudanças nos padrões de preempção em diferentes momentos. Por exemplo, se uma zona sofrer uma interrupção parcial, um grande número de VMs preemptivas poderá ser substituído para abrir espaço para VMs padrão que precisam ser movidas como parte da recuperação. Nessa pequena janela de tempo, a taxa de preempção seria muito diferente da de qualquer outro dia. Se o seu aplicativo pressupõe que as preempções são sempre feitas em pequenos grupos, talvez você não esteja preparado para tal evento. Você pode testar o comportamento do seu aplicativo em um evento de preempção interrompendo a instância da VM.
Tente novamente criar VMs que foram interrompidas
Se sua instância de VM tiver sido preemptiva, tente criar novas VMs preemptivas uma ou duas vezes antes de voltar às VMs padrão. Dependendo dos seus requisitos, pode ser uma boa ideia combinar VMs padrão e preemptivas nos seus clusters para garantir que o trabalho prossegue a um ritmo adequado.
Use scripts de desligamento
Gerencie avisos de desligamento e preempção com um script de desligamento que pode salvar o progresso de um trabalho para que ele possa continuar de onde parou, em vez de recomeçar do zero.
O que vem a seguir?
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-04-21 UTC.
-