Java API を使用してディスク速度を測定する方法を知りたいです。
ランダム読み取り、シーケンシャル読み取り、ランダムおよびシーケンシャル書き込み。
誰かがそれが本当の質問ではないと思うなら。閉じる前にその旨を説明してください。
ありがとう
Java API を使用してディスク速度を測定する方法を知りたいです。
ランダム読み取り、シーケンシャル読み取り、ランダムおよびシーケンシャル書き込み。
誰かがそれが本当の質問ではないと思うなら。閉じる前にその旨を説明してください。
ありがとう
私が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/
ディスクに大きなファイルを作成して、常に同じスペースを確保してから、テストを続行します。つまり、RFAを使用してファイルのチャンクを読み取り/書き込みし、それらのチャンクのサイズを変更します。また、チャンクの位置を変更します(ランダムに、またはファイルの最初と最後を前後に戻します)。これにより、チャンクのサイズなどに応じて、特定の状況での平均転送速度を測定できます。
ただし、java または単純な C を使用する場合でも、低レベルのファイル編成にアクセスできないことを考慮してください。フラグメント化された HD を使用している可能性があります (空であるほど、非常にフラグメント化されている可能性は低くなります)。その情報は、カーネル レベルでのみ利用できます (ユーザー ランド レベルではありません)。ただし、多くのテスト (ファイルの一部を 1 回読み取るのではなく、ファイル スペース全体を何度も読み取る) を実行し、ディスクがかなり空である場合 (ディスク上のブロックに多くの断片化がないことを確認するため) )、読み取り/書き込み速度のかなり妥当な指標を統計的に取得できます。
測定に影響を与える、私が忘れていたもう 1 つの重要な問題は、キャッシュです。ファイルからチャンクを最初に読み取るときは、キャッシュを使用していない可能性がありますが、2 回目はそうではありません。そのために、この他の質問のアプローチを読むことをお勧めします。
Caliperの使用を考えたことはありますか?
サイトから:
Caliper は、JavaMicrobenchmarks の結果を作成、実行、表示するための Google のオープンソース フレームワークです。
0.5 のリリースは端が少し粗いですが、すでに非常に便利であることがわかっており、API はほぼ安定しています。
最も単純な完全な Caliper ベンチマークは次のようになります。
public class MyBenchmark extends SimpleBenchmark {
public void timeMyOperation(int reps) {
for (int i = 0; i < reps; i++) {
MyClass.myOperation();
}
}
}