10

バックグラウンド:

非常に大きなメモリマップファイル(> 500 MB)で集中的なIOを実行するJavaアプリケーションがあります。プログラムはデータを読み取り、データを書き込み、場合によっては両方を実行します。

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

プログラムのIOレイヤーのベンチマークを行ったところ、メモリマップトファイルの奇妙なパフォーマンス特性に気づきました。

  • 1秒あたり90kの読み取りを実行します(ランダムな位置で反復ごとに1KBを読み取ります)
  • 1秒あたり38kの書き込みを実行します(反復ごとに1KBを順次書き込みます)
  • 1秒あたり43kの書き込みを実行します(ランダムな位置で反復ごとに4バイトを書き込みます)
  • 1秒あたり9kの読み取り/書き込みの組み合わせ操作のみを実行します(ランダムな位置で、12バイトを読み取り、反復ごとに1KBを書き込みます)

64ビットJDK1.7、Linux3.4上のプログラム。

マシンは、8スレッドのCPUと4GBの物理メモリを備えた通常のIntelPCです。ベンチマークの実施時に、JVMヒープに割り当てられたのは1GBのみでした。

詳細が必要な場合は、ベンチマークコードを次に示します: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以上の反復を実行することを期待していました)。

ありがとうございました。

4

1 に答える 1

0

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

于 2013-02-10T14:33:27.687 に答える