Comment limiter la memory d'un service géré par systemd

Je suis conscient d'ulimit et je sais comment limiter la memory pour un process que je démarre explicitement ou commence à utiliser un script. Mais dans ce cas, j'ai un service qui est géré et lancé par systemd.

Comment puis-je limiter sa memory maximale et l'avoir tué (ou même mieux: l'empêcher d'affecter la memory (renvoyer NULL à malloc / realloc )) lorsqu'il atteint le maximum d'utilisation de la memory?

La page de systemd.exec de systemd.exec contient une list d'instructions LimitXXXX et une table pratique qui les compare aux options ulimit , par l'intermédiaire de l'appel système setrlimit() .

Pour limiter l'espace d'adressage complet de la procédure ( ulimit -v ), utilisez LimitAS= . Sinon, pour limiter juste la stack ( ulimit -s ) utilisez LimitSTACK= ou segment de données ( ulimit -d ) utilisez LimitDATA=

Selon la page de setrlimit() , ces limites entraîneront l'échec de l'allocation de memory supplémentaire. STACK et AS termineront le programme avec un sigsegv si la limite est atteinte et que la stack doit croître (et que le programme n'a pas manipulé cela).

Systemd prend en charge la limitation de l'utilisation de la memory via l'option MemoryLimit, comme décrit à l' adresse suivante : https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

La façon dont le système gère la situation lorsque la memory maximale autorisée (par service) est épuisée dépend de l'implémentation sous-jacente des cgroups et de la façon dont systemd implémente le contrôle des ressources; Je suppose que le process serait tué (via OOM Killer).

Pour des limites analogues à ulimit:

 man systemd.exec ... LimitAS=(like ulimit -v) ... LimitRSS=(like ulimit -m) ...