我想分享以下想法并了解这是否是限制 systemctl 服务比平常消耗更多内存的正确方法
例如,假设我们要限制某些服务不使用超过 2G 的内存
那么我的建议是执行以下操作:
[Service]
MemoryAccounting=yes
MemoryCurrent=2097152
MemoryLimit=2097152
现在最大的问题是当服务达到上述设置的 2G 时会发生什么?
有一些选项
服务将会失败
服务将重新启动
但我们当然更希望当内存消耗达到2G限制时服务会重新启动
参考 -
https://superuser.com/questions/1761261/redhat-machine-rsyslogd-eating-up-10-gb
答案1
Systemd 使用 Cgroup 来实现资源限制,因此如果您的服务尝试使用超过 2 GB 内存,Cgroup 会为您终止它。如果您想确保它重新启动,请添加Restart=on-failure
或Restart=on-abort
(也可能是StartLimitIntervalSec
)。
最大内存=字节...这控制
memory.max
控制组属性。
请注意,在撰写此答案时,systemd 已经是 252 并且MemoryLimit
已被弃用(它是 cgroup v1 选项),因此它不再出现在文档页面上。
从cgroup v2 文档在memory.max
:
如果某个 cgroup 的内存使用量达到此限制并且无法减少,则会在该 cgroup 中调用 OOM Killer。