Como acionar a ação em condições de pouca memória no Linux?

6

Então, eu pensei que seria uma coisa bem simples de se localizar: um módulo service / kernel que, quando o kernel percebe que a memória do usuário está ficando fraca, aciona alguma ação (por exemplo, descarregando uma lista de processos em um arquivo, pingando alguma rede endpoint, qualquer que seja) dentro de um processo que tenha sua própria memória dedicada (para que ela não falhe em fork () ou sofra de nenhum outro problema usual de OOM).

Eu encontrei o OOM killer , que eu entendo é útil, mas que realmente não faz o que eu preciso fazer.

Idealmente, se estou ficando sem memória, quero saber por quê. Eu suponho que eu poderia escrever meu próprio programa que roda na inicialização e usa uma quantidade fixa de memória, então só faz coisas quando é informado de pouca memória pelo kernel, mas isso traz sua própria questão ...

Existe mesmo um syscall para ser informado de algo assim? Uma maneira de dizer ao kernel "ei, me acorde quando tivermos apenas 128 MB de memória sobrando"?

Eu pesquisei pela web e por aqui, mas não achei nada adequado a essa descrição. Parece que a maioria das pessoas usa o polling em um intervalo de tempo, mas o problema óbvio é que é menos provável que você saiba quais processos causaram o problema.

    
por Parthian Shot 13.04.2017 / 22:19

2 respostas

7

O que você está perguntando é, basicamente, um retorno de chamada baseado em kernel em uma condição de pouca memória, certo? Se assim for, eu acredito strongmente que o kernel não fornece tal mecanismo, e por uma boa razão: estando com pouca memória, ele deve executar imediatamente a única coisa que pode liberar alguma memória - o assassino da OOM. Qualquer outro programa pode interromper a máquina.

De qualquer forma, você pode executar uma solução de monitoramento simples no espaço do usuário. Eu tive o mesmo requisito de debug / action de baixa memória no passado, e escrevi um bash simples que fez o seguinte:

  • monitore uma marca d'água : se o uso de memória estiver acima desse limite, colete algumas estatísticas (processos, memória livre / usada, etc) e envie um e-mail de aviso;

  • monitore uma marca d'água : se o uso de memória estiver acima desse limite, colete algumas estatísticas e mate os processos com mais memória (ou menos importante) e, em seguida, envie um e-mail de alerta. / p>

Esse script seria muito leve e pode pesquisar a máquina em intervalos pequenos (por exemplo: 15 segundos)

    
por 13.04.2017 / 23:02
2

Sim, o kernel do Linux fornece um mecanismo para isso: notificação de pressão de memória . Isso está documentado no link , seção Pressão da memória .

Em suma, você registra um descritor de arquivo eventfd em /sys/fs/cgroup/memory/memory.pressure_level no qual deseja receber notificações. Essas notificações podem ser low , medium ou critical . Um caso de uso típico seria liberar alguns ou todos os caches internos em seu processo quando você receber uma notificação, a fim de evitar uma morte iminente do OOM.

    
por 30.03.2018 / 12:09