Quando a recuperação de memória não consegue resolver a escassez de memória em um sistema Linux, o kernel invoca o OOM Killer para encerrar processos de forma forçada. Este tópico aborda as causas comuns de eventos do OOM Killer no Alibaba Cloud Linux e como resolvê-los.
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
Possíveis causas
Os eventos do OOM Killer resultam de memória global insuficiente ou de memória de cgroup insuficiente. A tabela a seguir lista os 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 do cgroup pai insuficiente |
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 |
Indicadores-chave neste log:
Causa: em uma arquitetura NUMA, o parâmetro |
|
Memória insuficiente no buddy system devido à fragmentação de memória |
Indicadores-chave neste log:
Causa: a fragmentação de memória impede o buddy system de alocar um bloco contíguo do tamanho necessário, mesmo que a memória livre total seja 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 com base na causa identificada.
Memória insuficiente em um cgroup ou cgroup pai
Encerre processos desnecessários para liberar memória. Se a sua carga de trabalho exigir mais memória, faça upgrade da instância.
-
Faça upgrade da instância.
-
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 seu cgroup.
Memória global insuficiente
Investigue as seguintes áreas:
-
Verifique o uso de memória
slab_unreclaimable.cat /proc/meminfo | grep "SUnreclaim"slab_unreclaimableé uma área de memória que o sistema não consegue recuperar. Se ela ultrapassar 10% da memória total, provavelmente há um vazamento de memória slab. Investigue o problema conforme descrito em What do I do if an instance has a high percentage of slab_unreclaimable memory? Se o problema persistir, envie um ticket. -
Confira o uso de memória do
systemd.cat /proc/1/status | grep "RssAnon"O kernel ignora o processo 1 (
systemd) durante os encerramentos por OOM, portanto o uso de memória dosystemdnão deve ultrapassar 200 MB. Se o consumo estiver anormalmente alto, atualize osystemdpara uma versão mais recente. -
Avalie o desempenho das Transparent Huge Pages (THP).
As THP podem causar um inchaço de memória que leva a eventos de OOM. Para mitigar esse problema, ajuste as configurações de THP conforme descrito em How do I use THP to tune performance in Alibaba Cloud Linux?
Memória insuficiente em um nó de memória
Reconfigure o cpuset.mems para permitir que o cgroup utilize memória de nós adicionais.
-
Identifique os nós de memória do seu 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 seu cgroup.Por exemplo, se o seu sistema tiver três nós (Node 0, Node 1 e Node 2) e você quiser que o cgroup utilize memória dos nós Node 0 e Node 2, defina
<value>como0,2.
Memória insuficiente no buddy system devido à fragmentação de memória
Execute a compactação de memória durante horários de baixa utilização:
sudo bash -c 'echo 1 > /proc/sys/vm/compact_memory'