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レベルロックは出来そうだが、まだやるかは不明