有没有可能让OOM杀手更早介入?

dro*_*nus 44 memory-management linux-kernel

我尝试将我的开发系统调整到最大的可靠性。我禁用了交换,因为对于 GUI 使用,它主要以这种方式使机器无响应,不再可用。然而,如果激进的应用程序吃掉了内存,一些机制似乎会以速度为代价充分利用它。没有硬盘交换操作,但系统同样也没有响应。所以我想让 OOM 杀手在系统对内存增益做出任何特殊努力之前启动。例如,如果可用物理内存少于 100 MB,是否可以配置 OOM 杀手来采取行动?

Jak*_*kob 45

我也在这个问题上挣扎。我只是想让我的系统保持响应,无论如何,我更喜欢丢失进程而不是等待几分钟。似乎没有办法使用内核 oom 杀手来实现这一点。

但是,在用户空间,我们可以为所欲为。因此,我编写了 Early OOM 守护进程 ( https://github.com/rfjakob/earlyoom ),一旦可用 RAM 低于 10%,它将终止最大的进程(通过 RSS)。

没有earlyoom,通过启动http://www.unrealengine.com/html5/几次很容易锁定我的机器(8GB RAM)。现在,有罪的浏览器标签会在事情失控之前被杀死。

  • 谢谢你挠痒痒!到目前为止喜欢早教。 (3认同)

psu*_*usi 12

内核的默认策略是只要有空闲的物理内存,就允许应用程序继续分配虚拟内存。物理内存在应用程序访问它们分配的虚拟内存之前不会实际使用,因此应用程序可以分配比系统更多的内存,然后稍后开始访问它,导致内核内存不足,并触发 out内存 (OOM) 杀手。然而,在 hogging 进程被杀死之前,它已经导致磁盘缓存被清空,这使得系统响应缓慢,直到缓存重新填充。

您可以通过将值 2 写入 来更改默认策略以禁止内存过量使用/proc/sys/vm/overcommit_memory。的默认值为/proc/sys/vm/overcommit_ratio50,因此内核将不允许应用程序分配超过 50% 的 ram+swap。如果您没有交换区,那么内核将不允许应用程序分配超过 50% 的内存,而将另外 50% 的空间留给缓存。这可能有点过分,因此您可能希望将该值增加到 85% 左右,这样应用程序最多可以分配 85% 的内存,为缓存留出 15%。

  • 嘿,这个答案听起来很酷。不幸的是,“提交”似乎是指虚拟内存需求,应用程序程序员对此估计很糟糕。例如,在我的(无交换)桌面运行时,使用了大约 400 个 2000mb 的物理内存,但 1600mb 被“提交”为 `/proc/meminfo` 的 `Committed_AS` 状态。在某些应用程序运行时,该值很容易超过物理内存,因此很难通过此设置可行的限制。 (5认同)
  • 在尝试之前保存您的工作!:PI 立即出现故障(bash、窗口管理器等)。 (4认同)
  • @TomWijsman,这个问题清楚地表明他并不是一直处于低内存状态;他只是有时会运行一个占用大量内存的命令。当您用完时,购买更多内存并不是唯一的解决方案。其他潜在的解决方案包括寻找更好的方法来利用您拥有的内存,或者只是不做任何需要那么多内存的事情。这个问题清楚地表明,后者比出去买更多的公羊更容易接受。 (3认同)

小智 11

对我来说,设置 vm.admin_reserve_kbytes=262144 就是这样做的。OOM 杀手会在系统完全无响应之前进行干预。

  • 我喜欢这个想法,但这是否意味着您从未使用过 256MiB 的物理内存? (2认同)

Tam*_*man -1

低内存条件和 OOM 杀手无法实现可靠性。

在壁橱里举办聚会并将“清理我的壁橱”放在你的小播放列表中是错误的。

是否有可能让OOM杀手更早介入?

这样做会产生意想不到的副作用,因为您无法控制被杀死的内容。

我尝试调整我的开发系统以达到最大的可靠性。

最大可靠性涉及测试您的系统并根据这些测试改进您的系统。

只是调整随机的东西不会让你有任何进展......

我禁用了交换,因为对于 GUI 使用来说,它通常会导致机器无响应,从而无法再使用。然而,如果攻击性应用程序耗尽了内存,一些机制似乎会启动,以牺牲速度为代价来充分利用内存。

由于内存不足,禁用交换不会改善行为只会起到相反的作用

为了提高这种情况下的可靠性,请添加更多内存,以便您的系统响应更快,并且不会在用户无意的情况下杀死随机进程。您不应该求助于低内存条件和这样的机制,尤其是在开发环境中……

没有硬盘驱动器交换操作,但系统同样变得无响应。

内存不足的情况确实会导致无响应,无论您是否有交换。

因此,我想让 OOM 杀手在系统对内存增益做出任何特殊努力之前启动。

正如我上面所解释的,特别的努力弊大于利。相反,您可以自行终止不需要的进程,但我想您不能这样做,因此 OOM 会终止您需要的进程。

例如,如果可用物理内存少于 100 MB,是否可以将 OOM Killer 配置为起作用?

可能是,但是如果您只购买一些额外的内存,那么您将获得更高的投资回报,而如今这并不需要花费太多。考虑一下,如果你继续在低内存条件下工作,从长远来看,你将会搬起石头砸自己的脚。OOM 就像一个法警,它不会帮助你,它会帮助操作系统......

  • 因为杀死一个试图使用比你拥有的内存更多内存的应用程序比让整个系统瘫痪更好。在完美的世界中,您将拥有无限的内存并且永远不会耗尽,但实际上,有时您会意外耗尽内存,并且宁愿被告知“内存不足”,也不愿让系统陷入停滞。 (9认同)
  • 当然,禁用交换可以改善行为,因为 OOM 不会破坏磁盘,而是会启动并杀死内存占用。内存耗尽并不是问题(添加更多内存只是意味着您必须更加努力才能耗尽内存)。问题是当你用完时该怎么办。您希望 OOM 杀死猪,从而缓解内存不足的情况。 (8认同)
  • 我对杀死那些会死机的应用程序也没有任何问题。考虑一个具有 2GB 物理内存 + 2GB 交换空间的系统。快速耗尽物理内存的应用程序也很容易吃掉交换空间。在使系统几分钟到几小时没有响应后,它就会死掉。那么为什么不在 GUI 操作变得不稳定之前快速杀死它呢?许多进程使用 10mb 来完成所有工作,有些进程需要 1gb,还有一些罕见的进程需要 10gb,这就是生活。 (8认同)
  • @TomWijsman 也存在几乎死循环,因为有些算法在平均情况下表现为线性,但在最坏情况下表现为指数,具体取决于输入数据。如果鼠标抖动并且点击以及键盘输入显示一分钟的延迟,我无法发送终止信号。我通常会更改为文本模式终端,然后等待几分钟以便登录继续,只是为了发出盲目键入的“kill”。 (7认同)
  • 购买一些额外的内存可能会解决一些问题,具体取决于购买的数量。但这并不能改变这样一个事实:可能存在数量级的意外使用。所以我希望应用程序失败,而不是系统在这些条件下失败。一些示例: 处理一个充满压缩图像的文件夹,其中大多数是“正常”大小,但其中一些非常大。一个小错误就可能造成死循环,导致内存失控,消耗 1GB/s。不小心在文本编辑器中打开了视频文件。通常,这会以鼠标抖动和 UI 几乎死机等症状结束,直到出现 OOM。 (6认同)
  • @TomWijsman:我不喜欢在应用程序中引入任何内容,因为这是一个可能由多个应用程序引起的普遍问题。这就是为什么我仍然认为 OOM 是合适的工具。`ulimit -v` 是不现实的,因为它只能限制一个应用程序,并且不关心可用资源总量。 (5认同)
  • 我认为这个答案有点像“不要做任何真正糟糕的事情来解决问题”,但在我看来,一个可以通过一堆看似无害的用户操作而变得无响应的系统比一个提前杀死他们的系统更糟糕。 (5认同)