FileChannelを使用するJavaでIOパフォーマンスをテストするプログラムを作成しました。直ちにデータを書き、強制的にコール(偽)してください。私のLinuxサーバーには12個のssdハードドライブ、sda〜sdlがあり、異なるハードドライブにデータを書き込んでテストすると、パフォーマンスは大きく異なります。なぜそれがわかりませんか?LinuxのIOパフォーマンスについて
コード:
SDA:wirte 1000000、レコード、4299995700バイト、平均時間を強制:273480 NS
SDB:平均時間を強制する、100000、レコード、429995700バイトをwirte:5868387このような
public static void main(String[] args) throws IOException, InterruptedException {
RandomAccessFile aFile = new RandomAccessFile(args[0], "rw");
int count = Integer.parseInt(args[1]);
int idx = count;
FileChannel channel = aFile.getChannel();
long time = 0;
long bytes = 0;
while (--idx > 0) {
String newData = "New String to write to file..." + System.currentTimeMillis();
String buff = "";
for (int i = 0 ; i<100; i++) {
buff += newData;
}
bytes += buff.length();
ByteBuffer buf = ByteBuffer.allocate(buff.length());
buf.clear();
buf.put(buff.getBytes());
buf.flip();
while(buf.hasRemaining()) {
channel.write(buf);
}
long st = System.nanoTime();
channel.force(false);
long et = System.nanoTime();
System.out.println("force time : " + (et - st));
time += (et -st);
}
System.out.println("wirte " + count + " record, " + bytes + " bytes, force avg time : " + time/count);
}
結果ns
平均時間は大幅に異なります。
ここにいくつかのIOモニタデータがあります。
SDA: iostat data image
SDB: iostat data image
問題として表示される内容を明確にすることはできますか?結論を導き出すのに十分な情報はないようです。過度に再現性がなければ、0.005秒のばらつきはディスクIOに大きな影響を与えません。私は 'sda'がオペレーティングシステムを持っていることを除けば、ドライブはまったく同じだと思いますか? –
注:ベンチマーク用にファイルに書き込むときは、ダミーデータを作成する必要はありません(データが圧縮されない限り)。ゼロバイトでいっぱいのファイルは、ランダムデータを含むファイルと同じです。 –
これらすべてのディスクは、同じファイルシステムタイプの同じコントローラ上の同じドライブモデルですか? 72MB/sのBTWでもSSDで非常に高い音は出ません。私は400 - 500 MB/sを探しているでしょう。 –