Um uso elevado de memória slab_unreclaimable em uma instância ECS Linux pode indicar um 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" em uma instância Linux. Se o valor de SUnreclaim for elevado (por exemplo, SUnreclaim: 6069340 kB), a instância apresenta uso elevado de memória slab_unreclaimable. Quando slab_unreclaimable ultrapassa 10% da memória total, é provável que haja um vazamento de memória slab.
Causa
O alocador slab do kernel mantém em cache objetos de memória de mesmo tamanho para reduzir a fragmentação. A porção slab_unreclaimable armazena memória que o kernel não consegue liberar porque contém objetos ativos, como caches de dentry e inode. Se esses caches crescerem excessivamente, o uso elevado de slab_unreclaimable pode acionar o OOM Killer.
Solução
-
Conecte-se à instância Linux.
Para mais informações, consulte Remote connection methods for ECS instances.
-
Identifique o slab não recuperável com mais
objectsou maior uso de memória:-
Encontre o slab com mais
objectsou maior uso de memória.slabtop -s -aRegistre o nome do slab (coluna
NAME) com o maior valor deOBJ/SLAB. -
Verifique se a memória do slab é não recuperá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 não recuperável; a saída 1 indica recuperável.
-
-
Identifique a causa raiz do vazamento de memória slab.
Utilize a ferramenta crash para análise estática ou a ferramenta perf para análise dinâmica. Os exemplos a seguir utilizam o slab
kmalloc-192.Método 1: Usar o 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 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 de
kmalloc-192no crash:kmem -S kmalloc-192Para limitar a saída, exiba apenas as últimas linhas. Por exemplo, para ver as 10 últimas 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 alto uso de memóriaALLOCATED. -
Visualize os dados de memória de
ffff88028398a000:rd ffff88028398a000 512 -SSe a saída for extensa, exiba-a paginada.
Se a função
put_cred_rcuaparecer repetidamente na saída, pesquiseput_cred_rcuno código-source do kernel Linux:void __put_cred(struct cred *cred) { call_rcu(&cred->rcu, put_cred_rcu); }put_cred_rculibera de forma assíncrona a structcred. A presença repetida deput_cred_rcuao final da structcredindica um vazamento de memória slab no kernel.
Método 2: Usar o perf para análise dinâmica
-
Instale a ferramenta perf.
sudo yum install perf -y -
Utilize o perf para capturar a 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 se chama testperf.txt:
sudo perf script > testperf.txt -
Visualize o arquivo testperf.txt:
cat testperf.txtIdentifique os slabs sem memória
freee rastreie a função responsável no código-source do kernel.
-
-
Após identificar o caminho de chamada de função ou a estrutura de dados do kernel que causa o vazamento, trabalhe com desenvolvedores de kernel ou profissionais de O&M para localizar a origem e resolver o problema.
Possíveis soluções:
Atualize o kernel ou aplique um patch.
Ajuste os parâmetros do kernel.
Reinicie os 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 degradação de desempenho.