如果没有过度使用,每个 fork() 都需要足够的可用存储空间来复制地址空间,即使绝大多数页面从未经历过写入时复制。
上面的说法摘自Robert Love的书(Linux系统编程第2版,内存管理章节,过度提交和OOM主题)。
如果我们关闭交换区,我就无法过度使用主内存。在这种情况下,将在主内存工作中进行写时复制(即 fork、malloc、mmap 等),还是会尝试在内存中预分配整个数据而无需任何惰性分配机制?
如果我遗漏了什么,请纠正我。
更新:朋友们,最初我以为一旦我们关闭交换我就不能过度使用。正如下面的讨论中提到的,即使我们关闭交换,我们也可以过度使用。
答案1
您可以过量使用而无需交换。 Robert Love 书中的“存储”一词在此上下文中指的是物理 RAM。内核为进程设置一个内存空间,该空间尚未包含到物理 RAM 的映射,或者在写入时复制的情况下指向共享页帧。当访问页面时,映射是按需创建的。假设并非同时需要所有映射,因此过量使用相对安全。
答案2
这是一篇好文章:关键 - 过度使用
实际上有一个默认的内存限制,具体取决于
/proc/sys/vm/
文件的配置。如果您设置为“无过量使用”并选择一个百分比,您将得到:
Memory Allocation Limit = Swap Space + RAM * (Overcommit Ratio / 100)
默认比例为50(%);对于 4G RAM 和 4G Swap,分配限制为 6G。
在这种特殊的“无过度使用”模式(通过/proc/sys/vm/overcommit_memory
)过度承诺意味着您期望积极使用多少交换空间。这是有道理的,因为如果您分配 8 GB 并大量使用它们,速度会太慢。因此交换空间“算”一半。
如果您希望严格限制 RAM 的大小,并且不进行交换,则可以将 overcommit_memory 设置为 2(=无过量使用),并将 overcommit_ratio 设置为 100%。
在默认情况下内核做一些检查:
应用启发式算法来确定是否有足够的可用内存。
(第三种模式是:不检查,即overcommit,直到OOM发生)