linux 页缓存 mmap,缓存 – mmap是否直接访问页面缓存或页面缓存的副本?

要以另一种方式提出问题,您是否可以确认当mmap()文件时,您实际上访问了页面缓存中已有的确切物理页面?

我问,因为我正在测试具有1TB RAM的192核心机器上的400GB数据文件,该文件在测试之前预先缓存到页面缓存中(通过删除缓存,然后对文件执行md5sum) .

最初,我有所有192个线程,每个mmap单独mmap文件,假设他们将(基本上)得到(基本上)相同的内存区域(或可能相同的内存区域,但不知何故映射多次).因此,我假设使用两个不同映射到同一文件的两个线程都可以直接访问相同的页面. (让我们在这个例子中忽略NUMA,但显然它在较高的线程数时很重要.)

但是,实际上我发现当每个线程分别对文件进行映射时,线程计数会更高,性能会变得很糟糕.当我们删除它而只是做了一个传递给线程的mmap(这样所有线程只是直接访问相同的内存区域),然后性能得到了显着提高.

这一切都很棒,但我想弄明白为什么.如果事实上mmapping文件只是授予对现有页面缓存的直接访问权限,那么我认为映射它的次数并不重要 – 它应该全部转到完全相同的位置.

但鉴于存在这样的性能成本,在我看来,实际上每个mmap都是独立且冗余填充的(可能是通过从页面缓存中复制,或者可能是从磁盘再次读取).

您能否评论为什么我在同一内存的共享访问与映射同一文件之间看到如此不同的性能?

谢谢,谢谢你的帮助!