matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

MongoDB v2.2に含まれる予定のConcurrency改善

Concurrency Internals in MongoDB v2.2 でMongoDB v2.2で入る予定のConcurrency改善について解説されてたので、内容を整理してみた。
v2.2の大きな変更点は、グローバルロックの排除と、PageFaultExceptionアーキテクチャとのこと。今までで一番のConcurrency改善になる。

グローバルロックの排除

  • DB毎のロックが可能になる
  • 粒度として十分ではないが、今後粒度を細かくしていくための最初のステップとして実現
  • Collection毎にしたい人は、綺麗ではないが、DBをCollectionごとに分けるなどのワークアランドが可能(DBは論理的な区切りでしかないので、1 DB に 10 Collection = 10 DB に 10 Collection)
  • 難しい問題はクリアしたので、今後粒度を細かくしていくことは比較的容易
  • 2.4では、Collection毎、あるいはもっと良いロックが実現してるかもしれない
  • グローバルロックはまだ使えるが、ほとんど利用されなくなる(journaling lockなどで利用)
  • 場合によっては1つのスレッドが、2つのDBをロックすることがある
    • oplog利用時にlocal dbへの書き込む場合
    • セキュリティ情報をadmin dbに見にいく場合
  • ロックの状態は以下のコマンドで確認可能
    • currentOp()
    • serverStatus()

PageFaultExceptionアーキテクチャ

  • 1つのCollection単位でのConcurrencyを向上
  • PageFaultが発生することが分かってる場合は、ロックする前にPageFaultExceptionを発生させて再実行
  • ロック中にPageFaultが発生することを避ける仕組み

v2.2以降

  • より粒度を細かくしていく
  • Collection毎のロックは確実にやる
  • Documentレベルロックは出来そうだが、まだやるかは不明