如何避免读取基准测试中的缓存效果

时间:2011-09-15 19:44:13

标签: c linux caching memory-management io

我有一个读取基准,在连续运行之间,我必须确保数据不驻留在内存中以避免因缓存而看到的影响。到目前为止,我过去常常做的是:运行一个程序,在连续运行的读基准之间写入一个大文件。像

这样的东西
./read_benchmark
./write --size 64G --path /tmp/test.out
./read_benchmark

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

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

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

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

非常感谢您的意见。

5 个答案:

答案 0 :(得分:4)

您可以使用/proc中的特殊文件删除所有缓存,如下所示:

echo 3 > /proc/sys/vm/drop_caches

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

答案 1 :(得分:2)

几乎永远不会失败的一种(原始)方式就是用另一个程序简单地占用所有多余的内存。

制作一个简单的程序,分配几乎所有的可用内存(同时留下足够的基准应用程序)。然后memset()内存以确保操作系统将其提交到物理内存。最后,执行scanf()暂停程序而不终止它。

通过“占用”所有多余的内存,操作系统将无法将其用作缓存。这适用于Linux和Windows。现在,您可以继续进行I / O基准测试。

(如果您与其他用户共享该计算机,这可能不会很顺利......)

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您可以卸载文件系统并将其重新安装。卸载刷新并删除文件系统的缓存。