过度提交记账¶
Linux 内核支持以下过度提交处理模式
- 0
启发式过度提交处理。 明显的地址空间过度提交将被拒绝。 用于典型系统。 它确保严重的疯狂分配失败,同时允许过度提交以减少交换使用。 这是默认设置。
- 1
始终过度提交。 适用于某些科学应用程序。 典型的例子是使用稀疏数组,并且仅仅依赖于几乎完全由零页组成的虚拟内存的代码。
- 2
不要过度提交。 系统总的地址空间提交不允许超过交换空间 + 可配置数量(默认为 50%)的物理 RAM。 根据您使用的数量,在大多数情况下,这意味着进程在访问页面时不会被杀死,而是在内存分配时会收到相应的错误。
对于希望保证其内存分配在未来可用的应用程序非常有用,而无需初始化每个页面。
过度提交策略通过 sysctl vm.overcommit_memory
设置。
过度提交量可以通过 vm.overcommit_ratio
(百分比)或 vm.overcommit_kbytes
(绝对值)设置。 只有当 vm.overcommit_memory
设置为 2 时,这些才有效。
当前过度提交限制和已提交量可以在 /proc/meminfo
中分别作为 CommitLimit 和 Committed_AS 查看。
注意事项¶
C 语言堆栈增长会进行隐式的 mremap。 如果您想要绝对保证并且接近边缘运行,您必须 mmap 您的堆栈到您认为需要的最大尺寸。 对于典型的堆栈使用,这无关紧要,但如果您真的非常在意,这是一个极端情况
在模式 2 中,MAP_NORESERVE 标志被忽略。
它是如何工作的¶
过度提交基于以下规则
- 对于文件支持的映射
- SHARED 或 READ-only - 0 成本(文件是映射而不是交换空间)PRIVATE WRITABLE - 每个实例的映射大小
- 对于匿名或
/dev/zero
映射 - SHARED - 映射大小PRIVATE READ-only - 0 成本(但几乎没有用处)PRIVATE WRITABLE - 每个实例的映射大小
- 附加记账
- 由 mmap 生成的可写副本页面从同一池中提取的 shmfs 内存
状态¶
我们对 mmap 内存映射进行记账
我们对提交中的 mprotect 更改进行记账
我们对大小中的 mremap 更改进行记账
我们对 brk 进行记账
我们对 munmap 进行记账
我们在 /proc 中报告提交状态
在 fork 上进行记账和检查
复查执行时的堆栈处理/构建
SHMfs 记账
实施实际的限制执行
待办事项¶
记账 ptrace 页面(这很难)