Linux 4.6下MAP_PRIVATE标志的mmap内存提交限制追踪问题
Linux 4.6下MAP_PRIVATE类型mmap与系统提交限制的关系
内存分配时的追踪逻辑
Linux的系统提交限制由/proc/sys/vm/overcommit_memory等参数控制,对MAP_PRIVATE的mmap(2)调用的处理分两种情况:
- 默认模式(
overcommit_memory=0):内核会做启发式检查,但不会严格追踪整个mmap虚拟空间的大小。因为这类映射是写时复制(COW)的,初始阶段只是挂接共享的只读页,只有当进程实际写入页面时,才会分配物理页并计入已提交内存。内核只会估算进程可能用到的内存,不会把整个虚拟分配量都算进已提交额度。 - 严格限制模式(
overcommit_memory=2):此时内核会严格执行提交限制,MAP_PRIVATE的mmap虚拟空间会直接计入进程已用内存,申请时如果加上进程现有内存超过overcommit_ratio或overcommit_kbytes定义的阈值,mmap调用会直接失败。
内存换出时的约束情况
当MAP_PRIVATE的页面需要从RAM换出时,分两种场景:
- 未被修改的COW页:内核直接丢弃这类页面,不会写入交换空间(swap)——因为它们和源文件里的内容完全一致,需要时可以重新从文件读取。这种情况不受swap空间大小的约束。
- 已修改的私有脏页:这类页面是进程写入后生成的私有副本,换出时会被写入swap。此时会受swap可用空间的限制:如果swap不足,内核会触发OOM killer来回收内存,不会像Windows那样直接让进程崩溃。
和Windows页面文件节的差异
Windows的私有节(功能类似MAP_PRIVATE)在创建时就会预留页面文件空间,提交的内存直接对应页面文件的配额;而Linux的MAP_PRIVATE映射在未写入前不占用实际swap或物理内存,只有写入后的脏页才会占用swap资源,提交限制的逻辑和Windows的页面文件配额机制本质不同。
内容的提问来源于stack exchange,提问作者CarloC
相关产品推荐
相关产品推荐

