【问题标题】:How to avoid caching effects in read benchmarks如何避免读取基准测试中的缓存影响
【发布时间】:2011-09-15 19:44:13
【问题描述】:

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

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

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

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

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

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

非常感谢您的意见。

【问题讨论】:

    标签: c linux caching memory-management io


    【解决方案1】:

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

    echo 3 > /proc/sys/vm/drop_caches
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但这仍然不会从 RAM 中清除最近读取的文件,所以当我再次挂载它时可能会看到缓存的效果,不是吗?
      • 清除被卸载设备的缓冲区缓存。当它重新挂载时,设备的内容是不确定的,因此内核不能假设旧缓存仍然有效(并且缓存已经在卸载时被删除)。
      【解决方案3】:

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

      【讨论】:

      • 不明白主存和缓存的区别?如果我理解正确,文件将映射到 VM 中延迟加载的页面。如果 VM 丢弃了页面缓存,还剩下什么?
      【解决方案4】:

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

      【讨论】:

      • 我仍然不确定内核是否会尝试从主内存中释放页面,或者只是从处理器缓存中释放页面。
      • 如果它没有清除主内存磁盘缓存,我会感到非常惊讶,但您应该能够使用 mincore() 进行验证,因为它会告诉您文件的哪些页面在核心中跨度>
      【解决方案5】:

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

      制作一个简单的程序来分配几乎所有的空闲内存(同时为您的基准测试应用留出足够的内存)。然后memset() 内存到某个东西,以确保操作系统将它提交到物理内存。最后,执行scanf() 来停止程序而不终止它。

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

      (虽然如果您与其他用户共享机器,这可能不会顺利......)

      【讨论】:

      • 关键是memset()确保操作系统将其提交到物理内存。我认为微不足道的memset() 不会确保提交,因为操作系统很可能会延迟执行此语句,直到它必须这样做。从操作系统的角度来看,如果延迟甚至不执行该语句不会引起任何行为变化,那么这是一个完全可以接受的优化。
      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多