Todos os produtos
Search
Central de documentação

Alibaba Cloud Linux:Troubleshoot the OOM Killer

Última atualização: Sep 21, 2026

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 /mm_test que contém o processo test:

[Wed Sep  8 18:01:32 2021] test invoked oom-killer: gfp_mask=0x240****(GFP_KERNEL), nodemask=0, order=0, oom_score_adj=0
[Wed Sep  8 18:01:32 2021] Task in /mm_test killed as a result of limit of /mm_test
[Wed Sep  8 18:01:32 2021] memory: usage 204800kB, limit 204800kB, failcnt 26

Causa: o cgroup /mm_test atingiu seu limite de memória de 200 MB.

Memória do cgroup pai insuficiente

Neste caso, o processo test no cgroup /mm_test/2 é encerrado porque o cgroup pai /mm_test atingiu seu limite de memória:

[Fri Sep 10 16:15:14 2021] test invoked oom-killer: gfp_mask=0x240****(GFP_KERNEL), nodemask=0, order=0, oom_score_adj=0
[Fri Sep 10 16:15:14 2021] Task in /mm_test/2 killed as a result of limit of /mm_test
[Fri Sep 10 16:15:14 2021] memory: usage 204800kB, limit 204800kB, failcnt 1607

Causa: o cgroup pai /mm_test atingiu seu limite de 200 MB, o que acionou o OOM Killer no cgroup filho /mm_test/2, mesmo que o filho não tivesse alcançado seu próprio limite.

Memória global insuficiente

Neste log, limit of host indica memória global insuficiente. A memória livre (free) no nó 0 caiu abaixo da marca d'água baixa (low):

[Sat Sep 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0,
[Sat Sep 11 12:24:42 2021] Task in /user.slice killed as a result of limit of host
[Sat Sep 11 12:24:42 2021] Node 0 DMA32 free:155160kB min:152412kB low:190512kB high:228612kB
[Sat Sep 11 12:24:42 2021] Node 0 Normal free:46592kB min:46712kB low:58388kB high:70064kB

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:

  • limit of host indica que um nó de memória ficou sem memória.

  • A instância possui dois nós de memória: Node 0 e Node 1.

  • A memória livre (free) no Node 1 está abaixo da marca d'água baixa (low).

  • A memória livre total permanece alta (free:4111496).

[Sat Sep 11 09:46:24 2021] main invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
[Sat Sep 11 09:46:24 2021] main cpuset=mm_cpuset mems_allowed=1
[Sat Sep 11 09:46:24 2021] Task in / killed as a result of limit of host
[Sat Sep 11 09:46:24 2021] Mem-Info:
[Sat Sep 11 09:46:24 2021] active_anon:172 inactive_anon:4518735 isolated_anon:
    free:4111496 free_pcp:1 free_cma:0
[Sat Sep 11 09:46:24 2021] Node 1 Normal free:43636kB min:45148kB low:441424kB high:837700kB
[Sat Sep 11 09:46:24 2021] Node 1 Normal: 856*4kB (UME) 375*8kB (UME) 183*16kB (UME) 184*32kB (UME) 87*64kB (ME) 45*128kB (UME) 16*256kB (UME) 5*512kB (UE) 14*1024kB (UME) 0     *2048kB 0*4096kB = 47560kB
[Sat Sep 11 09:46:24 2021] Node 0 hugepages_total=360 hugepages_free=360 hugepages_surp=0 hugepages_size=1048576kB
[Sat Sep 11 09:46:24 2021] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[Sat Sep 11 09:46:24 2021] Node 1 hugepages_total=360 hugepages_free=360 hugepages_surp=0 hugepages_size=1048576kB
[Sat Sep 11 09:46:25 2021] Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB

Causa: em uma arquitetura NUMA, o parâmetro cpuset.mems pode restringir um cgroup a nós de memória específicos. Se esses nós se esgotarem, o OOM Killer é acionado mesmo quando outros nós ainda possuem memória livre. Execute cat /proc/buddyinfo para verificar o status dos nós.

Memória insuficiente no buddy system devido à fragmentação de memória

Indicadores-chave neste log:

  • O OOM Killer foi acionado em uma alocação order=3 (bloco contíguo de 32 KB).

  • A memória livre (free) no nó 0 está acima da marca d'água baixa (low).

  • O buddy system não possui blocos do tamanho necessário (0*32kB (M)).

[Sat Sep 11 15:22:46 2021] insmod invoked oom-killer: gfp_mask=0x60****(GFP_KERNEL), nodemask=(null), order=3, oom_score_adj=0
[Sat Sep 11 15:22:46 2021] insmod cpuset=/ mems_allowed=0
[Sat Sep 11 15:22:46 2021] Task in /user.slice killed as a result of limit of host
[Sat Sep 11 15:22:46 2021] Node 0 Normal free:23500kB min:15892kB low:19864kB high:23836kB active_anon:308kB inactive_anon:194492kB active_file:384kB inactive_file:420kB unevi    ctable:0kB writepending:464kB present:917504kB managed:852784kB mlocked:0kB kernel_stack:2928kB pagetables:9188kB bounce:0kB
[Sat Sep 11 15:22:46 2021] Node 0 Normal: 1325*4kB (UME) 966*8kB (UME) 675*16kB (UME) 0*32kB (M) 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB =

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.

  1. Faça upgrade da instância.

    Configuration change overview.

  2. 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 do systemd não deve ultrapassar 200 MB. Se o consumo estiver anormalmente alto, atualize o systemd para 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.

  1. Identifique os nós de memória do seu sistema.

    cat /proc/buddyinfo
  2. 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> como 0,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'