É possível impor algum tipo de limite suave ao consumo de memória dos processos?

9
Eu acho que não é um problema tão incomum: um processo aloca grandes quantidades de memória (seja devido a um erro de vazamento de memória, porque você tenta processar um arquivo de entrada muito grande, ou qualquer outro). A RAM é preenchida e, em algum momento, o Linux precisa alternar para trocar. Bem, às vezes este é apenas o último recurso: se eu tiver uma computação cara em andamento, não quero perder dados se, no final, eu ficar sem memória RAM.

Mais frequentemente, porém (na minha experiência), o consumo de memória é ilimitado, por um processo desonesto, talvez com erros. Ou seja, eu não acabo com alguns dados menos urgentemente necessários movidos para swap, mas o SO é forçado a trocar panicamente cargas de dados. E que, infelizmente, não apenas interrompe strongmente o processo ofensivo, mas pode levar o sistema a ficar praticamente parado (não é tão ruim em máquinas com SSD, mas OTOH me preocupa se escrever gigabytes e gigabytes de dados de lixo podem a longo prazo prejudicar as células flash). Até eu perceber o problema e manualmente matar o processo (uma vez que realmente levou alguns minutos até eu mesmo me logado em um terminal virtual!), metade da minha sessão de corrida está em troca, e Eu preciso esperar um bom tempo até que o sistema funcione sem problemas novamente.

Existe uma solução dracônica para o problema: reforçar um limite de memória. Mas fazer isso em todo o sistema às vezes mataria os processos que eu ainda preciso, e se eu tiver que manualmente ulimit antes de iniciar um processo ofensivo ... bem, eu frequentemente esquecerei até que seja tarde demais.

Possíveis tipos de solução com os quais ficaria mais feliz:

  • Se qualquer processo exceder um determinado uso de memória, ele será artificialmente diminuído para que o restante do sistema permaneça responsivo.
  • Se algum processo exceder um determinado uso de memória, será SIGSTOP ped, por isso, tenho tempo para descobrir o que fazer a seguir.
  • Se um processo se aproximar do limite de RAM, recebo um aviso, antes do início da grande troca.

Existe alguma maneira de obter tal comportamento ou semelhante?

    
por leftaroundabout 25.11.2015 / 21:17

3 respostas

5

niceload --noswap yourprg é feito exatamente para essa situação: Ele analisa a atividade de troca:

  • Se estiver trocando: deixe a execução do processo
  • Se estiver trocando em: deixar o processo ser executado
  • Se alternar entre e sair: Suspenda o processo até que a troca pare e retome o processo quando a troca tiver parado

Ele não suspende o processo antes do início da troca, mas permite que a troca seja executada por 1 segundo antes de agir.

niceload --mem 1G yourprg funciona da mesma forma: se menos de 1 GB for liberado, o youprg será suspenso. Quando mais de 1 GB estiver livre, a sua prag é reiniciada.

    
por 26.11.2015 / 09:03
0

Sim. É facilmente feito com praticamente qualquer shell moderno.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Você pode usar a opção -l para limites de memória bloqueados. Seu processo será sinalizado se o limite for excedido.

    
por 26.11.2015 / 09:31
-1

Cronjob para limpar o cache: Como limpar o cache de memória no Linux

Eu tenho problemas semelhantes. Eu tenho um monte de usuários que executa seus próprios scripts personalizados e de vez em quando seus scripts consome toda a memória disponível e traz o servidor redhat para baixo. A razão para o consumo em massa de RAM foi que seus scripts podem ser executados por dias apenas aguardando um evento, sobrecarregando recursos quando, na realidade, ele não está usando nenhum. Então, o que eu fiz foi simplesmente forçar a limpar o cache com um cronjob e não tive nenhum problema desde então.

Simples e preguiçoso.

    
por 25.11.2015 / 23:01