我知道 ulimit 并且我知道如何限制我明确启动或开始使用脚本的进程的内存。但在这种情况下,我有一个由 systemd 管理和启动的服务。
当它达到内存使用量最大值时,如何限制它的最大内存并杀死它(或者甚至更好:防止它分配内存(返回 NULL 到malloc
/ realloc
))?
手册页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 杀手)。
归档时间: |
|
查看次数: |
21554 次 |
最近记录: |