如何避免读取基准中的caching效应

我有一个读取基准,并在连续运行之间,我必须确保数据不驻留在内存中,以避免由于caching而出现的影响。 到目前为止,我所做的是:运行一个程序,在连续读取基准testing之间运行一个大文件。 就像是

./read_benchmark ./write --size 64G --path /tmp/test.out ./read_benchmark 

写入程序只是将大小为1G的数组写入文件64次。 由于主内存的大小是64G,所以我写了一个大概的文件。 相同的大小。 问题是,写作需要很长时间,我想知道是否有更好的方法来做到这一点,即避免数据caching时看到的效果。

另外,如果我写数据到/ dev / null会发生什么?

 ./write --size 64G --path /dev/null 

这样,写程序退出非常快,没有I / O实际执行,但我不知道它是否覆盖主内存的64G,这是我最终想要的。

您的意见非常感谢。

您只需卸载文件系统并将其装回即可。 卸载刷新并删除文件系统的缓存。

你可以像下面这样在/proc使用一个特殊的文件来删除所有的缓存:

 echo 3 > /proc/sys/vm/drop_caches 

这应该确保缓存不会影响基准。

使用echo 3 > /proc/sys/vm/drop_caches来刷新页面缓存,目录条目缓存和inode缓存。

您可以使用FADV_DONTNEED调用调用来告诉内核保持某些文件不被缓存。 您也可以使用mincore()来验证文件没有被缓存。 虽然drop_cache解决方案显然比较简单,但是这可能会比删除整个缓存更好,因为它影响了所有的进程。我不认为你需要提高权限才能使用fadvise,而我敢打赌,你要写入/ proc 。 这是一个很好的例子,说明如何使用fadvise调用这个目的: http : //insights.oetiker.ch/linux/fadvise/

一个几乎从未失败的(粗暴的)方式是简单地用另一个程序占据所有的多余的记忆。

做一个简单的程序,分配几乎所有的空闲内存(同时留下足够的基准应用程序)。 然后memset()将内存设置为某些内容,以确保操作系统将其提交给物理内存。 最后,做一个scanf()暂停程序而不终止它。

通过“霸占”所有多余的内存,操作系统将无法将其用作缓存。 这在Linux和Windows都可以使用。 现在你可以继续做你的I / O基准了。

(虽然如果你与其他用户共享机器,这可能不会很好…)