如何限制由systemdpipe理的服务的内存

我知道ulimit,我知道如何限制我明确启动的进程的内存,或开始使用脚本。 但在这种情况下,我有一个由systemdpipe理和启动的服务。

我怎样才能限制它的最大内存,并杀死(甚至更好:防止内存分配(返回NULL malloc / realloc ))达到内存使用最大?

systemd.exec的联机帮助页有一个LimitXXXX指令列表和一个方便的表,通过setrlimit()系统调用将它们与ulimit选项进行比较。

限制进程的整个地址空间( ulimit -v )使用LimitAS= 。 否则,只限制栈( ulimit -s )使用LimitSTACK=或数据段( ulimit -d )使用LimitDATA=

根据setrlimit()联机帮助页,这些限制将导致分配额外的内存失败。 如果达到限制并且堆栈需要增长(并且程序没有处理这个),STACK和AS将用sigsegv终止程序。

Systemd支持通过MemoryLimit选项限制内存使用情况,详见: https : //www.freedesktop.org/software/systemd/man/systemd.resource-control.html

系统在最大内存允许(每个服务)耗尽的情况下处理情况取决于基础cgroups实现和systemd实现资源控制的方式; 我猜这个过程会被杀死(通过OOM杀手)。

对于与ulimit类似的限制:

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