vm.overcommit_memory
如果我通过设置为禁用内存过量使用2
,默认情况下系统将允许分配内存最多为交换维度 + 50% 物理内存,如下所示这里。
我可以通过修改参数来改变比例vm.overcommit_ratio
。假设我将其设置为 80%,那么可能会使用 80% 的物理内存。
我的问题是:
- 系统将如何处理剩余的 20%?
- 为什么首先需要这个参数?
- 为什么我不应该总是将其设置为 100%?
答案1
系统将如何处理剩余的 20%?
内核将使用剩余的物理内存用于其自己的目的(内部结构、表、缓冲区、高速缓存等)。内存复用设置处理用户态应用程序虚拟内存保留,内核不使用虚拟内存,而是使用物理内存。
为什么首先需要这个参数?
该overcommit_ratio
参数是一个实现选择,旨在防止应用程序保留比将来合理可用的虚拟内存更多的虚拟内存,即当它们实际访问内存(或至少尝试访问)时。
Linux 内核开发人员认为设置overcommit_ratio
50% 是合理的默认值。它假设内核永远不需要使用超过 50% 的物理 RAM。您的里程可能会有所不同,这就是它可调的原因。
为什么我不应该总是将其设置为 100%?
将其设置为 100%(或任何“太高”的值)并不能可靠地禁用过度使用,因为您不能假设内核将使用 0%(或太少)的 RAM。
它不会阻止应用程序崩溃,因为内核可能会抢占它所需的所有物理内存。
答案2
将比率设置为 100% 不会为文件支持页面或内核分配(例如内核代码、网络缓冲区等)保留任何空间。
不管怎样,内核结构都会被分配,从而导致过度使用。它们通常受到单独限制(例如,有一个网络缓冲区设置)。我不认为总体限制为 50%,尽管总体限制是为了托管容器而制定的。
文件支持的页面通常是您运行用户空间代码的地方,因此您也需要空间。