Limitar a quantidade de RAM a um processo (Linux)

1

Eu tenho um servidor Zope (apenas um processo python de longa duração) que tende a consumir toda a RAM no meu servidor após alguns dias. Eu não quero reiniciá-lo todas as noites - talvez seja melhor limitar a RAM para este processo e ver se ele pode funcionar de qualquer maneira.

Então, como posso restringir esse processo para usar não mais que 256MB de RAM?

O servidor é uma máquina Intel de 64 bits rodando o Centos 5.3. Eu ouvi de ulimit para restringir um processo bash, mas como posso restringi-lo para um processo python?

Atualização:

Obrigado pelas suas ideias! Eu vou usar uma abordagem mista para o meu problema:

  • Vou iniciar o serviço com o ulimit para que ele possa usar apenas 256 MB de RAM
  • Como meu sistema é monitorado pelo Nagios, usarei um comando nagios-check para verificar se meu processo não está usando mais de 192 MB.
  • Se meu processo usar mais de 192 MB, uma reinicialização normal será iniciada automaticamente.
  • Se meu processo usar mais de 220 MB ou o processo não for executado, um administrador (eu mesmo) será informado via SMS / E-Mail, portanto, tratarei do problema manualmente.

Dessa forma, eu acho que estou no lado seguro: reinicia automaticamente graciosa quando necessário (via nagios), e paradas de serviço forçadas (via ulimit) em caso de um pico repentino no uso de RAM

    
por mawimawi 23.06.2010 / 14:54

5 respostas

2

ulimit é um martelo. Será difícil matar o processo quando atingir o limite.

Você pode querer algo menos agressivo. (algo que faz um reinício gracioso) Dê uma olhada no monit. link

Aqui está um exemplo de configuração para o zope. link

Veja como usar as opções mem ou totalmem para acionar sua reinicialização.

Melhor da sorte.

    
por 23.06.2010 / 16:51
2

O módulo resource é o equivalente em Python de ulimit .

    
por 23.06.2010 / 16:12
1

Os outros respondedores parecem ter sua pergunta principal em mãos, mas para mim o que você está perguntando parece tratar os sintomas e não a causa. Por que o aplicativo está vazando memória tão mal? Se você puder rastrear isso, a limitação não será realmente necessária.

    
por 23.06.2010 / 19:17
0

Como o ulimit afeta o shell e seus subprocessos, se for possível, você pode tentar iniciar o processo Python dentro de outro shell (ulimit-ed).

Usando o Python isso seria algo como

subprocess.Popen('ulimit -v 262144; python_application', shell=True)
    
por 23.06.2010 / 15:31
0

Use os Cgroups para limitar a memória.

Um cgroup limita a memória a uma quantidade configurável e não é um martelo duro como o ulimit. Não vai matar o processo. Ele irá mostrar o restante da memória necessária ao processo para o disco.

    
por 27.04.2015 / 20:37