2016-07-10 7 views
1

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

問題として表示される内容を明確にすることはできますか?結論を導き出すのに十分な情報はないようです。過度に再現性がなければ、0.005秒のばらつきはディスクIOに大きな影響を与えません。私は 'sda'がオペレーティングシステムを持っていることを除けば、ドライブはまったく同じだと思いますか? –

+0

注:ベンチマーク用にファイルに書き込むときは、ダミーデータを作成する必要はありません(データが圧縮されない限り)。ゼロバイトでいっぱいのファイルは、ランダムデータを含むファイルと同じです。 –

+0

これらすべてのディスクは、同じファイルシステムタイプの同じコントローラ上の同じドライブモデルですか? 72MB/sのBTWでもSSDで非常に高い音は出ません。私は400 - 500 MB/sを探しているでしょう。 –

答えて

1

あなたはfioのようないくつかの標準的なツールを使用して測定して、SSDディスクのパフォーマンスを開始する必要があります。

次に、fio出力の数字を使用してユーティリティを再度テストすることができます。

結果を説明できるようにLinuxの書き込みキャッシュに書き込んでいるようです:

関連する問題