重置或释放写时复制映射区域的最快方法

问题描述

我有一个 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 支持文件就那么慢吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)