Dimensionando o limite de memória de um contêiner em MiB
A capacidade chega até você em gibibytes: um nó anuncia 16 Gi de memória alocável, uma cota de namespace concede 64 Gi a um time. Mas o campo que você preenche — resources.limits.memory no manifesto do pod, ou o número depois de -Xmx — quase sempre é escrito em mebibytes. Transformar a cota em Gi nesse valor em Mi é a primeira conta de toda sessão de ajuste de heap, e a que mais gente resolve no chute.
MiB = GiB × 1024. Uma alocação de 6 GiB dá 6 × 1024 = 6144 MiB, então a linha do manifesto fica limits.memory: 6144Mi. Divida por 1024 para voltar.Mi não é a mesma coisa que M
Mi é um mebibyte (1 048 576 bytes), enquanto um M sozinho é um megabyte. Escrever 512M onde você queria 512Mi encolhe a alocação em 23,72 MiB em silêncio, sem nenhum aviso.O -Xmx fala a mesma base
m e g da JVM também são binários, então -Xmx4g e -Xmx4096m pedem o mesmo heap. É isso que faz do ×1024 a língua comum entre o manifesto e as flags da JVM.O heap não é o contêiner inteiro
-Xmx. Iguale o heap ao limite e o cgroup bate no teto antes que o coletor sinta qualquer pressão.Transformando uma cota em Gi num número de heap
Informe o valor em Gi
Digite no campo da esquerda o número em gibibytes da sua cota ou da descrição do nó. Frações funcionam — 1.5 e 1,5 valem igual, e espaços são ignorados.
Copie o número puro em MiB
O botão de copiar coloca só os dígitos na área de transferência, sem unidade grudada — exatamente o que vai antes de Mi no YAML ou depois de -Xmx num argumento da JVM.
Separe a reserva fora do heap
Tire uma fatia desse total em MiB para tudo que vive fora do heap. Um quarto do limite é uma reserva inicial comum para um serviço em JVM, apertada depois com base nos gráficos de consumo.
Confira um pod em execução no sentido inverso
Os painéis relatam a memória de trabalho em MiB. Toque em inverter unidades para trocar o sentido e ler um valor ao vivo em MiB de volta em gibibytes, contra a capacidade de nó que foi prometida a você.
Os dois campos continuam editáveis, então digitar do lado dos MiB converte de volta para GiB sem nenhum passo extra. Cada lado também traz uma lista de unidades com busca, útil quando um relatório de custo cota a mesma alocação em outra coisa.
Limites de contêiner e valores de heap lado a lado
Estes são os limites que mais aparecem em implantações reais, convertidos para mebibytes e divididos entre a fatia do heap e a reserva fora dele, na proporção 75/25. A coluna da reserva é a folga que mantém um pod fora da lista de OOMKilled.
| Limite do contêiner | Mesmo limite em MiB | Heap a 75% | Reserva fora do heap |
|---|---|---|---|
| 0,5 Gi | 512 MiB | 384 MiB | 128 MiB |
| 1 Gi | 1 024 MiB | 768 MiB | 256 MiB |
| 2 Gi | 2 048 MiB | 1 536 MiB | 512 MiB |
| 4 Gi | 4 096 MiB | 3 072 MiB | 1 024 MiB |
| 8 Gi | 8 192 MiB | 6 144 MiB | 2 048 MiB |
| 16 Gi | 16 384 MiB | 12 288 MiB | 4 096 MiB |
É nos contêineres pequenos que a proporção morde mais forte. Em 512 MiB a reserva é de apenas 128 MiB, e o metaspace mais algumas dezenas de pilhas de threads consomem boa parte dela — por isso pods Java minúsculos precisam de um percentual de heap menor que os grandes, e não do mesmo percentual reduzido na proporção.
Lê os números do manifesto como estão
Valores fracionários em Gi como 1,5 ou 2,5 convertem sem sobra para 1 536 e 2 560 MiB, então dá para escolher um limite entre as potências de dois redondas.
Pronto para colar em YAML e em flags
Cada campo copia o número sem enfeite, então ele cai direto em limits.memory ou numa string de JAVA_OPTS sem um sufixo perdido quebrar a leitura.
Funciona a partir de qualquer ponta
Comece pelo lado dos MiB quando o número veio de um painel de métricas, ou pelo lado dos GiB quando ele veio de uma cota. Inverter unidades renomeia o par num toque.
Nada sai do navegador
Números de dimensionamento de cluster são informação interna. Tudo é calculado na sua própria máquina depois que a página termina de carregar.
Perguntas sobre memória de contêiner
O Mi de um manifesto do Kubernetes significa o mesmo que MiB?
Sim. Os sufixos de quantidade Ki, Mi, Gi e Ti são as unidades binárias da IEC, então 1Gi equivale a 1 024 mebibytes. Os sufixos sem o i pertencem ao conjunto decimal, e as duas formas são válidas no mesmo arquivo — que é exatamente por que um erro de digitação de um caractere passa batido na revisão.
Por que deixar folga entre o heap da JVM e o limite do contêiner?
O cgroup conta cada byte que o processo toca. Pilhas de threads, metaspace, o cache de código do JIT, as estruturas do coletor e os buffers diretos ficam todos por cima do -Xmx. Quando esse total cruza o limite, o kernel encerra o processo na hora, sem nenhuma degradação suave antes — então a reserva precisa ser planejada, e não descoberta no meio de um incidente.
O que o -Xmx4g reserva de fato, e como escrevo isso em MiB?
-Xmx4g limita o heap a 4 GiB, o que dá 4 096 MiB e é idêntico a -Xmx4096m. Esses sufixos sempre foram binários na JVM, então não é preciso ajuste nenhum ao mover um valor entre uma flag e um campo Mi. JVMs modernas também aceitam um percentual do limite de contêiner detectado, o que poupa uma edição em dois lugares sempre que o limite muda.
O cache de páginas do Linux conta no limite de memória do meu pod?
As páginas de arquivo em cache são cobradas do cgroup, então um contêiner que lê ou escreve bastante parece muito mais perto do limite do que o heap sozinho sugere. O kernel recupera esse cache sob pressão em vez de matar o pod por causa dele. Quando um gráfico em MiB parecer alarmante, verifique se o crescimento é de memória anônima ou apenas de cache antes de aumentar o limite em Gi.
Requisição e limite de memória devem ser escritos os dois em Mi?
Manter os dois numa unidade só é o hábito prático, e o Mi dá controle fino sem decimais. A requisição é o que o escalonador usa para posicionar o pod; o limite é o que o kernel impõe. Escrever um em Gi e o outro em Mi é válido, mas torna difícil julgar de relance a distância entre eles num diff.
Ainda não há comentários. Seja o primeiro a comentar!