为什么OOM-Killer不能直接杀死要求太多的进程?

Mar*_* Ba 13 linux out-of-memory

解释如下:Linux 是否会在不询问我内存是否不足的情况下开始杀死我的进程?可以通过以下方式配置OOM-Killer overcommit_memory

  • 2 = 没有过量使用。如果要求太多,分配就会失败。
  • 0, 1 = 过量使用(启发式或始终)。当实际访问太多内存时,根据一些启发式杀死一些进程。

现在,我可能完全误解了这一点,但是为什么没有一个选项(或者为什么它不是默认值)来终止实际尝试访问它分配的太多内存的进程?

use*_*751 23

考虑这个场景:

  • 您有 4GB 的可用内存。
  • 一个错误的进程分配了 3.999GB。
  • 您打开一个任务管理器来终止失控的进程。任务管理器分配 0.002GB。

如果被杀死的进程是最后一个请求内存的进程,你的任务管理器就会被杀死。

或者:

  • 您有 4GB 的可用内存。
  • 一个错误的进程分配了 3.999GB。
  • 您打开一个任务管理器来终止失控的进程。X 服务器分配 0.002GB 来处理任务管理器的窗口。

现在你的 X 服务器被杀死了。它没有引起问题;它只是“在错误的时间出现在错误的地点”。它碰巧是第一个在没有内存时分配更多内存的进程,但它并不是开始使用所有内存的进程。

  • 请注意,这是 Linux 哲学,而不是必要的事实。Windows 3.0 通过为 OOM 处理保留足够的内存(包括必要的对话框)解决了这个问题。 (13认同)
  • @AleksiTorhamo:我确实是指后者。Windows 3.0 没有成熟的任务管理器,它有著名的蓝屏,其内存是预先分配的。 (3认同)