如何限制由 systemd 管理的服务的内存

Pet*_*etr 10 linux systemd

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

当它达到内存使用量最大值时,如何限制它的最大内存并杀死它(或者甚至更好:防止它分配内存(返回 NULL 到malloc/ realloc))?

Der*_*rfK 8

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

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

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


小智 6

Systemd 支持通过 MemoryLimit 选项限制内存使用,如以下所述:https : //www.freedesktop.org/software/systemd/man/systemd.resource-control.html

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

  • 达到内存限制时会重新启动服务吗? (2认同)