如何在没有缓存的情况下测量文件读取速度?
Posted
技术标签:
【中文标题】如何在没有缓存的情况下测量文件读取速度?【英文标题】:How to measure file read speed without caching? 【发布时间】:2012-07-21 13:12:06 【问题描述】:我的 java 程序大部分时间都花在读取一些文件上,我想优化它,例如,通过使用并发、预取、memory mapped files 或其他方式。
不进行基准测试的优化是无稽之谈,所以我进行基准测试。然而,在基准测试期间,整个文件内容被缓存在 RAM 中,这与实际运行不同。因此,基准测试的运行时间要小得多,而且很可能与实际情况无关。
我需要以某种方式告诉操作系统 (Linux) 不要缓存文件内容,或者最好在每次基准测试运行之前清除缓存。或者可能会占用大部分可用 RAM (32 GB),因此只有一小部分文件内容适合。怎么做?
我使用caliper 进行基准测试,但在这种情况下,我认为没有必要(这绝不是微基准),我不确定这是一个好主意。
【问题讨论】:
Windows 的解决方案也会很有趣 【参考方案1】:清除 Linux 文件缓存
sync && echo 1 > /proc/sys/vm/drop_caches
创建一个使用所有 RAM 的大文件
dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER
(完成后不要忘记删除dummyfile
)。
【讨论】:
后者可能需要相当长的时间,我不知道如何从基准测试结果中排除这段时间。前者似乎通过 suid perl-script 工作。【参考方案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 中也称为预读,是一种广泛部署的技术,用于弥合存储设备的特性与其应用程序使用效率低下的方式之间的巨大差距
【讨论】:
是的,现在是您开始将 SSD 放在任何地方的时候了。 即使使用具有多个脊椎的磁盘控制器也会有所帮助,但使用 SSD,您的限制是容量(或预算;)而不是速度。 @Peter Lawrey:多线程不会让我的磁盘旋转得更快,但一个线程可能会预取数据,因此处理和计算可能会重叠。使用 RAID,一次预取多个文件可能是个好主意。可能有一个最佳的块大小,等等...... 如果您按顺序读取数据,操作系统通常足够智能预取数据,因此您可能不需要自己编写(这是加载数据的最快方式) 操作系统不会从不同的文件中预取数据,所以如果应用程序是'读取文件,处理它,读取下一个文件,处理它'的多样性,你会从并发中受益。跨度>以上是关于如何在没有缓存的情况下测量文件读取速度?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中清空/刷新 Windows READ 磁盘缓存?