据我了解,当系统接近没有可用内存时,内核应该开始杀死进程以重新获得一些内存。但在我的系统中,这根本不会发生。
假设一个简单的脚本只分配了比系统中可用内存多得多的内存(例如,一个包含数百万个字符串的数组)。如果我运行这样的脚本(作为普通用户),它只会获取所有内存,直到系统完全冻结(只有 SysRQ REISUB 有效)。
这里奇怪的部分是,当计算机死机时,硬盘驱动器 LED 灯会亮起并保持这种状态,直到计算机重新启动,无论我是否安装了交换分区!
所以我的问题是:
RAM:约 3.7GB 从 4GB(与显卡共享)。*
$ 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
Run Code Online (Sandbox Code Playgroud)Ter*_*ior 43
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
Run Code Online (Sandbox Code Playgroud)
要永久修复,请将以下内容写入/etc/sysctl.conf或 下的新文件/etc/sysctl.d/,并带有.conf扩展名(/etc/sysctl.d/local.conf例如):
vm.oom_kill_allocating_task = 1
Run Code Online (Sandbox Code Playgroud)
int*_*_ua 12
更新:该错误已修复。
Teresa 的回答足以解决问题并且很好。
此外,我已经提交了一个错误报告,因为这绝对是一个错误的行为。
| 归档时间: |
|
| 查看次数: |
23756 次 |
| 最近记录: |