Evitando o travamento do sistema causado pelo uso de memória física completa no Linux

0

Eu aprendi no outro dia que o Linux realmente mata processos se ele ficar sem memória. Eu tinha destacado o swap com o comando swapoff antes disso acontecer. Normalmente, se qualquer processo ocupa toda a memória por um erro, digamos vazamento de memória em um loop, o meu sistema travou (eu sei, tecnicamente é realmente muito lento), não matando o processo ruim.

Como evito isso? Nenhum software é perfeito e posso executar programas mal codificados e encontrar esse problema de vez em quando. Eu tenho que redefinir meu sistema toda vez. Isso é apenas a limitação dos grãos modernos? Eu não posso simplesmente desligar o swap porque eu sei que o kernel utiliza sua troca até certo ponto para utilizar a memória física eficientemente mesmo se a memória física for espaçosa.

Usar tamanho menor de swap pode ser uma opção (menor tempo antes do OOM).

    
por Ashe the human 05.01.2017 / 03:08

1 resposta

3

O Killer Fora da Memória do kernel é usado como último recurso. Se você fornecer memória e / ou troca suficiente para os processos em execução, ela não será acionada.

À medida que seu sistema fica sem memória física, ele começa a usar o espaço de troca. A partir deste ponto começará a desacelerar, às vezes dramaticamente. Se você tiver processos ativos suficientes tentando usar a mesma memória física, seu sistema começará a gastar mais tempo trocando-os e removendo-os do que realmente pode executá-los.

Quando a troca está próxima do esgotamento, o kernel começa a eliminar processos, na tentativa de manter os outros em execução. Eu nunca precisei investigar os critérios que o OOMK usa para escolher processos, então não posso descrevê-los aqui.

A solução é uma ou mais das seguintes

  • Adicione mais memória física
  • Adicione mais (ou alguns) swap. Isso pode ser uma partição de disco ou arquivo
  • Reduza o número ou o tamanho dos processos em execução
  • Corrigir o código em processos com memória de fuga

Algumas outras referências

É possível definir um limite por processo com base na quantidade de memória que ele pode usar. Quando ele tenta exceder isso, a solicitação de alocação falha. Normalmente, isso resulta em um programa com falha, seja de forma descontrolada, porque não testou o valor de retorno da solicitação de alocação ou de maneira controlada com uma exceção fatal.

    
por 05.01.2017 / 14:32

Tags