我有一个 CoW 内存区域,需要将其重置为原始状态。
可悲的是,MADV_DONTNEED 的行为与 munmap 完全相同,并且似乎正在释放所有页面。munmap非常昂贵,至少可以说性能非常可怕,而且使用 MAP_ANONYMOUS 从头开始创建新的 $thing 更便宜,手动初始化它,然后 munmap 。这对我来说是零意义,只是表明 mmap 和 CoW 映射确实破坏了某些东西。不幸的是,对我来说,我真的需要 CoW。就是从一个范围到另一个范围的那个或 memcpy,由于我们在 2021 年,我希望 Linux 将能够进行写时复制。
见:https ://kostja.github.io/2012/04/04/1111.html
我只想丢弃我的内存范围内的脏页。
munmap anon: 435110ns (435 micros)
munmap memfd: 21958015ns (21958 micros)
这是释放 400x 128MB 范围的平均时间。如果我只释放 1 个范围,那么我得到的数字是正常的,所以内核中发生了某种我不理解的不良缩放。tmpfs 支持的区域在使用 MAP_NORESERVE 分配后保持不变。这完全是疯了。memfd(tmpfs-backed)文件有那么慢吗?