4

leveldb(http://code.google.com/p/leveldb/)の公式サイトの1つに、パフォーマンスレポートがあります。以下のように貼り付けました。

以下は公式のleveldbベンチマークからのものです

これは、含まれているdb_benchプログラムの実行からのパフォーマンスレポート(説明付き)です。結果はややうるさいですが、球場のパフォーマンスの見積もりを得るには十分なはずです。

設定

100万エントリのデータベースを使用しています。各エントリには、16バイトのキーと100バイトの値があります。ベンチマークで使用される値は、元のサイズの約半分に圧縮されます。LevelDB:バージョン1.1

CPU:4 x Intel(R)Core(TM)2 Quad CPU Q6600 @ 2.40GHz

CPUキャッシュ:4096 KB

キー:各16バイト

値:各100バイト(圧縮後50バイト)

エントリー:1000000

生のサイズ:110.6 MB(推定)

ファイルサイズ:62.9 MB(推定)

書き込みパフォーマンス

「塗りつぶし」ベンチマークは、新しいデータベースを順次またはランダムな順序で作成します。

「fillsync」ベンチマークは、すべての操作の後にオペレーティングシステムからディスクにデータをフラッシュします。他の書き込み操作では、データはしばらくの間オペレーティングシステムのバッファキャッシュに残ります。「上書き」ベンチマークは、データベース内の既存のキーを更新するランダム書き込みを実行します。

fillseq:1.765 micros / op; 62.7 MB / s

fillsync:268.409 micros / op; 0.4 MB / s(10000 ops)

fillrandom:2.460 micros / op; 45.0 MB / s

上書き:2.380マイクロ/操作; 46.5 MB / s

上記の各「op」は、単一のキー/値ペアの書き込みに対応します。つまり、ランダム書き込みベンチマークは、1秒あたり約400,000回の書き込みになります。

以下は私のleveldbベンチマークからのものです

leveldbのベンチマークを実行しましたが、書き込み速度はレポートの100分の1になりました。

これが私の実験設定です:

  1. CPU:Intel Core2 Duo T6670 2.20GHz
  2. 3.0GBメモリ
  3. 32ビットWindows7
  4. 圧縮なし
  5. options.write_buffer_size = 100MB
  6. options.block_cache = 640MB

私がしたことは非常に単純です。200万の{key、value}を入力するだけで、読み取りはまったく行われません。キーは20個のランダムバイトを持つバイト配列であり、値も100個のランダムバイトを持つバイト配列です。私は常に新しくランダムな{key、value}を200万回、他の操作なしで配置します。

私の実験では、最初から書き込み速度が低下していることがわかります。瞬時速度(1024書き込みごとの速度を測定)は、50/sから10,000/sの間で変動します。そして、200万ペアの書き込みの全体的な平均速度は約3,000/秒です。書き込みのピーク速度は10,000/秒です。

レポートによると、書き込み速度は400、000 / sになる可能性があるため、ベンチマークの書き込み速度は40〜130倍遅くなり、ベンチマークの何が問題になっているのか疑問に思っています。

テストコードをここに貼り付ける必要はありません。非常に簡単です。whileループが200万回あり、ループ内では、反復ごとに20バイトのキーと100バイトの値が生成されます。 、次にそれらをleveldbデータベースに配置します。{key、value}の生成に費やされた時間も測定しました。コストは0ミリ秒です。

誰かがこれを手伝ってくれますか?leveldbで400、000 / sの書き込み速度を達成するにはどうすればよいですか?どの設定に改善する必要がありますか?

ありがとう

さらに

machieで公式のdb_bench.ccを実行しました。レポートより28倍遅いです。

私は彼ら自身のベンチマークプログラムを使用したので、私のベンチマークと彼らのベンチマークの唯一の違いはマシンだと思います。

4

2 に答える 2

3

キーと値のペアが200万あり、各キーと値のペアは合計120バイトなので、200万*120バイト=228MBのデータになります。キャッシュは640MBであるため、すべてのデータがまだRAMにあり、実際にディスクに到達することはない可能性があります。キツネが指摘したように、あなたのハードウェアはグーグルがテストしたものほど速くはなく、グーグルが同じキャッシュサイズを持っていれば、それは簡単に30倍の違いを生み出す可能性があります。

その他の潜在的な問題:

  • キーがどの程度「ランダム」であったかを正確に知ることは困難です。LevelDBは、キーの分布に応じて(「ランダム」であっても)動作が異なります。
  • 20バイトのキーは16バイトのキーよりも効率が悪くなります。これは、それらも整列しないためです。
  • ハードドライブによっては、ディスクの書き込み速度が遅くなる場合があります(確認してください)。

何度も何度も続けることができますが、考慮すべき変数が多すぎます。テストの実行方法を示すコードを投稿する場合は、パフォーマンスを向上させるために、いくつかの最適化をお勧めします。

于 2012-02-22T17:33:15.240 に答える
1

まったく異なるハードウェアで同じベンチマークを実行すると、いくつかの違いが見られます。

  • CPUは16xCores@2.4GHzに対して2xCores@2.2GHzより約9倍弱い
  • ハードドライブと公式ベンチマークのドライブについては言及されていません(ファイバーNASとソリッドステートドライブSSDとハードディスクドライブHDD)

リンゴとオレンジ、またはリンゴと[未知の果物]を比較することはできません。

于 2012-02-22T17:43:52.287 に答える