Existem muitas perguntas e respostas sobre como restringir os recursos de um único processo, por exemplo, o RLIMIT_AS pode ser usado para restringir a memória máxima alocada por um processo que pode ser visto como VIRT de maneira semelhante top
. Mais sobre o tópico, por exemplo, aqui. Existe uma maneira de limitar a quantidade de memória que um processo específico pode usar no Unix?
setrlimit(2)
a documentação diz:
Um processo filho criado via fork (2) herda os limites de recursos de seus pais. Os limites de recursos são preservados no execve (2).
Deve ser entendido da seguinte maneira:
Se um processo tiver um RLIMIT_AS de, por exemplo, 2 GB, ele não poderá alocar mais memória que 2 GB. Quando gera um filho, o limite de espaço de endereço de 2 GB é passado para o filho, mas a contagem começa em 0. Os dois processos juntos podem levar até 4 GB de memória.
Mas qual seria a maneira útil de restringir a soma total de memória alocada por toda uma árvore de processos?
Respostas:
Não tenho certeza se isso responde à sua pergunta, mas encontrei este script perl que afirma fazer exatamente o que você está procurando. O script implementa seu próprio sistema para impor os limites, despertando e verificando o uso de recursos do processo e de seus filhos. Parece estar bem documentado e explicado, e foi atualizado recentemente.
Como slm disse em seu comentário, o cgroups também pode ser usado para isso. Pode ser necessário instalar os utilitários para gerenciar cgroups, supondo que você esteja no Linux que deve procurar
libcgroups
.Verifique se
$USER
é o seu usuário.Seu usuário deve ter acesso às configurações de memória do cgroup em
/sys/fs/cgroup/memory/myGroup
.Você pode definir o limite para, digamos, 500 MB, fazendo o seguinte:
Agora vamos executar o Vim:
O processo vim e todos os seus filhos agora devem ser limitados ao uso de 500 MB de RAM. No entanto , acho que esse limite se aplica apenas à RAM e não à troca. Quando os processos atingirem o limite, eles começarão a trocar. Não tenho certeza se você pode contornar isso, não consigo encontrar uma maneira de limitar o uso de swap usando cgroups.
fonte
sudo yum install libcgroup-tools
Eu criei um script que faz isso, usando o cgmanager, que é usado no Ubuntu. Uma vantagem é que isso não requer acesso root. Observe que o gerenciamento do cgroup é um pouco específico para a distribuição, portanto não sei se isso funciona em distribuições que usam o gerenciamento systemd cgroup.
uso: salve como
limitmem
no seu caminho e torne-o executável. Em seguida, execute, por exemplolimitmem 1G command...
. Isso limita a memória realmente usada. Se isso for alcançado, o assassino da OOM matará o processo ou um de seus filhos, mas não algo aleatório que não tenha nada a ver com esse comando.fonte
cgm
guia breve , foi útil #/unix//a/536046/4319 :
Em qualquer distribuição baseada em systemd, você também pode usar os cgroups indiretamente através do systemd-run. Por exemplo, para o seu caso de limitar
pdftoppm
a 500M de RAM, use:...
fonte