如何测量未缓存的文件读取速度?

18

我的Java程序大部分时间是在读取一些文件,我希望对其进行优化,例如使用并发、预取或内存映射文件等方式。

没有基准测试的优化是无意义的,所以我进行了基准测试。然而,在基准测试期间,整个文件内容都被缓存在RAM中,不像实际运行中那样。因此,基准测试的运行时间要小得多,并且很可能与实际情况无关。

我需要以某种方式告诉操作系统(Linux)不要缓存文件内容,或者最好在每次基准测试运行之前清除缓存。或者消耗大部分可用的RAM(32 GB),以便只有极小部分文件内容适合缓存。如何做到这一点?

我正在使用Caliper进行基准测试,但在这种情况下我认为它不是必要的(它绝不是微基准测试),并且我不确定这是否是一个好主意。


一个Windows的解决方案也会很有趣。 - Basj
2个回答

5
清除Linux文件缓存
sync && echo 1 > /proc/sys/vm/drop_caches

创建一个大文件,利用所有的RAM。
dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER

完成后不要忘记删除dummyfile


后者可能需要相当长一段时间,而我不知道如何将此时间从基准测试结果中排除。前者似乎可以通过一个suid perl脚本来完成。 - maaartinus

2
你可以创建一个非常大的文件,然后将其删除。这将清除磁盘缓存。
另一种测试性能的方法是读取一个比主内存更大的文件。
无论哪种方式,你都在测试硬件的性能。要改善这个问题,你需要改善你的硬件,软件方面只能做到有限的程度。例如,多线程不会让你的磁盘旋转更快。 ;)
Windows NT:http://research.microsoft.com/pubs/68479/seqio.doc
当进行顺序扫描时,NT会进行64KB的预取请求。
来自Linux:http://www.ece.eng.wayne.edu/~sjiang/Tsinghua-2010/linux-readahead.pdf 顺序预取,也称为Linux中的读取前瞻,是一种广泛使用的技术,用于弥合存储设备特性和应用程序低效使用它们之间的巨大差距。

是的,这是你开始在各个地方安装固态硬盘的时候了。 - Bruno Grieder
即使使用带有多个磁盘的磁盘控制器也可以提高性能,但使用固态硬盘时,限制因素是容量(或预算 ;)),而不是速度。 - Peter Lawrey
@Peter Lawrey:多个线程不会让我的磁盘旋转更快,但一个线程可以预取数据,因此处理和计算可能会重叠。使用RAID时,同时预取多个文件可能是一个好主意。可能存在最佳块大小等优化方案... - maaartinus
@sam 看起来微软和Linux存在分歧。你有任何支持这一观点的参考资料吗? - Peter Lawrey
@Peter Lawrey:感谢您提供相关链接!操作系统无法知道我将要打开哪个文件,因此这种预取至少是有意义的。在我的Linux上,我可以确认在单线程读取时手动预取没有任何效果。并发测试尚未完成。 - maaartinus
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接