質問

  • BerkeleyDB の C++ 実装が合理的にサポートできる最適な同時実行レベルはどれくらいですか?
  • リソースの競合によりスループットが低下し始める前に、DB で何個のスレッドを実行できるでしょうか?

マニュアルを読み、ロックの数、ロッカー、データベースのページサイズなどの設定方法を理解しました。しかし、実際に BDB 同時実行の経験がある人からのアドバイスが欲しいです。

私のアプリケーションは非常に単純で、それぞれ約 1KB のレコードの get と put を実行します。カーソルも削除もありません。

正しい解決策はありません

他のヒント

それは、構築するアプリケーションの種類によって異なります。代表的なテスト シナリオを作成し、着実に実行していきます。そうすれば、最終的な答えがわかります。

ユースケースに加えて、CPU、メモリ、フロントサイドバス、オペレーティングシステム、キャッシュ設定などにも依存します。

真剣に、独自のシナリオをテストしてください。

数値が必要な場合 (シナリオでは実際には何の意味もないかもしれません):

私は Daan の指摘に強く同意します。テスト プログラムを作成し、そのプログラムがデータにアクセスする方法が、アプリケーションに期待されるパターンをできるだけ模倣していることを確認します。アクセス パターンが異なればスループットも大きく異なるため、これは BDB では非常に重要です。

それ以外に、スループットに大きな影響を与えることが判明した一般的な要因は次のとおりです。

  1. アクセス方法(あなたの場合はBTREEだと思います)。

  2. DBD を構成した永続性のレベル (たとえば、私の場合、「DB_TXN_WRITE_NOSYNC」環境フラグにより​​書き込みパフォーマンスが大幅に向上しましたが、永続性が損なわれます)

  3. ワーキングセットはキャッシュに収まりますか?

  4. 読み取り数と読み取り数書きます。

  5. アクセスがどの程度分散されるか (BTREE にはページ レベルのロックがあることに注意してください。そのため、異なるスレッドで異なるページにアクセスできることは大きな利点です)。

  6. アクセス パターン - スレッドが互いにロックする可能性、さらにはデッドロックが発生する可能性、およびデッドロック解決ポリシー (これはキラーになる可能性があります) を意味します。

  7. ハードウェア (キャッシュ用のディスクとメモリ)。

これは次の点に相当します。DBD に基づいてソリューションをスケーリングして同時実行性を高めるには、2 つの重要な方法があります。設計内のロックの数を最小限に抑えるか、ハードウェアを追加してください。

これはハードウェアやスレッド数などにも依存するのではないでしょうか?

私は簡単なテストを作成し、スレッドのハンマーリングの量を増やしながらそれを実行し、何が最適であるかを確認します。

パフォーマンスが不明なデータベースを扱うときに私が行ったことは、クエリの所要時間を測定することでした。ターンアラウンドタイムが短縮されるまでスレッド数を増やし続け、ターンアラウンドタイムが改善するまでスレッド数を減らし続けました (まあ、私の環境でのプロセスでしたが、それはともかく)。

移動平均やあらゆる種類の指標が関係していましたが、得られた教訓は次のとおりです。現時点で物事がどのように機能しているかに適応するだけです。DBA がいつパフォーマンスを向上させるか、ハードウェアがアップグレードされるか、あるいは実行中に別のプロセスが発生してシステムに負荷がかかるかはわかりません。それで適応してください。

ああ、それともう一つ:可能であればプロセスの切り替えを避け、バッチ処理してください。


ああ、これは明確にしておかなければなりません:これはすべて開発時ではなく実行時に発生しました。

私が物事を理解する方法は Samba によって作成されました tdb 「複数の同時実行」を許可するには 作家" 特定のデータベース ファイルの場合。そのため、ワークロードに複数のライターがある場合、パフォーマンスが低下する可能性があります (Samba プロジェクトが独自のシステムを作成することを選択したのと同様、この場合は Berkeley DB のパフォーマンスに満足できなかったためと思われます)。

一方、ワークロードに多数のリーダーがある場合、問題はオペレーティング システムが複数のリーダーをどの程度適切に処理するかです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top