Quando a recuperação de memória não resolve a escassez de memória em um sistema Linux, o kernel aciona o OOM Killer para encerrar processos à força. Este tópico aborda as causas comuns de eventos do OOM Killer no Alibaba Cloud Linux e suas respectivas soluções.
Descrição do problema
O log a seguir mostra o processo test acionando o OOM Killer:
565 [Sat Sep 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
566 [Sat Sep 11 12:24:42 2021] test cpuset=/ mems_allowed=0
567 [Sat Sep 11 12:24:42 2021] CPU: 1 PID: 29748 Comm: test Kdump: loaded Not tainted 4.19.91-24.1.al7.x86_64 #1
568 [Sat Sep 11 12:24:42 2021] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS e62**** 04/01/2014
Causas possíveis
Eventos do OOM Killer resultam de memória global ou de cgroup insuficiente. A tabela a seguir lista cenários comuns:
|
Causa |
Exemplo de cenário |
|
Memória de cgroup insuficiente |
Neste log, o OOM Killer é acionado para o cgroup
Causa: O cgroup |
|
Memória insuficiente no cgroup pai |
Neste caso, o processo
Causa: O cgroup pai |
|
Memória global insuficiente |
Neste log,
Causa: A memória livre caiu abaixo do limiar mínimo e a recuperação de memória não conseguiu liberar páginas suficientes. |
|
Memória insuficiente em um nó de memória |
Principais indicadores neste log:
Causa: Em arquiteturas NUMA, |
|
Memória insuficiente no buddy system devido à fragmentação |
Principais indicadores neste log:
Causa: A fragmentação de memória impede o buddy system de alocar um bloco contíguo do tamanho necessário, mesmo com memória livre total suficiente. Nota
O buddy system é um alocador de memória do kernel Linux que gerencia blocos contíguos de tamanhos variados para reduzir a fragmentação. |
Soluções
Resolva o problema conforme a causa identificada.
Memória insuficiente em um cgroup ou cgroup pai
Encerre processos desnecessários para liberar memória. Caso a carga de trabalho exija mais memória, faça upgrade da instância.
-
Faça upgrade da instância.
Consulte Visão geral da alteração de configuração.
-
Após o upgrade, ajuste manualmente o limite de memória do cgroup.
sudo bash -c 'echo <value> > /sys/fs/cgroup/memory/<cgroup_name>/memory.limit_in_bytes'Substitua
<value>pelo novo limite de memória do cgroup em bytes e<cgroup_name>pelo nome do cgroup.
Memória global insuficiente
Investigue as seguintes áreas:
-
Verifique o uso de memória
slab_unreclaimable.cat /proc/meminfo | grep "SUnreclaim"slab_unreclaimablerefere-se à memória que o sistema não consegue recuperar. Se esse valor exceder 10% da memória total, provavelmente há um vazamento de memória slab. Para solucionar, siga as instruções em O que devo fazer se uma instância tiver uma alta porcentagem de memória slab_unreclaimable?. Se o problema persistir, envie um ticket. -
Verifique o uso de memória do
systemd.cat /proc/1/status | grep "RssAnon"O kernel ignora o processo 1 (
systemd) durante encerramentos por OOM; portanto, o uso de memória dosystemdnão deve exceder 200 MB. Se o consumo estiver anormalmente alto, atualize osystemdpara uma versão mais recente. -
Analise o desempenho das Transparent Huge Pages (THP).
As THPs podem causar inchaço de memória e levar a eventos de OOM. Para mitigar esse efeito, ajuste as configurações de THP conforme descrito em Como usar THP para ajustar o desempenho no Alibaba Cloud Linux?.
Memória insuficiente em um nó de memória
Configure cpuset.mems para permitir que o cgroup use memória de nós adicionais.
-
Identifique os nós de memória do sistema.
cat /proc/buddyinfo -
Configure o parâmetro
cpuset.mems.sudo bash -c 'echo <value> > /sys/fs/cgroup/cpuset/<cgroup_name>/cpuset.mems'Substitua
<value>pelos números dos nós de memória correspondentes e<cgroup_name>pelo nome do cgroup.Por exemplo, se o sistema tiver três nós (Nó 0, Nó 1 e Nó 2) e você desejar que o cgroup utilize memória do Nó 0 e do Nó 2, defina
<value>como0,2.
Memória insuficiente no buddy system devido à fragmentação
Execute a compactação de memória fora dos horários de pico:
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'