如何在 Ubuntu 22.04 中禁用 systemd OOM 进程终止程序?

如何在 Ubuntu 22.04 中禁用 systemd OOM 进程终止程序?

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

答案1

大多数systemd服务都可以通过systemctl实用程序进行管理。在本例中,我们想要禁用该systemd-oomd服务。可以使用以下命令完成此操作:

$ systemctl disable --now systemd-oomd

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

$ systemctl disable --now systemd-oomd
Removed /etc/systemd/system/multi-user.target.wants/systemd-oomd.service.
Removed /etc/systemd/system/dbus-org.freedesktop.oom1.service.

然后,您可以使用以下命令验证该服务是否已被禁用:

$ systemctl is-enabled systemd-oomd

然后你应该看到:

$ systemctl is-enabled systemd-oomd
disabled

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

$ systemctl mask systemd-oomd
Created symlink /etc/systemd/system/systemd-oomd.service → /dev/null.

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

$ systemctl is-enabled systemd-oomd
masked

如果你以后想取消屏蔽(或重新启用)某项服务,可以这样做,例如,

$ systemctl enable systemd-oomd
$ systemctl unmask systemd-oomd

man systemctl参阅更多详细信息;特别要注意有关systemd服务屏蔽的注意事项。

答案2

需要指出的是,systemd-oomd 不会在出现 oom(内存和交换空间不足)时终止进程——如果确实如此,那可能就没问题了。它(同时终止或专门终止,不确定是哪种情况)会根据其认为的过度交换活动终止进程(我在我的服务器上发现的消息表明已终止(gnome-terminal 的范围)“由于”(切片)的内存压力“在 20 秒内为 58.97% > 50.00%,并且有回收活动。”

我(Ubuntu 20.04 和 22.04 也是一样)在外出时整天运行一些垃圾程序,它会逐渐交换出打开的 Firefox 副本的部分内容,当我回到家,再去使用 Firefox,此时它必须将其中的一些内容交换回来。这很好,但是 system-oomd(在我升级到 Ubuntu 22.04 后的几天内发生过两次这种情况)认为这不行,并用一个屏幕会话杀死了我的 gnome 终端,其中有 8 或 9 个 shell、VirtualBox、一些 s3ql 挂载点等,都在其下运行。我真的很担心我的升级出了什么问题,gnome 终端等自己崩溃了,很高兴看到事实并非如此。谢谢 systemd!无论如何,至少它很容易禁用!

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

sudo apt remove systemd-oomd

也一样。它显然是直接安装的,而不是作为 systemd 包的依赖项或类似的东西。

答案3

对于 32G RAM,默认的 2G /swapfile 通常就足够了。但是,如果您正在运行一些占用大量内存的应用程序,或者拥有大量数据集,则可能需要交换更多,因此我们将它从 2G 增加到 4G,看看是否有帮助。不要禁用 OOM。

笔记:错误使用rmdd命令可能会导致数据丢失。建议复制/粘贴。

在里面terminal...

sudo swapoff -a           # turn off swap
sudo rm -i /swapfile      # remove old /swapfile

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

sudo chmod 600 /swapfile  # set proper file protections
sudo mkswap /swapfile     # init /swapfile
sudo swapon /swapfile     # turn on swap
free -h                   # confirm 32G RAM and 4G swap

sudo -H gedit /etc/fstab使用或编辑 /etc/fstab sudo pico /etc/fstab

确认 /etc/fstab 中的此 /swapfile 行...并确认没有其他“交换”行...在此行中使用空格...确认没有制表符...

/swapfile  none  swap  sw  0  0

reboot                    # reboot and verify operation

答案4

有点死灵。您可以增加交换大小,但将交换大小从默认的 2gb 更改为 4gb 对我来说毫无用处。oomd.conf 可以编辑,所以您可以尝试一下。我的驱动器很小,所以我不想将交换大小增加到 8gb 以上,也不想关闭交换。据我所知,oomd 对于不让整个 PC 崩溃和因内存耗尽而损坏所有内容非常重要。所以我不想完全关闭它。

systemd-analyze cat-config systemd/oomd.conf

https://man.archlinux.org/man/oomd.conf.5.en

https://man.archlinux.org/man/systemd-oomd.service.8.en

另外,我不知道自己在做什么,所以请自担风险。哈哈。我猜它是只读的,是有原因的。

由于它是只读的,因此您可以创建一个文件,然后通过执行以下操作来编辑它

sudo touch [filename]
sudo nano [filename]

我已将持续时间改为 60 秒,压力改为 90%。还将交换限制改为 95%。此外,为了进行测试,您可以将标志 --dry-run 添加到 systemctl 内容中。它不会执行其应执行的操作,而是将其应执行的操作打印到日志中。

sudo systemctl --dry-run start systemd-oomd

编辑:

新的解决方案:删除这个垃圾

sudo apt remove systemd-oomd

相关内容