Jep*_*an 2 kernel memory out-of-memory
我通读了 man proc 的文档。当谈到 overcommit_memory 时,overcommit_memory=0 中的启发式不太好理解。启发式实际上是什么意思?
“不检查使用 MAP_NORESERVE 调用 mmap(2)”是否意味着内核只分配虚拟内存而不知道交换空间的存在?
该文件包含内核虚拟内存记帐模式。值是: 0:启发式过量使用(这是默认设置) 1:总是过量使用,从不检查 2:始终检查,永远不要过度使用 模式0下,不检查mmap(2)和MAP_NORESERVE的调用,默认检查很弱,导致风险 获得一个进程“OOM 杀死”。
除了前面的问题,虚拟地址空间耗尽是否会导致 OOM,而不管剩余的物理内存是否足够。
谢谢。
该overcommit_memory
设置在内存管理子系统中的三个位置被考虑在内。
主要的是__vm_enough_memory
in mm/util.c
,它决定是否有足够的内存来允许内存分配继续进行(请注意,这是一个不一定要调用的实用程序函数)。如果overcommit_memory
是 1,这个函数总是成功的。如果是 2,则检查实际可用内存。如果为 0,则使用您提到的著名启发式;其进行如下:
cap_sys_admin
进程完成的)结果总数用作内存分配的阈值。
mmap
还检查设置:MAP_NORESERVE
如果允许过量使用(模式 0 和 1),则遵守,并导致分配没有后备交换 ( VM_NORESERVE
)。在这种特殊情况下,模式 0 实际上等效于模式 1;这就是“不检查mmap(2)
with 的调用MAP_NORESERVE
”所指的:这意味着MAP_NORESERVE
mmap
调用将始终成功,并且过度分配将导致 OOM 杀手在事后介入,或者在尝试写入时发生段冲突。
shmem
具有与 类似的行为mmap
。
地址空间用完应该会导致分配失败,而不是 OOM-kills,因为分配实际上无法继续。