Como limitar a memória de um serviço gerenciado pelo systemd

5

Estou ciente do ulimit e sei como limitar a memória de um processo que inicio explicitamente ou começo a usar um script. Mas neste caso eu tenho um serviço que é gerenciado e lançado pelo systemd.

Como posso limitar sua memória máxima e matá-la (ou melhor: impedir a alocação de memória (retornar NULL a malloc / realloc )) quando atingir o máximo de uso de memória?

    
por Petr 22.04.2016 / 19:45

3 respostas

4

O Systemd suporta a limitação do uso da memória por meio da opção MemoryLimit, conforme descrito em: link

A forma como o sistema manipula a situação quando a memória máxima permitida (por serviço) é esgotada depende da implementação do cgroups subjacente e da maneira como o sistema implementa o controle de recursos; Eu estou supondo que o processo seria morto (via OOM killer).

    
por 22.04.2016 / 20:02
4

A página de manual para systemd.exec tem uma lista de instruções LimitXXXX e uma tabela útil comparando-as com as opções ulimit , por meio da chamada do sistema setrlimit() .

Para limitar todo o espaço de endereçamento do processo ( ulimit -v ), use LimitAS= . Caso contrário, para limitar apenas a pilha ( ulimit -s ) use LimitSTACK= ou segmento de dados ( ulimit -d ) use LimitDATA=

De acordo com a% man_de% manpage, esses limites farão com que a alocação de memória adicional falhe. STACK e AS finalizarão o programa com um sigsegv se o limite for atingido e a pilha precisar crescer (e o programa não lidar com isso).

    
por 22.04.2016 / 20:20
1

Para limites análogos ao ulimit:

man systemd.exec

...
LimitAS=(like ulimit -v)
...
LimitRSS=(like ulimit -m)
...
    
por 22.04.2016 / 20:09

Tags