0

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

4

1 回答 1

0

最快的方法最终是使用硬件虚拟化本身来实现写时复制机制。它最终变得非常复杂,充满了脚枪,但最重要的是非常快。可以只使用几页工作内存来调用写时复制 VM。大多数页面是重复的页表条目。

此外,这开辟了复制副本的可能性,以及扁平化写时复制 VM 以便它可以用作主节点。

Linux 对此没有任何支持。

于 2021-08-29T16:05:19.163 回答