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。
笔记:错误使用rm
和dd
命令可能会导致数据丢失。建议复制/粘贴。
在里面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