如何在 Ubuntu 22.04 中禁用 systemd OOM 进程杀手?

Kev*_*hey 36 systemd

Ubuntu 22.04systemd-oomd默认情况下启用了该服务,每当我尝试使用大量线程/内存编译应用程序时,该服务都会“帮助”杀死我的 IDE 和/或终端。

关闭此功能或将服务配置为在我使用它们时不向随机进程射击的正确方法是什么?

我知道我可以通过几种方式减轻这种行为;例如,通过增加交换空间的大小,但这仍然不是万能的,因为:

  • OOM守护进程会杀死整个进程树,因此即使是托管被杀死进程的终端也会突然消失;

  • OOM 守护进程会在不向用户提供任何通知的情况下杀死进程树,因此用户只知道他们的终端/IDE/应用​​程序托管的内存消耗大的进程突然消失了。

如果用户知道要查找什么,journalctl他们可以通过或类似的方式找出事后发生的情况,但我认为普通 Ubuntu 桌面用户不会考虑这样做。

举个例子,通常当进程因致命信号或类似信号而崩溃时,崩溃报告者会告诉用户出了问题。难道不应该有一个类似的工具来处理被 OOM 守护进程杀死的进程吗?


编辑以添加请求的输出:交换空间;据我所知,这些只是安装 Ubuntu 22.04 时设置的默认值。

$ free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       5.2Gi       3.1Gi       210Mi        23Gi        25Gi
Swap:          2.0Gi       0.0Ki       2.0Gi

$ sysctl vm.swappiness
vm.swappiness = 60

$ swapon -s
Filename                Type        Size        Used        Priority
/swapfile                               file        2097148     792     -2
Run Code Online (Sandbox Code Playgroud)

Kev*_*hey 30

大多数systemd服务都可以通过该实用程序进行管理systemctl。在这种情况下,我们要禁用该systemd-oomd服务。这可以通过以下方式完成:

\n
$ systemctl disable --now systemd-oomd\n
Run Code Online (Sandbox Code Playgroud)\n

您应该看到类似的内容(取决于您的操作系统):

\n
$ systemctl disable --now systemd-oomd\nRemoved /etc/systemd/system/multi-user.target.wants/systemd-oomd.service.\nRemoved /etc/systemd/system/dbus-org.freedesktop.oom1.service.\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以通过以下方式验证该服务是否已禁用:

\n
$ systemctl is-enabled systemd-oomd\n
Run Code Online (Sandbox Code Playgroud)\n

然后你应该看到:

\n
$ systemctl is-enabled systemd-oomd\ndisabled\n
Run Code Online (Sandbox Code Playgroud)\n

但是,其他服务可能会尝试重新启动该systemd-oomd服务。为了防止这种情况,您可以“屏蔽”该服务。例如:

\n
$ systemctl mask systemd-oomd\nCreated symlink /etc/systemd/system/systemd-oomd.service \xe2\x86\x92 /dev/null.\n
Run Code Online (Sandbox Code Playgroud)\n

然后现在systemctl is-enabled应该报告:

\n
$ systemctl is-enabled systemd-oomd\nmasked\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想稍后取消屏蔽(或重新启用)服务,可以通过以下方式完成:

\n
$ systemctl enable systemd-oomd\n$ systemctl unmask systemd-oomd\n
Run Code Online (Sandbox Code Playgroud)\n

man systemctl更多详情请参见;特别要注意有关屏蔽systemd服务的警告。

\n

  • 我的解决方案最终是卸载 systemd-oomd。禁用还不够,屏蔽还会产生令人讨厌的消息。如果您想恢复,只需稍后重新安装即可。 (2认同)

小智 7

需要指出的是,systemd-oomd 不仅仅会杀死 oom(内存不足和交换区)——如果确实如此,那可能就没问题了。它(也或排他地,不确定是哪一个..)根据它认为的过度交换活动而杀死(我在我的消息上找到的消息表明被杀死(gnome终端的范围)“由于“(切片)”的内存压力) 58.97% > 50.00%,持续 >20 秒,有回收活动。”

我(在 Ubuntu 20.04 和 22.04 中也是如此)在我离开的时候整天运行一些垃圾文件,它逐渐交换掉打开的 Firefox 副本的一些内容,当我回到家时,去使用 Firefox,此时它已经换回其中一些。这很好,但是 system-oomd (升级到 Ubuntu 22.04 后的几天内,这种情况在我身上发生过两次)认为这是不行的,并用类似 8 的屏幕会话杀死了我的 gnome 终端或 9 个 shell、VirtualBox、一些 s3ql 安装等都在其下运行。我真的很担心我的升级中出现了问题,并且 gnome 终端等会自行崩溃,很高兴看到情况并非如此。感谢系统!无论如何,至少它很容易禁用!

编辑:仅供参考,我可以运行:

sudo apt remove systemd-oomd
Run Code Online (Sandbox Code Playgroud)

以及。它显然只是直接安装,而不是作为 systemd 包或类似的依赖项安装。