バックグラウンド:
非常に大きなメモリマップファイル(> 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以上の反復を実行することを期待していました)。
ありがとうございました。