OOM杀手不工作?

Modified on: Sat, 09 Jun 2018 06:15:53 +0800

据我了解,当系统接近没有空闲内存时,内核应该开始杀死进程以重新获得一些内存。但在我的系统中,这根本不会发生。

假设一个简单的脚本只分配比系统中可用内存多得多的内存(例如,一个包含数百万字符串的数组)。如果我运行这样的脚本(作为普通用户),它只会获取所有内存,直到系统完全冻结(只有SysRQ REISUB工作)。

这里奇怪的部分是,当计算机冻结时,硬盘驱动器会打开并保持这种状态直到计算机重新启动,无论是否安装了交换分区!

所以我的问题是:

  1. 这种行为是否正常?奇怪的是,作为普通用户执行的应用程序可能会以这种方式使系统崩溃......
  2. 有什么方法可以让Ubuntu在他们获得太多(或最多)内存时自动杀死这些应用程序?
  3. 醇>

    其他信息

  • Ubuntu 12.04.3
  • 内核3.5.0-44
  • 内存:从4GB到大约3.7GB(与显卡共享)。
    *

    $ tail -n+1 /proc/sys/vm/overcommit_*
    ==> /proc/sys/vm/overcommit_memory <==
    0
    
    ==> /proc/sys/vm/overcommit_ratio <==
    50
    
    $ cat /proc/swaps
    Filename                Type        Size    Used    Priority
    /dev/dm-1                               partition   4194300 344696  -1
    
作者:Braiam,Salem

最佳答案

来自官方/proc/sys/vm/*文档一个>:

  

oom_kill_allocating_task

  
  

启用或禁用杀死OOM触发任务
  不记忆的情况。

  
  

如果将其设置为零,则OOM杀手将扫描整个
  任务列表并根据启发式选择任务来杀死。这通常
  选择一个可以释放大量内存的流氓内存占用任务
  被杀的记忆。

  
  

如果将其设置为非零,则OOM杀手只会杀死该任务
  触发了内存不足的情况。这避免了昂贵的费用
  任务列表扫描。

  
  

如果选择了panic_on_oom,则它优先于任何值
  用于oom_kill_allocating_task。

  
  

默认值为0.

为了总结一下,当将oom_kill_allocating_task设置为1时,内核将不会扫描你的系统寻找要杀死的进程,这是一项昂贵且缓慢的任务。只是杀死导致系统内存不足的进程。

根据我自己的经验,当触发OOM时,内核没有足够的“强度”足以进行此类扫描,从而使系统完全无法使用。

此外,更明显的是杀死导致问题的任务,所以我无法理解为什么默认设置为0

为了进行测试,您只需在/proc/sys/vm/中写入正确的伪文件,该文件将在下次重新启动时撤消:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

对于永久性修复,请将以下内容写入/etc/sysctl.conf/etc/sysctl.d/下的新文件,并带有.conf扩展名(例如/etc/sysctl.d/local.conf):

vm.oom_kill_allocating_task = 1

相关问答

添加新评论