2013-02-09 13 views
9

背景:性能特性

私は非常に大きく メモリ上の集中的なIOを行うJavaアプリケーションがファイル(> 500メガバイト)をマッピングしました。プログラムはデータの読み取り、データの書き込み、 を実行します。

すべての読み取り/書き込み関数は、同様の計算量を持っています。

は、私はプログラムのIO層をベンチマークし、メモリマップされたファイルの奇妙な 性能特性に気づい:

  • それは90Kが(ランダムな位置に1キロバイトすべての反復を読む)
  • それは38Kを行う第2あたりの読み込みを実行します
  • 1秒あたり43kの書き込みを実行します(ランダムな位置で繰り返しごとに4バイトを書き込みます)。
  • 1回の読み取り/書き込み結合操作は1回につき9KBです(ランダムな位置に12バイトを読み込み、繰り返しごとに1KBを書き込む)

64ビットJDK 1.7、Linux 3.4のプログラム。

このマシンは、CPUが8スレッドで、物理メモリが4 GBの通常のIntel PCです。ベンチマークを実行するときにはJVMヒープに1 GBしか割り当てられませんでした。読み取り、書き込み、/書き込み機能https://github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala

そして、ここでは上記の読み込みの実装です:より多くの詳細が必要な場合

、ここではベンチマークのコードであるhttps://github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala

だから私の質問は以下のとおりです。

  • 固定ファイルサイズとメモリサイズが与えられた場合、メモリマップファイルランダム読み出しパフォーマンスにどのような要素が影響しますか?
  • 固定ファイルサイズとメモリサイズを指定すると、メモリマップファイルランダム書き込みパフォーマンスにどのような要素が影響しますか?
  • 読み取り/書き込み結合操作のベンチマーク結果はどのように説明しますか? (私はそれが毎秒20K回の繰り返しを実行することを期待していた)。

ありがとうございます。

+0

1.ファイルのマッピング方法のコードを表示します。 2.システムの負荷を確認しましたか?iostat、いつものように? – bmargulies

+0

ありがとうbmargulies。最新の編集を参照してください。 –

答えて

0

メモリマップファイルのパフォーマンスは、ディスクのパフォーマンス、ファイルシステムの種類、ファイルシステムのキャッシュに使用可能な空きメモリ、読み書き可能なブロックサイズによって異なります。 Linux上のページサイズは4Kです。したがって、4kの読み書きでほとんどのパフォーマンスが期待できます。ランダムな位置にアクセスすると、ページがマップされていない場合はページフォルトが発生し、新しいページが読み込まれます。通常、ファイルを1つのメモリ配列(またはJavaのByteBuffer)として見たい場合は、メモリマップファイルが必要です。

関連する問題