162306a36Sopenharmony_ci:Original: Documentation/mm/overcommit-accounting.rst
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci:翻译:
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci:校译:
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci==============
1262306a36Sopenharmony_ci超量使用审计
1362306a36Sopenharmony_ci==============
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciLinux内核支持下列超量使用处理模式
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci0
1862306a36Sopenharmony_ci	启发式超量使用处理。拒绝明显的地址空间超量使用。用于一个典型的系统。
1962306a36Sopenharmony_ci	它确保严重的疯狂分配失败,同时允许超量使用以减少swap的使用。在这种模式下,
2062306a36Sopenharmony_ci	允许root分配稍多的内存。这是默认的。
2162306a36Sopenharmony_ci1
2262306a36Sopenharmony_ci	总是超量使用。适用于一些科学应用。经典的例子是使用稀疏数组的代码,只是依赖
2362306a36Sopenharmony_ci	几乎完全由零页组成的虚拟内存
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci2
2662306a36Sopenharmony_ci	不超量使用。系统提交的总地址空间不允许超过swap+一个可配置的物理RAM的数量
2762306a36Sopenharmony_ci	(默认为50%)。根据你使用的数量,在大多数情况下,这意味着一个进程在访问页面时
2862306a36Sopenharmony_ci	不会被杀死,但会在内存分配上收到相应的错误。
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	对于那些想保证他们的内存分配在未来可用而又不需要初始化每一个页面的应用程序来说
3162306a36Sopenharmony_ci	是很有用的。
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci超量使用策略是通过sysctl  `vm.overcommit_memory` 设置的。
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci可以通过 `vm.overcommit_ratio` (百分比)或 `vm.overcommit_kbytes` (绝对值)
3662306a36Sopenharmony_ci来设置超限数量。这些只有在 `vm.overcommit_memory` 被设置为2时才有效果。
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci在 ``/proc/meminfo`` 中可以分别以CommitLimit和Committed_AS的形式查看当前
3962306a36Sopenharmony_ci的超量使用和提交量。
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci陷阱
4262306a36Sopenharmony_ci====
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciC语言的堆栈增长是一个隐含的mremap。如果你想得到绝对的保证,并在接近边缘的地方运行,
4562306a36Sopenharmony_ci你 **必须** 为你认为你需要的最大尺寸的堆栈进行mmap。对于典型的堆栈使用来说,这并
4662306a36Sopenharmony_ci不重要,但如果你真的非常关心的话,这就是一个值得关注的案例。
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci在模式2中,MAP_NORESERVE标志被忽略。
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci它是如何工作的
5362306a36Sopenharmony_ci==============
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci超量使用是基于以下规则
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci对于文件映射
5862306a36Sopenharmony_ci	| SHARED or READ-only	-	0 cost (该文件是映射而不是交换)
5962306a36Sopenharmony_ci	| PRIVATE WRITABLE	-	每个实例的映射大小
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci对于匿名或者 ``/dev/zero`` 映射
6262306a36Sopenharmony_ci	| SHARED			-	映射的大小
6362306a36Sopenharmony_ci	| PRIVATE READ-only	-	0 cost (但作用不大)
6462306a36Sopenharmony_ci	| PRIVATE WRITABLE	-	每个实例的映射大小
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci额外的计数
6762306a36Sopenharmony_ci	| 通过mmap制作可写副本的页面
6862306a36Sopenharmony_ci	| 从同一池中提取的shmfs内存
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci状态
7162306a36Sopenharmony_ci====
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci*	我们核算mmap内存映射
7462306a36Sopenharmony_ci*	我们核算mprotect在提交中的变化
7562306a36Sopenharmony_ci*	我们核算mremap的大小变化
7662306a36Sopenharmony_ci*	我们的审计 brk
7762306a36Sopenharmony_ci*	审计munmap
7862306a36Sopenharmony_ci*	我们在/proc中报告commit 状态
7962306a36Sopenharmony_ci*	核对并检查分叉的情况
8062306a36Sopenharmony_ci*	审查堆栈处理/执行中的构建
8162306a36Sopenharmony_ci*	叙述SHMfs的情况
8262306a36Sopenharmony_ci*	实现实际限制的执行
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci待续
8562306a36Sopenharmony_ci====
8662306a36Sopenharmony_ci*	ptrace 页计数(这很难)。
87