如何在Java中测量磁盘速度以进行基准测试

4
我想知道如何使用Java API来测量磁盘速度。可以衡量的有随机读、顺序读和随机和顺序写。

如果有人认为这不是一个真正的问题,请在关闭前解释一下。

谢谢


在计时的同时读写一堆东西? - Dave Newton
3个回答

8
你可以看一下我用Java编写的磁盘实用工具。它可能不是非常花哨,但它有效。

https://sourceforge.net/projects/jdiskmark/

这里是写入测量代码的片段:
try (RandomAccessFile rAccFile = new RandomAccessFile(testFile,mode)) {
    for (int b=0; b<numOfBlocks; b++) {
        if (App.randomEnable) {
            int rLoc = Util.randInt(0, numOfBlocks-1);
            rAccFile.seek(rLoc*blockSize);
        } else {
            rAccFile.seek(b*blockSize);
        }
        rAccFile.write(blockArr, 0, blockSize);
        totalBytesWrittenInMark += blockSize;
        wUnitsComplete++;
        unitsComplete = rUnitsComplete + wUnitsComplete;
        percentComplete = (float)unitsComplete/(float)unitsTotal * 100f;
    }
}
long endTime = System.nanoTime();
long elapsedTimeNs = endTime - startTime;
double sec = (double)elapsedTimeNs / (double)1000000000;
double mbWritten = (double)totalBytesWrittenInMark / (double)MEGABYTE;
long bwMbSec = mbWritten / sec;
System.out.println("Write IO is " + bwMbSec + " MB/s"
    + "(MB written " + mbWritten + " in " + sec + " sec)");

代码在GitLab上: https://gitlab.com/jamesmarkchan/jDiskMark/

jDiskMark screenshot


2
你想过使用Caliper吗?
从网站上可以看到:
Caliper是Google的开源框架,用于编写、运行和查看Java微基准测试的结果。
0.5版本还有点粗糙,但我们已经发现它非常有用,并且API将保持基本稳定。
最简单的完整Caliper基准测试如下:
public class MyBenchmark extends SimpleBenchmark {
  public void timeMyOperation(int reps) {
    for (int i = 0; i < reps; i++) {
      MyClass.myOperation();
    }
  }
}

2
我会在磁盘上创建一个大文件,以确保您始终保留相同的空间,然后进行测试,即使用RFA读取/写入文件块,并改变这些块的大小。我还会随机或来回移动文件块的位置(从文件的开头到结尾)。所有这些都将让您根据块的大小等情况测量某些情况下的平均传输速率。
但请注意,无论您使用Java还是简单的C,都无法访问低级文件组织。您可能正在使用已经碎片化的硬盘(空间越空,碎片化的可能性就越小)。该信息仅在内核级别(而非用户级别)可用。但是,如果您进行了大量测试(不是仅读取文件的一部分,而是在整个文件空间中进行多次测试),并且磁盘相当空闲(以确保磁盘上的块没有太多的碎片),则可以统计得到相当合理的读/写速度指标。
另一个我忘记提到的重要问题会影响你的测量结果是缓存。第一次从文件中读取数据块时,你可能没有使用缓存,但第二次就不同了。因此,我建议你阅读这个其他问题中的方法。

是的,一定要注意磁盘读取缓存,并且将文件写入磁盘也会将其添加到磁盘的读取缓存中。至少在我的情况下是这样的。 - simgineer

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