Quando um nó ou pod do Kubernetes fica sem memória, os sintomas costumam ser intermitentes e difíceis de rastrear: aplicações falham inesperadamente, pods são removidos ou o desempenho do cluster degrada sem causa clara. O recurso de diagnóstico de memória do Container Intelligence Service ajuda a identificar a causa raiz de problemas comuns de memória em clusters ACK, incluindo vazamentos, fragmentação e erros de out of memory (OOM). Os resultados aparecem em gráficos e tabelas para avaliação rápida da integridade da memória do sistema.
O diagnóstico de memória abrange três áreas: visão geral da memória, análise de memória e análise de OOM. Inspecione o uso de memória tanto no nível do nó quanto no nível do pod.
Os itens de diagnóstico podem variar conforme a configuração do cluster. Os itens exibidos na página de diagnóstico refletem o estado real do seu cluster.
Ao executar o recurso de diagnóstico, o ACK roda um programa de coleta de dados em cada nó para reunir os resultados. Os dados coletados incluem versão do sistema, status de carga, status do docker e do kubelet, além de mensagens de erro importantes nos logs do sistema. O ACK não coleta informações de negócios nem dados sensíveis.
Fluxo de trabalho de diagnóstico
Utilize as três áreas de diagnóstico em sequência para isolar problemas de memória:
Visão geral da memória: verifique riscos de alto nível, como memória vazada, fragmentação, entradas Memcg não liberadas e desperdício de THP. Use os gráficos para confirme se o uso anormal está na memória do kernel ou da aplicação.
Análise de memória: aprofunde-se no uso de memória nos níveis de processo e pod para identificar qual processo ou container consome excesso de memória anônima, page cache ou memória compartilhada.
Análise de OOM: revise contagens e tipos de eventos OOM para determinar se os erros ocorrem no nível do nó (Host) ou do container (cgroup) e quais containers atingiram seus limites de memória.
Visão geral da memória
A visão geral da memória apresenta itens de diagnóstico relacionados a riscos. A tabela a seguir descreve cada item.
|
Item de diagnóstico |
Descrição |
|
Leaked Memory |
Verifica vazamentos de memória do kernel no Slab, Vmalloc e buddy system (allocpage). |
|
Memory Usage |
Exibe a utilização da memória do sistema. |
|
Memcg |
Avalia se grupos de memória (Memcg) não liberados degradam o desempenho do sistema ou causam erros estatísticos. |
|
Memory Fragmentation |
Verifica fragmentação de memória que degrade o desempenho do sistema. |
|
THPZeroPage |
Avalia a proporção de desperdício de Transparent Huge Page (THP). |
Gráficos também exibem o uso da memória do sistema, dividido em três categorias:
Memória do kernel (kernel): total utilizado pelo kernel do sistema operacional.
Memória da aplicação (app): total utilizado por programas em modo de usuário.
Memória livre (free): total de memória livre do sistema.
Conceitos principais
Os termos a seguir são utilizados em todo o diagnóstico de memória.
|
Termo |
Descrição |
|
Vazamento de memória |
Ocorre quando a memória alocada dinamicamente a um programa nunca é liberada, aumentando continuamente a utilização da memória do sistema. Vazamentos não resolvidos degradam o desempenho do programa e podem causar falhas no sistema. |
|
Utilização de memória |
Utilização de memória = (Memória total - Memória livre) x 100 / Memória total. O page cache conta como memória livre e não afeta a utilização, pois o kernel pode recuperá-lo e reutilizá-lo a qualquer momento. |
|
Memcg não liberado |
Grupo de memória não liberado devido a uma exceção do sistema. Entradas Memcg não liberadas podem degradar o desempenho do sistema. |
|
Fragmentação de memória |
Após longo período de execução, blocos contíguos de memória livre tornam-se pequenos demais para atender a grandes solicitações de alocação contígua. Isso atrasa a alocação e causa instabilidade nas aplicações. |
|
Proporção de desperdício de THP |
Proporção de desperdício de THP = Número de THPs zeradas x 100% / Número total de THPs. Consulte Detalhes sobre THP abaixo. |
|
Buddy system |
Algoritmo do kernel Linux para gerenciamento de páginas de memória. Divide as páginas em 11 grupos e gerencia blocos em potências de dois: 4 KB, 8 KB, 16 KB, 32 KB ... 4 MB. A maioria das páginas tem 4 KB. |
|
Slab |
Alocador que reserva pequenos pedaços de memória sobre o buddy system. |
|
Vmalloc |
Alocador que usa mapeamento não linear sobre o buddy system. |
|
Page cache (filecache) |
Ao ler ou gravar um arquivo, o Linux armazena seu conteúdo em cache na memória para acelerar acessos subsequentes. |
|
Memória anônima |
Memória alocada dinamicamente para o heap e a stack de um processo por meio de |
|
Memória compartilhada |
Bloco de memória compartilhado por dois ou mais processos para comunicação entre eles. |
|
tmpfs |
Sistema de arquivos temporário do Linux respaldado por memória. O conteúdo lido ou gravado no tmpfs permanece em cache na memória. |
|
hugetlb |
Memória consumida por huge pages em um sistema de arquivos. |
Detalhes sobre THP
As Transparent Huge Pages (THP) são huge pages de 2 MiB ou 1 GiB no kernel. Cada subpágina tem 4 KiB; portanto, uma THP de 2 MiB equivale a 512 subpáginas.
Com o THP ativado, o kernel aloca THPs dinamicamente para reduzir falhas no Translation Lookaside Buffer (TLB) e melhorar o desempenho da aplicação. No entanto, o THP pode causar inchaço e overcommitment de memória: quando uma aplicação solicita apenas 8 KiB (2 subpáginas), o kernel aloca uma THP completa de 2 MiB. Isso deixa 510 subpáginas zeradas que desperdiçam resident set size (RSS) e podem acionar erros OOM.
Métricas de memória do kernel
Na maioria dos casos, vazamentos de memória indicam uso anormal no Sunreclaim ou no buddy system. Monitore essas métricas atentamente.
|
Métrica |
Descrição |
|
SReclaimable |
Memória recuperável pelo Slab. |
|
Sunreclaim |
Memória não recuperável pelo Slab. Crescimento anormal aqui indica fortemente vazamento de memória do kernel. |
|
PageTables |
Memória ocupada pelas tabelas de páginas do kernel. |
|
Vmalloc |
Memória alocada pela função Vmalloc. |
|
KernelStack |
Total de memória ocupada pelo heap e pela stack de um processo. |
|
AllocPages |
Memória alocada do buddy system por funções como |
Métricas de memória da aplicação
Ao analisar o uso de memória em modo de usuário, concentre-se na memória anônima, memória compartilhada e page cache.
|
Métrica |
Descrição |
|
filecache |
Page cache recuperável mediante execução de drop caches. |
|
anon |
Memória anônima usada pelo heap e pela stack de um programa. Alto uso sugere vazamento de memória do processo ou THP ativado. |
|
mlock |
Memória bloqueada pelo sistema. |
|
huge |
Memória usada por huge pages. |
|
buffer |
Memória usada por metadados de dispositivos de bloco e sistemas de arquivos. |
|
shmem |
Memória compartilhada (tmpfs). Vazamentos ocorrem se um arquivo tmpfs não for excluído após a saída do processo ou se for excluído enquanto ainda estiver aberto. |
Análise de memória
A análise de memória divide-se em duas visualizações: memória de processo e memória de pod.
Memória de processo
A visualize de memória de processo mostra o uso por processo, incluindo memória anônima, page cache e memória compartilhada.
Memória de pod
A visualize de memória de pod indica quais arquivos ocupam page cache e memória compartilhada em cada container e pod, além das proporções de cache ativo e inativo.
|
Item de diagnóstico |
Descrição |
|
Pod |
Nome do pod. |
|
Container |
Nome do container. |
|
File |
Caminho completo do arquivo, incluindo o nome. |
|
Cache |
Page cache (filecache) ocupado pelo arquivo. |
|
Container Cache |
Cache no nível do container ocupado pelo arquivo. Vários processos no mesmo container podem referenciar o mesmo arquivo. |
|
Active Cache |
Page cache atualmente em uso. |
|
Inactive Cache |
Page cache fora de uso e elegível para recuperação. |
Análise de OOM
A análise de OOM diagnostica erros de out of memory e exibe os seguintes itens.
|
Item de diagnóstico |
Descrição |
|
OS OOM Count |
Total de erros OOM desde a inicialização do host até o momento do diagnóstico. |
|
Available Memory |
Memória livre atual do sistema. |
|
Low Watermark |
Limiar baixo de memória. Quando a memória disponível cai abaixo desse valor, o kernel aciona uma operação assíncrona de recuperação para liberar espaço. |
|
Container |
Nome do pod, id do container ou nome do cgroup. |
|
limit |
Limite de memória configurado para o container. |
|
usage |
Memória atual utilizada pelo container. |
|
OOM Count |
Total de erros OOM ocorridos no container. |
|
OOM Type |
Tipo de erro OOM: Host ou cgroup. |