Um valor elevado de memória slab_unreclaimable em uma instância ECS Linux pode indicar vazamento de memória slab do kernel. Este guia ajuda a identificar a causa raiz e resolver o problema.
Sintomas
Execute cat /proc/meminfo | grep "SUnreclaim" na instância Linux. Se o valor de SUnreclaim for alto (por exemplo, SUnreclaim: 6069340 kB), a instância apresenta uso elevado de memória slab_unreclaimable. Caso slab_unreclaimable ultrapasse 10% da memória total, provavelmente há vazamento de memória slab.
Causa
O alocador slab do kernel armazena objetos de memória de mesmo tamanho em cache para reduzir a fragmentação. A parte slab_unreclaimable retém memória que o kernel não consegue liberar por conter objetos ativos, como caches de dentry e inode. Se esses caches crescerem excessivamente, o alto uso de slab_unreclaimable pode acionar o OOM Killer.
Solução
-
Conecte-se à instância Linux.
Para mais informações, consulte Métodos de conexão remota para instâncias ECS.
-
Identifique o slab irrecuperável com maior número de
objectsou maior uso de memória:-
Localize o slab com mais
objectsou maior consumo de memória.slabtop -s -aAnote o nome do slab (coluna
NAME) com o maior valor deOBJ/SLAB. -
Verifique se a memória do slab é irrecuperável.
Substitua
<slab NAME>pelo nome do slab com o maior valor deOBJ/SLABobtido na etapa anterior.cat /sys/kernel/slab/<slab NAME>/reclaim_accountPor exemplo, verifique se
kmalloc-192é recuperável:cat /sys/kernel/slab/kmalloc-192/reclaim_accountA saída 0 indica que é irrecuperável; a saída 1 indica que é recuperável.
-
-
Identifique a causa raiz do vazamento de memória slab.
Use a ferramenta crash para análise estática ou a ferramenta perf para análise dinâmica. Os exemplos a seguir usam o slab
kmalloc-192.Método 1: Usar crash para análise estática
-
Instale a ferramenta crash.
sudo yum install crash -y -
Instale a ferramenta kernel-debuginfo.
-
Alibaba Cloud Linux 3
sudo yum install -y kernel-debuginfo-<kernel version> --enablerepo=alinux3-plus-debugNotaSubstitua
kernel versionpela versão real do seu kernel. Executeuname -rpara verificar. -
Alibaba Cloud Linux 2
sudo yum install kernel-debuginfo -y
-
-
Inicie a ferramenta crash.
sudo crash -
Visualize as estatísticas de memória para
kmalloc-192no crash:kmem -S kmalloc-192Para limitar a saída, visualize apenas as últimas linhas. Por exemplo, para visualizar as últimas 10 linhas:
kmem -S kmalloc-192 | tail -n 10Exemplo de saída do comando:
SLAB MEMORY NODE TOTAL ALLOCATED FREE ffffea004c94e780 ffff88132539e000 0 42 29 13 ffffea004cbef900 ffff88132fbe4000 0 42 40 2 ffffea000a0e6280 ffff88028398a000 0 42 40 2 ffffea004bfa8000 ffff8812fea00000 0 42 41 1 ffffea006842b380 ffff881a10ace000 0 42 41 1 ffffea0009e7dc80 ffff880279f72000 0 42 34 8 ffffea004e67ae80 ffff881399eba000 0 42 40 2 ffffea00b18d6f80 ffff882c635be000 0 42 42 0A saída mostra que
ffff88028398a000possui pouca memóriaFREEe alta memóriaALLOCATED. -
Visualize os dados de memória para
ffff88028398a000:rd ffff88028398a000 512 -SSe a saída for extensa, exiba-a em páginas.
Caso a função
put_cred_rcuse repita várias vezes na saída, pesquise porput_cred_rcuno código-fonte do kernel Linux:void __put_cred(struct cred *cred) { call_rcu(&cred->rcu, put_cred_rcu); }A função
put_cred_rculibera a structcredde forma assíncrona. A presença repetida deput_cred_rcuao final da structcredindica vazamento de memória slab no kernel.
Método 2: Usar perf para análise dinâmica
-
Instale a ferramenta perf.
sudo yum install perf -y -
Use o perf para capturar memória não liberada em
kmalloc-192durante 200 segundos:sudo perf record -a -e kmem:kmalloc --filter 'bytes_alloc == 192' -e kmem:kfree --filter ' ptr != 0' sleep 200 -
Salve os dados capturados em um arquivo.
Neste exemplo, o arquivo chama-se testperf.txt:
sudo perf script > testperf.txt -
Visualize o arquivo testperf.txt:
cat testperf.txtIdentifique slabs sem memória
freee rastreie a função responsável no código-fonte do kernel.
-
-
Após identificar o caminho de chamada de função ou a estrutura de dados do kernel causadora do vazamento, trabalhe com desenvolvedores do kernel ou profissionais de O&M para encontrar a origem e resolver o problema.
Possíveis soluções:
Atualize o kernel ou aplique patches.
Ajuste parâmetros do kernel.
Reinicie serviços ou módulos afetados.
Otimize aplicações ou drivers.
Reinicie o sistema.
Referências
Vazamentos de memória slab reduzem a memória disponível, causam fragmentação e podem acionar o OOM Killer ou degradar o desempenho.