2017-11-08 6 views
0

データベースシステムのチュートリアルでは、教科書データベースシステムの概念のように、Buffer Pool/Buffer Manager/Pager /というモジュールがあります。私はそれについて多くの詳細を見ていないので、私はあなたがどのようにの同時実行を増やすのですか?データベースシステムでバッファプールの同時パフォーマンスを向上させるにはどうすればよいですか?

たとえば、Trieインデックスがあるとします。バッファプールなしでトライの内部でページングを行うと、複数のスレッドでリーフノードを同時にロードまたはエバリュートすることができます。ノードの共有ロックを上から下に取得し、リーフノードの親。

ただし、バッファプールにページングの処理をさせる場合は、バッファプールの排他ロックを取得する必要があると考えられます。次に、同時に1つのスレッドのみがページを読み込んだり、追い出したりすることができます。

実際、私はこれをデータベース実装で試しました。古いバージョンにはバッファー・プールがなく、trie索引内のページング項目を管理します。そして、新しいバージョンでは、trieインデックスの代わりにバッファプールがあります。ページIDをバッファプール内の対応するページにマップするハッシュマップを保護する大きなロックがあります。シングルスレッドテストは40%高速ですが、同時に10スレッド、5倍遅くなります!

ロックフリーのデータ構造が役立つと思いますか?しかし、私はそれがまっすぐに考えるのは難しいだろうと思う。では、どのようにバッファプールを設計して実装していますか?ありがとう!

答えて

0

私はこの問題をthe discussion here (in Chinese, sorry)のおかげで解決しました。解決策は非常に簡単です。バッファマネージャを破るだけです。各ページは、ページ番号をハッシュすることによってシャードに委任されます。このハッシュ関数が均一な分布をもたらす限り、同じロックで複数のスレッドが待機する確率は低くなります。私の場合は

は、私は128個の破片にバッファ・マネージャを分割し、ハッシュ関数は、単純なベンチマークの結果は非常に驚くべきに見え、10のスレッドで、ちょうどpage_no % 128です:

  • シャードバッファ・マネージャで:7.73 S
  • バッファ・マネージャを持つ:バッファ・マネージャのない123S
  • 、トライは、ページング自体を行い、つまり:

19.7sところで、MySQLはまた取るように見えますこのアプローチ(私はそれを誤解した場合私を修正してください):https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-buffer-pools.html

関連する問題