A economia aparece na primeira fatura e convence todo mundo. O ambiente de testes migra para Spot, e ninguém sente diferença.
O problema começa quando a mesma lógica é aplicada a um processamento que não pode parar no meio. Num momento de demanda alta na região, as VMs são despejadas, o processamento recomeça do zero e o resultado atrasa.
A Spot VM não falhou. Ela fez exatamente o que promete. A escolha errada foi colocar ali uma carga que não podia ser interrompida.
O que é uma Spot VM, sem marketing
Spot é capacidade que o Azure tem sobrando naquele momento, vendida com desconto alto. A documentação do Azure fala em economia de até 90% em computação. O desconto existe porque a capacidade não é sua: quando o Azure precisa dela de volta, a VM é despejada.
Três características definem o modelo:
Não há SLA. Nem de disponibilidade, nem de alocação. Se não houver capacidade, a VM nem sobe.
O aviso é curto. O Azure tenta avisar até 30 segundos antes do despejo, por meio do Scheduled Events, e mesmo esse aviso é entregue no melhor esforço.
A decisão é tomada na criação. Não dá para converter uma VM comum em Spot, nem uma Spot em comum. Quem quiser mudar de ideia vai recriar a VM.
Por que a VM é despejada
São dois motivos, e vale separar.
Capacidade. O Azure precisa da capacidade para cargas que pagam o preço normal. Esse despejo pode acontecer a qualquer momento, independente do preço que você aceitou pagar.
Preço. O preço da Spot varia por região e tamanho. Ao criar a VM, você define um preço máximo. Se o preço atual passar dele, a VM é despejada. Se você definir o preço máximo como -1, a VM não é despejada por preço: você paga o preço atual da Spot, nunca acima do preço normal da VM. O despejo por capacidade continua valendo.
Um detalhe operacional: para mudar o preço máximo, é preciso desalocar a VM antes.
Deallocate ou Delete
Ao criar a VM, você escolhe o que acontece no despejo.
Deallocate, o padrão, para a VM e mantém os discos. Ela pode ser religada depois, mas não há garantia de que haverá capacidade. Enquanto isso, os discos continuam sendo cobrados e a VM continua ocupando a sua cota.
Delete apaga a VM junto com os discos, e o armazenamento deixa de ser cobrado.
A escolha costuma ser feita no automático, e o padrão é justamente o que pode deixar custo e cota parados sem ninguém perceber.
Quando vale
A pergunta que eu faço antes de qualquer outra: se a VM sumir agora, o que se perde?
Se a resposta for “um pedaço de trabalho que recomeça sozinho”, Spot é uma boa escolha. É o caso de processamento em lote que salva o progresso, renderização, agentes de build e de CI, ambientes de desenvolvimento e teste, e cargas que já rodam em várias instâncias atrás de uma fila.
Se a resposta for “o usuário percebe” ou “o trabalho volta para o começo”, não é.
Quando não vale
Uma única instância atendendo usuário. Sem outra VM para assumir, o despejo vira indisponibilidade.
Trabalho longo sem checkpoint. Trinta segundos não salvam horas de processamento em memória.
Quando você precisa da capacidade agora. Se o despejo acontece porque falta capacidade na região, tentar criar outra Spot no mesmo momento tende a falhar pelo mesmo motivo. A própria Microsoft recomenda VM comum quando a capacidade precisa estar disponível de imediato.
Escolha o tamanho e a região olhando o histórico
Na criação da VM pelo portal, ao marcar a opção de desconto Spot, aparece o link para ver o histórico de preço e a taxa de despejo, inclusive comparando regiões próximas. A taxa de despejo é por hora: 10% significa 10% de chance de a VM ser despejada na próxima hora, com base nos últimos sete dias.
O mesmo dado está no Azure Resource Graph, na tabela SpotResources, com histórico de preço de 90 dias e taxa de despejo dos últimos 28. Uma consulta para comparar dois tamanhos em duas regiões:
SpotResources
| where type =~ 'microsoft.compute/skuspotevictionrate/location'
| where sku.name in~ ('standard_d2s_v5', 'standard_d4s_v5')
| where location in~ ('brazilsouth', 'eastus')
| project skuName = tostring(sku.name), location, spotEvictionRate = tostring(properties.evictionRate)
| order by skuName asc, location asc
Às vezes, o tamanho vizinho ou a região ao lado tem preço menor, taxa de despejo menor, ou as duas coisas.
Produção com Spot, sem apostar tudo
Existe um meio-termo para cargas de produção que escalam horizontalmente: o Spot Priority Mix, nos Virtual Machine Scale Sets com orquestração Flexible. Ele mistura VMs comuns e Spot no mesmo scale set, com duas configurações:
A base de VMs comuns (baseRegularPriorityCount) é a quantidade mínima de VMs que nunca são despejadas.
O percentual acima da base (regularPriorityPercentageAboveBase) define quantas das VMs que passarem da base serão comuns. O restante é Spot.
Com base 10 e 50%, um scale set com 30 VMs tem as 10 da base, mais 10 comuns e 10 Spot. Se todas as Spot forem despejadas ao mesmo tempo, a aplicação perde capacidade, mas não sai do ar.
Duas observações da documentação: o recurso não existe na orquestração Uniform, e mudar a configuração não rebalanceia as VMs que já existem. A nova divisão vale a partir da próxima operação de escala.
Para aproveitar os 30 segundos de aviso, a aplicação precisa ouvir o Scheduled Events e reagir: parar de aceitar trabalho novo, devolver à fila o que estava em andamento e sair do balanceador.
Três cuidados antes de ligar
A cota de Spot é separada. Ter cota para VMs comuns não garante cota para Spot. O pedido de aumento segue o processo normal de cota.
Nem todo tamanho aceita Spot. A série B e as versões promocionais de alguns tamanhos ficam de fora.
Deallocate tem custo invisível. Discos cobrados e cota ocupada por VMs que talvez nunca voltem. Se a carga não precisa dos discos depois do despejo, Delete costuma ser a escolha mais honesta.
O que fica
Spot não é uma VM barata. É uma VM com outro contrato: você paga menos e aceita que ela pode ir embora com meio minuto de aviso. Quando a arquitetura foi desenhada para isso, o desconto é dinheiro de verdade. Quando não foi, o desconto vira o custo de um incidente.
Se todas as suas VMs Spot fossem despejadas agora, o que o seu usuário perceberia?