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:
- Ajuste os limites de memória no nível do sistema (por exemplo, sysctl ajusta o limite vm.overcommit_memory)
- 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)
- 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:
-
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.
-
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.
-
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
-
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:
- Abra o arquivo /etc/sysctl.conf:
sudo vim /etc/sysctl.conf
- Adicione as seguintes linhas no final do arquivo:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.oom_kill_allocating_task = 0
- 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.
- 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