如何限制systemctl服务以避免内存泄漏

如何限制systemctl服务以避免内存泄漏

我想分享以下想法并了解这是否是限制 systemctl 服务比平常消耗更多内存的正确方法

例如,假设我们要限制某些服务不使用超过 2G 的内存

那么我的建议是执行以下操作:

[Service]
MemoryAccounting=yes
MemoryCurrent=2097152 
MemoryLimit=2097152 

现在最大的问题是当服务达到上述设置的 2G 时会发生什么?

有一些选项

  1. 服务将会失败

  2. 服务将重新启动

但我们当然更希望当内存消耗达到2G限制时服务会重新启动

参考 -

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/sec-modifying_control_groups

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/sec-modifying_control_groups

https://superuser.com/questions/1761261/redhat-machine-rsyslogd-eating-up-10-gb

答案1

Systemd 使用 Cgroup 来实现资源限制,因此如果您的服务尝试使用超过 2 GB 内存,Cgroup 会为您终止它。如果您想确保它重新启动,请添加Restart=on-failureRestart=on-abort(也可能是StartLimitIntervalSec)。

systemd.资源控制:

最大内存=字节...这控制memory.max控制组属性。

请注意,在撰写此答案时,systemd 已经是 252 并且MemoryLimit已被弃用(它是 cgroup v1 选项),因此它不再出现在文档页面上。

cgroup v2 文档memory.max

如果某个 cgroup 的内存使用量达到此限制并且无法减少,则会在该 cgroup 中调用 OOM Killer。

相关内容