Berkeley DBを使用して、単純なKey-Valueストレージシステムを作成したいと考えています。キーはSHA-1ハッシュになるため、160ビットのアドレス空間にあります。Berkeley DB Webサイトからのかなりよく書かれたドキュメントのおかげで、私は単純なサーバーを動作させています。ただし、優れたパフォーマンスと柔軟性を得るために、このようなシステムをセットアップする最善の方法についていくつか質問があります。うまくいけば、誰かがBerkeley DBの経験が豊富で、私を助けてくれるでしょう。
最も単純なセットアップは、単一のDBを処理する単一のスレッドを持つ単一のプロセスです。挿入と取得は、トランザクションを使用して、この1つのDBで実行されます。
代替案1:単一プロセス、複数スレッド、単一DB; 挿入と取得は、プロセス内のすべてのスレッドによって、このDBで実行されます。
- 複数のスレッドを使用すると、パフォーマンスが大幅に向上しますか?DBが1つあるので、1つのディスク上にあるので、あまりブーストされないと思います。しかし、Berkeley DBがメモリに多くのものをキャッシュしている場合、おそらく1つのスレッドが実行され、キャッシュから応答でき、別のスレッドがディスクの待機をブロックしているのでしょうか。私はGNUPth、ユーザーレベルの協調スレッドを使用しています。私はPthの詳細に精通していないため、Pthを使用して、別のユーザーレベルのスレッドがブロックされているときにユーザーレベルのスレッドを実行できるかどうかもわかりません。
代替案2:単一プロセス、1つまたは複数のスレッド、複数のDB。各DBはキーの160ビットアドレス空間の一部をカバーします。
- 複数のDBを使用することには、いくつかの利点があります。それらを異なるディスクに配置でき、競合が少なくなり、必要に応じてDBを異なる物理ホストに移動/パーティション分割するのが簡単になります。誰かがこのセットアップの経験があり、重要な利点を見ていますか?
代替案3:それぞれが1つのスレッドを持つ複数のプロセスは、それぞれがキーの160ビットアドレス空間の一部をカバーするDBを処理します。
- これには、複数のDBを使用するという利点がありますが、複数のプロセスを使用しています。これは2番目の選択肢よりも優れていますか?並列処理を取得するためにユーザーレベルのスレッドではなくプロセスを使用すると、SMPキャッシングの動作が向上する(無効化が少ないなど)と思いますが、すべてのプロセスオーバーヘッドとコンテキストスイッチで強制終了されますか?
誰かがオプションを試し、ポジティブまたはネガティブな結果を見たかどうか聞いてみたいです。
ありがとう。