[Linux] Sobre a introdução e o método de processamento relacionados ao OOM (Out of Memory)

Sobre a introdução e o método de processamento relacionados ao OOM (Out of Memory)

O mecanismo OOM (Out-of-Memory) faz parte do kernel e é usado para lidar com o consumo excessivo de memória. É responsabilidade do mecanismo OOM selecionar um ou mais processos que consomem muita memória e finalizá-los para liberar memória.

No Linux, o OOM Score de um processo determina que o processo tem maior probabilidade de ser encerrado no caso de memória insuficiente. Um processo com uma OOM Score mais alta tem maior probabilidade de ser finalizado.

Você não deve modificar o OOM Score de um processo diretamente. Em geral, você pode influenciar o comportamento OOM das seguintes maneiras:

  1. Ajuste os limites de memória no nível do sistema (por exemplo, sysctl ajusta o limite vm.overcommit_memory)
  2. Ajustar o uso de memória (por exemplo, gerenciar memória no código do aplicativo ou usar processos ajustáveis ​​ou limites de contêiner)
  3. Ajuste a configuração global de OOM Score (como modificar o valor /proc/sys/vm/oom_score_adj, que afeta todos os processos)

De qualquer forma, manuseie as configurações de OOM com cuidado e atenção e certifique-se de que elas correspondam às suas reais necessidades.

Você pode usar sysctl para ajustar a configuração vm.overcommit_memory em sistemas Linux. Essa configuração controla como o kernel do Linux lida com a superalocação de memória.

Modificar limite vm.overcommit_memory

Aqui estão as etapas para modificar a configuração vm.overcommit_memory usando sysctl no Linux:

  1. Confirme a configuração vm.overcommit_memory atual. Execute o seguinte comando em um terminal:

    sysctl vm.overcommit_memory
    

    Se você precisar de privilégios elevados para executar este comando, anexe sudo ao comando.

  2. Determine se você precisa modificar as configurações de memória com base na saída. vm.overcommit_memory tem os três valores a seguir para escolher:

    • 0: Indica que o kernel verificará se há memória livre suficiente para atender às necessidades do processo e, se não houver memória suficiente, o kernel encerrará o processo e liberará a memória.
    • 1: Indica que o kernel permitirá que os processos aloquem toda a memória virtual solicitada e não verificará se a memória física é suficiente. Quando a memória física está baixa, o processo pode travar devido à falta de memória disponível.
    • 2: Indica que o kernel permitirá que os processos aloquem toda a memória virtual solicitada, mas verificará se o espaço de troca e a memória física são suficientes. Se ambos forem insuficientes, o kernel matará o processo e liberará a memória.
  3. Modifique a configuração vm.overcommit_memory. Digite o seguinte comando na linha de comando e substitua o valor desejado (0 a 2):

    sudo sysctl vm.overcommit_memory=<value>
    

    Por exemplo, se você quiser definir o valor como 2, poderá executar o seguinte comando:

    sudo sysctl vm.overcommit_memory=2
    
  4. Se você deseja salvar os valores modificados permanentemente, você pode adicioná-los ao arquivo /etc/sysctl.conf. Adicione as seguintes linhas no final do arquivo:

    vm.overcommit_memory = <value>
    

    Substitua pelo valor (0 a 2) da configuração desejada.

Observação: observe se a versão do sistema operacional e a versão do kernel suportam o valor que você definiu. Além disso, faça alterações nas configurações de memória com cuidado para evitar comportamento imprevisível.

Ajustar uso de memória

1. Gerenciar memória no código do aplicativo: os aplicativos podem usar algumas técnicas para gerenciar a memória, como liberação manual de memória, uso de pools de memória e reutilização de memória. Ele pode ajudar os aplicativos a evitar o uso excessivo de memória, reduzindo assim a probabilidade de problemas OOM.

2. Use limites de processo ou contêiner ajustáveis: você pode usar limites de processo ou contêiner ajustáveis ​​para limitar a quantidade de memória que um processo ou contêiner pode usar. Esses limites podem ser ajustados conforme necessário e podem ser usados ​​para evitar o uso excessivo de memória e problemas de OOM.

3. Atualize o hardware: Se ocorrerem problemas freqüentes de OOM, você pode considerar a atualização do hardware do sistema, como aumentar a capacidade de memória. Isso aumentará a capacidade de memória do sistema e reduzirá a ocorrência de problemas OOM.

Ajuste as configurações globais para OOM Score

OOM Score é um indicador usado para determinar a prioridade de um processo em um sistema Linux.Você pode ajustar a prioridade de um processo no sistema alterando este valor. Aqui estão as etapas para ajustar as configurações globais do OOM Score:

  1. Abra o arquivo /etc/sysctl.conf:
sudo vim /etc/sysctl.conf
  1. Adicione as seguintes linhas no final do arquivo:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.oom_kill_allocating_task = 0
  1. Explique o significado desses três parâmetros:
  • vm.overcommit_memory: Indica o mecanismo de verificação da adequação da memória do sistema. 0 significa que o sistema verificará e reduzirá o uso de memória conforme necessário, 1 significa que o sistema permitirá a alocação de memória que exceda a quantidade total de memória do sistema (ou seja, memória virtual) e 2 significa que todas as solicitações de memória são alocadas independentemente de saber se o espaço de troca é suficiente.
  • vm.overcommit_ratio: indica a proporção de memória física para memória virtual alocada para a camada de aplicativo quando vm.overcommit_memory está habilitado. O valor padrão é 50%, portanto, ajustar o valor para 80% pode fornecer mais memória física à camada de aplicativo.
  • vm.oom_kill_allocating_task: Indica se deve eliminar a tarefa que está alocando memória para liberar a memória quando OOM (falta de memória) ocorrer no sistema. Definir esse valor como 0 permite que o sistema elimine processos existentes em vez de processos que estão alocando memória.
  1. Salve e saia do arquivo, reinicie o sistema (ou execute o seguinte comando para efetivar as configurações):
sudo sysctl -p

Dessa forma, todos os processos do sistema serão priorizados de acordo com a nova configuração, permitindo um melhor gerenciamento do uso da memória. Deve-se notar que ajustar a prioridade do sistema tem certos riscos, avalie cuidadosamente e faça backup dos dados antes da operação.

Modifique temporariamente o valor oom_score_adj

Por exemplo, modifique temporariamente o valor oom_score_adj do processo ssh

cat /proc/1589/oom_score_adj
-1000
# 覆盖原值
echo 0 > /proc/1589/oom_score_adj

documentos envolvidos

panic_on_oom

Usado para controlar o que fazer quando a memória estiver baixa.

/proc/sys/vm/panic_on_oom

  • Um valor de 0: quando a memória for insuficiente, inicie o OOM killer.

  • Um valor de 1: Quando a memória é insuficiente, um kernel panic (reinicialização do sistema) pode ser acionado e o OOM killer também pode ser ativado.

  • O valor é 2: Quando a memória é insuficiente, significa que o pânico do kernel é forçado a ser acionado e o kernel trava GG (reinicialização do sistema).

oom_kill_allocating_task

Usado para decidir qual processo matar primeiro quando o OOM é acionado

/proc/sys/vm/oom_kill_allocating_task

  • Um valor de 0: mata o processo com a pontuação mais alta.

  • Se o valor não for 0: ele matará o processo que atualmente se aplica à memória e acionará o OOM.

oom_score_adj

Interface para definir a prioridade de interrupção do processo

/proc/PID/oom_score_adj (observe que quanto menor os pontos, menor a probabilidade de ser morto; o valor é -1000 a +1000)

oom_dump_tasks

Usado para registrar quais logs são gravados quando o OOM é acionado

/proc/sys/vm/oom_dump_tasks oom_dump_tasks

O parâmetro pode registrar informações de identificação do processo, a quantidade total de memória virtual usada pelo processo, memória física, informações da tabela de páginas do processo e similares.

Um valor de 0: desabilita a impressão do log acima. Em sistemas grandes, onde podem existir milhares de processos, a impressão um a um utiliza informações da memória que podem causar problemas de desempenho.

Outros causam OOM

Other 1: cgroup oom(/sys/fs/cgroup/memory)

1. Disparado quando memory.usage_in_bytes > memory.limit_in_bytes.

2. memory.oom_control controla o comportamento do oom

oom_kill_disable 1/0

3. Registre as diferenças

Quando Cgroup oom, a pilha de chamadas terá

a. mem_cgroup_out_of_memory+0xAAA/0xBBB

b. As informações de oom adicionarão as informações atuais do grupo de memória, incluindo usado, limite e

Informações da tarefa

Outros 2: overcommit

Memory Overcommit significa que o tamanho da memória prometido pelo sistema operacional para o processo excede a memória real disponível.

interface:

/proc/sys/vm/overcommit_kbytes

/proc/sys/vm/overcommit_memory

O parâmetro do kernel vm.overcommit_memory aceita três valores:

  • 0 – Tratamento heurístico de overcommit. Este é o valor padrão. Ele permite overcommit, mas overcommit muito flagrante será rejeitado. Por exemplo, o tamanho da memória solicitado pelo malloc de uma vez excede a memória total do sistema. Heurística significa "heurística". O kernel usa um certo algoritmo (veja o final do artigo para uma explicação detalhada do algoritmo) para adivinhar se seu aplicativo de memória é razoável. Se achar que não é razoável, ele rejeitará o overcommit.

  • 1 – Sempre overcommit. Overcommit é permitido e solicitações de memória não são rejeitadas.

  • 2 – Não se comprometa demais.

/proc/sys/vm/overcommit_ratio

O padrão é 50, o que significa mais de 50% de disparo

verificar

# grep -i commit /proc/meminfo
CommitLimit: 5967744 kB
Committed_AS: 5363236 kB

Perceber:

Overcommit é direcionado para aplicação de memória. Aplicação de memória não é igual a alocação de memória. A memória só é alocada quando é realmente usada. Por exemplo, o processo malloc se aplica a 100G, mas apenas 10M é usado, então oom tem como alvo a memória real (RSS) e overcommit tem como alvo malloc.

Diferença de log: a pilha de chamadas tem __vm_enough_memory, mas meminfo é apenas impressa e a tarefa não será encerrada

Artigo de referência: https://zhuanlan.zhihu.com/p/463434212

Acho que você gosta

Origin blog.csdn.net/imliuqun123/article/details/130890013
Recomendado
Clasificación