以另一种方式问这个问题,您能否确认当您 mmap() 一个文件时,您实际上访问了页面缓存中已经存在的确切物理页面?
我之所以问,是因为我正在一台 192 核、1TB RAM 的机器上测试一个 400GB 的数据文件,该文件在测试前预缓存到页面缓存中(只需删除缓存,然后对文件执行 md5sum) .
最初,我让所有 192 个线程分别对文件进行 mmap,假设它们都会(基本上)返回相同的内存区域(或者可能是相同的内存区域,但以某种方式映射了多次)。因此,我假设使用两个不同映射到同一个文件的两个线程都可以直接访问相同的页面。(让我们忽略这个例子中的 NUMA,尽管显然它在更高的线程数中很重要。)
然而,在实践中,我发现当每个线程单独映射文件时,在更高的线程数下性能会变得很糟糕。当我们删除它并只执行一个传递给线程的 mmap 时(这样所有线程都直接访问相同的内存区域),然后性能显着提高。
这一切都很好,但我正试图找出原因。如果实际上映射一个文件只是授予对现有页面缓存的直接访问权限,那么我认为映射它的次数并不重要——它应该都到同一个地方。
但是考虑到这样的性能成本,在我看来,实际上每个 mmap 都是独立且冗余地填充的(可能通过从页面缓存复制,或者可能通过再次从磁盘读取)。
您能否评论一下为什么我看到共享访问同一内存与映射同一文件之间存在如此不同的性能?
谢谢,感谢您的帮助!