PerfectScalePerfectScale

PerfectScale

Init Spike Handling: pods JVM com os recursos certos no boot e em execução

O Init Spike Handling dá aos pods JVM recursos de inicialização no boot e depois faz o resize in-place para o estado estável. Reduza o desperdício sem restarts.

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Ira Chernous
By Ira Chernous
Oct 21, 20266 min read

Banner com os dizeres PerfectScale Right-Sizes Java and Spiky Pods, com um gráfico de CPU ao longo do tempo que cai após a inicialização.

A maioria dos pods JVM é dimensionada para os dois primeiros minutos de vida e depois roda superdimensionada pelos dois meses seguintes. Se você roda Java no Kubernetes, conhece bem esse trade-off. Carregamento de classes, compilação JIT e aquecimento de cache exigem muita CPU e memória no boot. Depois que o serviço sobe, a demanda cai e permanece baixa. Ou seja, você paga por recursos no nível da inicialização em cada réplica, o tempo todo. Se dimensionar pela demanda do estado estável, você corre o risco de throttling de CPU, OOM kills e todos os problemas que vêm junto.

O PerfectScale agora faz diferente. Veja como!

Uma recomendação, dois perfis de recursos

Uma recomendação baseada em médias de uso de longo prazo mistura o pico de inicialização com tudo o que vem depois. O resultado? Requests de recursos altos demais para o estado estável, mas que ainda não cobrem totalmente as necessidades da inicialização.

As equipes geralmente acabam escolhendo uma destas três opções:

  • Superprovisionar para a inicialização: a abordagem mais comum. Evita problemas no boot, mas você paga por essa capacidade extra em cada réplica, o tempo todo.
  • Ajustar recursos manualmente: ajustar os recursos de inicialização e de execução separadamente e repetir o processo toda vez que um release mudar o perfil do workload. Disponível com o resize in-place, GA no Kubernetes v1.35+.
  • Dimensionar pelo estado estável e torcer para dar certo: até que throttling de CPU, OOM kills ou falhas de inicialização provem o contrário. Tomara que seja a minoria.

O problema não é o dimensionamento em si. O workload tem dois perfis de recursos distintos, enquanto a recomendação considera apenas um.

Right-sizing autônomo dos recursos de inicialização e de execução

O PerfectScale identifica continuamente workloads com necessidades diferentes na inicialização e na execução e fornece recomendações de recursos separadas para cada fase:

  • Fase de inicialização (init). Aplicada quando o pod é criado, por meio do mutation hook que o PerfectScale já usa para injetar os recursos recomendados. A recomendação de inicialização é dimensionada pela maior das duas fases, para que o pod não seja agendado em um nó incapaz de dar conta do boot.
  • Fase de estado estável (runtime). Concluída a fase de inicialização, o PerfectScale aplica a recomendação de runtime usando o resize in-place. Os recursos são ajustados no Pod em execução, sem restart e sem nenhuma mudança manual no manifesto.

O PerfectScale se apoia em recursos nativos do Kubernetes, usando a API In-Place Pod Resize (GA na v1.35) para aplicar as recomendações de recursos de runtime sem reiniciar os Pods. O PerfectScale acrescenta a inteligência e a automação para que a otimização de inicialização e de runtime funcione de forma fluida. Ele acompanha o ciclo de vida de cada Pod e troca automaticamente dos recursos de inicialização para os de runtime quando a fase de inicialização termina. Se um Pod não puder ser redimensionado com segurança, o PerfectScale recorre a uma única recomendação de recursos para não causar interrupções no workload.

O que isso significa para você

Antes Depois
Recursos de pico de inicialização pagos durante todo o tempo de execução A inicialização recebe o pico e depois o pod é redimensionado para o que o estado estável precisa
Dimensionar pelo estado estável traz risco de throttling, OOM kills ou falhas na inicialização A fase de inicialização é dimensionada pela maior das duas fases
Ajuste manual dos recursos de inicialização vs. execução, refeito conforme os workloads mudam Transição automática de init para runtime, sem restart e sem etapa manual
Risco de uma mudança automatizada quebrar uma JVM Guardrails de segurança baseados no seu framework
Mudanças automatizadas em que é difícil confiar Cada mudança é rastreada por revisão do workload, com seu impacto em uso, desperdício e economia

Impacto:

  • Seus workloads recebem os recursos de que precisam em cada etapa, e você deixa de pagar por capacidade de nível de inicialização muito depois que o boot terminou.
  • É difícil confiar em uma automação que você não consegue inspecionar. O PerfectScale rastreia as mudanças de recursos entre as revisões do workload e mostra os recursos de inicialização e de estado estável separadamente no Podfit e no Zoom-in.
  • Os cálculos de custo, desperdício e economia refletem as necessidades de recursos de cada fase, não uma média única.

Não é só para Java

Qualquer workload com necessidades diferentes de recursos na inicialização e na execução pode se beneficiar dessa abordagem. Exemplos comuns:

  • JavaScript e TypeScript: durante o warmup do JIT do V8.
  • Ruby on Rails e Django: durante o carregamento de frameworks e do estado da aplicação.
  • Tarefas de init: migrações de banco de dados, aquecimento de cache e outras operações de inicialização.
  • Testes de estresse e de carga: quando os workloads precisam temporariamente de mais recursos durante a inicialização ou o ramp-up dos testes.

O PerfectScale detecta esses padrões e ajusta os recursos entre as fases, com salvaguardas adicionais para frameworks como o Java.

Quer aprender a lidar com Java e outros workloads com picos de forma mais eficiente? Participe do nosso webinar para explorar os desafios e ver como o PerfectScale lida com eles. Confira os detalhes e inscreva-se no webinar aqui.