如何在 system.slice 中的服务上启用 systemd-oomd?非用户 .service 的 OOM-kill

如何在 system.slice 中的服务上启用 systemd-oomd?非用户 .service 的 OOM-kill

因此,Jammy 22.04 为我们带来了新的好东西,systemd-oomd - 系统管理。在我看来,早就该这么做了……但在 2024 年问这个问题,我也有点迟了。

每个人都已经问过如何禁用它了——然而,我无法发挥作用

我的用例:自定义系统服务(守护进程)/etc/systemd/system,我为自己编写了一个单元文件,无论我是否登录,只要操作系统运行时就会运行一个软件。

换句话说,在systemd-cgls树中,我的fail2ban.service运行于system.slice— 之下,而不是之下user.slice

这个持续运行的软件正在逐渐泄漏内存。


我以前的方法是通过插入像这样:

# /etc/systemd/system/fail2ban.service.d/mem-limits.conf
[Service]
MemoryAccounting = true

MemoryHigh=155M
MemoryMax=250M
MemorySwapMax=100M

不再起作用

我的意思是,它在某种程度上是有效的......升级到 22.04 后,它就有效地挂起服务进程(这是一个 Python 解释器,但 IIUC 并不重要)——而在 20.04 中它触发了OOM 终止&自动重启。

我希望恢复后一种行为:当超出内存限制时,OOM-kill 并重新启动服务守护进程。


我像往常一样执行了 apt-installsystemd-oomd包,systemctl enable --now systemd-oomd.service并设法在 中对其进行了配置/etc/systemd/oomd.conf。命令oomctl现在显示:

Dry Run: no
Swap Used Limit: 50.00%
Default Memory Pressure Limit: 10.00%
Default Memory Pressure Duration: 5s
System Context:
        Memory: Used: 3.2G Total: 15.2G
        Swap: Used: 267.2M Total: 7.9G
Swap Monitored CGroups:
Memory Pressure Monitored CGroups:
        Path: /user.slice/user-1000.slice/[email protected]
                Memory Pressure Limit: 50.00%
                Pressure: Avg10: 0.00 Avg60: 0.00 Avg300: 0.00 Total: 0
                Current Memory Usage: 2.1M
                Memory Min: 0B
                Memory Low: 0B
                Pgscan: 584
                Last Pgscan: 584

除此之外 — — 我已经阅读了几个小时,但仍然完全迷失在 systemd 的“内存压力”选项中,没有清楚地看到我需要为我的目标改变什么以及如何改变。

我是否需要创建一个.slice与 system.slice 不同的专用版本?如何创建?

我是否需要单独的.scope?手册页的含义我不明白; a.scope和 a.slice都是 CGroup (v2),好吧……但是?有什么区别?

如何让我自己的作品进入内存压力监控的 CGroups显示的列表oomctl

有没有人设法在 22.04 中完成这样的工作?

相关内容