换一种方式问,您能否确认当您使用mmap()映射文件时,您实际上可以访问已经存在于页面缓存中的确切物理页面?
我询问这个问题是因为我正在对拥有1TB RAM的192核心机器上的400GB数据文件进行测试,该文件在测试之前被预先缓存在页面缓存中(通过清除缓存,然后对文件执行md5sum)。
最初,我让所有192个线程分别映射文件,假设它们都会获得(基本上)相同的内存区域(或者可能是相同的内存区域,但以某种方式多次映射)。因此,我假设两个使用不同映射的线程都可以直接访问相同的页面。(在这个例子中,让我们忽略NUMA,尽管显然在更高的线程数下它很重要。)
然而,在实践中,当每个线程单独对文件进行mmap时,性能会在更高的线程数下变得非常糟糕。当我们移除它,并改为只进行一次映射并将其传递到线程中时(以使所有线程直接访问相同的内存区域),性能得到了极大的改善。
这很好,但我试图弄清楚原因。如果事实上映射文件只是授予对现有页面缓存的直接访问权,则我认为映射多少次都无所谓,因为它们都应该进入完全相同的位置。
但是,考虑到存在这样的性能成本,我认为实际上每个映射都是独立且冗余地填充的(可能通过从页面缓存中复制,或者可能通过重新从磁盘读取)。
您能否评论一下为什么在共享对相同内存的访问与映射相同文件之间会看到如此不同的性能?
谢谢,感谢您的帮助!
我询问这个问题是因为我正在对拥有1TB RAM的192核心机器上的400GB数据文件进行测试,该文件在测试之前被预先缓存在页面缓存中(通过清除缓存,然后对文件执行md5sum)。
最初,我让所有192个线程分别映射文件,假设它们都会获得(基本上)相同的内存区域(或者可能是相同的内存区域,但以某种方式多次映射)。因此,我假设两个使用不同映射的线程都可以直接访问相同的页面。(在这个例子中,让我们忽略NUMA,尽管显然在更高的线程数下它很重要。)
然而,在实践中,当每个线程单独对文件进行mmap时,性能会在更高的线程数下变得非常糟糕。当我们移除它,并改为只进行一次映射并将其传递到线程中时(以使所有线程直接访问相同的内存区域),性能得到了极大的改善。
这很好,但我试图弄清楚原因。如果事实上映射文件只是授予对现有页面缓存的直接访问权,则我认为映射多少次都无所谓,因为它们都应该进入完全相同的位置。
但是,考虑到存在这样的性能成本,我认为实际上每个映射都是独立且冗余地填充的(可能通过从页面缓存中复制,或者可能通过重新从磁盘读取)。
您能否评论一下为什么在共享对相同内存的访问与映射相同文件之间会看到如此不同的性能?
谢谢,感谢您的帮助!