如何在不缓存的情况下测量文件读取速度?

时间:2012-07-23 09:52:58

标签: java caching benchmarking caliper disk-io

我的java程序花了大部分时间阅读一些文件,我想优化它,例如,通过使用并发,预取,memory mapped files或其他任何文件。

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

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

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

2 个答案:

答案 0 :(得分:3)

清除Linux文件缓存

sync && echo 1 > /proc/sys/vm/drop_caches

创建一个使用所有RAM的大文件

dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER

(完成后不要忘记删除dummyfile。)

答案 1 :(得分:1)

您可以创建一个非常大的文件,然后将其删除。这将清除磁盘缓存。

测试性能的另一种方法是读取大于主内存的文件。

无论哪种方式,您正在测试的是硬件的性能。为了改善这一点,您需要改进硬件,只需要在软件中做很多事情。例如多个线程不会使您的磁盘旋转得更快。 ;)


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中也称为readahead,是一种广泛部署的技术,用于弥合存储设备特性与应用程序低效使用方式之间的巨大差距