从 +22.04 LTS

从 +22.04 LTS

有时我需要处理大量的数据,并将它们保存在内存中以供处理。有时我会错误计算程序将产生的内存量,或者调试器会将内存使用量乘以超出我可用内存量的倍数。

每当我启动一个占用大量内存的进程时,我都会期望一个正常的操作系统能够做到这点:尝试消耗所有可用内存,然后要求其他一些非必要进程放弃一些它们不需要的内存,然后写入交换区。

这是 Ubuntu 为我做的事情:消耗所有可用内存,然后要求操作系统交换所有必要服务(gnome 会话、终端、键盘),然后冻结并等待我拔掉电源插头。

两个问题:

  1. 操作系统怎么能认为某件事如此重要以至于可以停止监听用户输入呢?
  2. 我怎样才能告诉 Ubuntu 永远不要交换基本服务并始终对用户输入做出反应,即使某些愚蠢的过程试图消耗比系统提供的更多的资源。

答案1

我仍然没有解决这个问题的方法,但我可以提供两种可能引起其他人兴趣的解决方法:

1)早期

这是一个监视内存使用情况的服务,当达到某个阈值时,它会终止消耗最多内存的进程(另请参阅关于 Linux 内核中的 OOM killer 的问题)

我用一个演示进程测试了它,该进程无限期地以小块请求内存。这是我的第一印象:当我启动恶意进程时,它很快耗尽了我所有的 RAM。然后开始交换,系统变得无响应。几秒钟后,系统恢复在线。earlyoom 的日志显示,在内存和交换使用率都达到 90% 后,它杀死了占用内存的进程。

当交换开始时以及在进程被终止后,仍然存在令人讨厌的滞后,其他进程的某些部分通常会保留在交换中,直到被请求,但这是一个开始。

2)禁用交换

我知道这是一个有争议的话题但是对于桌面系统,尤其是开发机器来说,有时一个进程可能会试图耗尽你的所有内存,这是有道理的:没有交换,OOM 杀手会按预期工作。当你用完内存时,它会找到最佳终止进程并消除它。无滞后,无延迟。

sudo swapoff -a您可以使用或禁用当前会话的交换使改变永久化


这个问题的正确解决方案当然是当主内存耗尽时系统保持响应,并且开始像没有明天一样交换内存,但这似乎不会很快发生。

答案2

从 +22.04 LTS

有一个名为 systemd-oomd 的服务会自动监控内存使用情况,并在内存不足时尝试终止进程,它是 systemd 默认安装的一部分。要查看当前状态,请输入oomctl。示例输出:

Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
        Memory: Used: 4.1G Total: 15.5G
        Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
        Path: /
                Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
        Path: /user.slice/user-1000.slice/[email protected]
                Memory Pressure Limit: 50.00%
                Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
                Current Memory Usage: 3.9G
                Memory Min: 0B
                Memory Low: 0B
                Pgscan: 23663084
                Last Pgscan: 23663084

默认情况下,当内存和交换使用率达到 90% 时开始回收。它使用用户切片控制组(即[电子邮件保护]) 是大多数应用程序生成的地方,但不是在 system.slice 控制组上,它生成了系统中最重要的组件,例如 NetworkManager 和 Gnome Display Manager。简而言之,oomd 将在系统进程之前释放用户进程。要查看 systemd-oomd 的当前配置,请输入:

systemd-analyze cat-config systemd/oomd.conf

參閱这一页了解它们的作用。要编辑特定 systemd 单元的 OOM 参数,请添加或编辑指定的变量这里在单元文件中。

答案3

请尝试以下两种方法之一:

1)将 swappiness 设置从默认设置 60 更改为 10,即:添加vm.swappiness = 10到 /etc/sysctl.conf(在终端中输入sudo gedit /etc/sysctl.conf),然后重启系统。在此处搜索 swappiness 以获取更多信息。

2)如果交换没有帮助......即使您可能不想......请将交换文件的大小增加到 1.5x16G,看看是否有帮助。

请随时通知我。干杯,Al

相关内容