読者です 読者をやめる 読者になる 読者になる

「第3回 MongoDB 勉強会 in Tokyo」に参加してきたよ

ここ1ヶ月位、AMN の広告配信システムのログ保存を MongoDB に切り替える作業をしていて、最近は MongoDB の素晴らしさに驚かされっぱなしだったわけですが、調度良いタイミングで勉強会が開催されたので参加してきました。

しょっぱなの @ さんの MongoDB の機能を俯瞰するセッションが素晴らしくて、時間を大幅にオーバーしたにも関わらず、参加者からの不満は全く聞かれませんでした。(まぁどうせ後ろは懇親会ですし、時間オーバー気にしないw)

新しいコミュニティがいい感じで育っている

比較的新しめの技術である MongoDB は、運用ノウハウなどもまださほど溜まっている状態ではなく、使っている人が手探りで試しながら、そこから得られた知見を積極的に交換している状況です。みんな楽しそうに疑問点などについてディスカッションしていて、とてもいい雰囲気のコミュニティが育っているのを肌で感じました。

MongoDB はシングルスレッドか?

イベントの中で「MongoDB はシングルスレッドだから...」という発言が幾度もあって、エラーログに "can't create new thread" なんてメッセージを良く見ていた自分としては、本当かなぁと思っていたわけです。それで ps -eLf で見てみました。

# ps -eLf | grep mongod
mongod   22359     1 22359  0   20 May10 ?        00:34:24 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22360  0   20 May10 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22361  0   20 May10 ?        00:00:15 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22363  0   20 May10 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22364  0   20 May10 ?        00:00:04 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22365  0   20 May10 ?        00:00:02 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22367  0   20 May10 ?        00:14:54 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22369  0   20 May10 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22382  0   20 May10 ?        00:00:32 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22383  0   20 May10 ?        00:00:31 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22384  0   20 May10 ?        00:00:12 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22385  0   20 May10 ?        00:00:08 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22386  0   20 May10 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22388  0   20 May10 ?        00:00:23 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22392  0   20 May10 ?        00:00:24 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 22397  0   20 May10 ?        00:00:07 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1  4806  3   20 16:32 ?        00:00:11 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1  4818  0   20 16:32 ?        00:00:01 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 14798  0   20 16:37 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf
mongod   22359     1 14799  0   20 16:37 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf

やはりどうやらマルチスレッドで動いているぽい。


ではということでソースにあたってみます。先程の "can't create new thread" というメッセージで grep をかけたらあっさり見つかりました。


1.8.1 では db/db.c の 111 行目、OurListener::accepted() の中で

            try {
                boost::thread thr(boost::bind(&connThread,mp));
            }
            catch ( boost::thread_resource_error& ) {
                log() << "can't create new thread, closing connection" << endl;
                mp->shutdown();
                delete mp;
            }

と boost::thread を使ってスレッドを生成しています。多少コードを追ってみると、接続一つごとにスレッドを割り当てて処理しているようです。そこでboost::thread で grep すると、他にも様々な場所でスレッドを使っていることが分かりました。


これらから「MongoDB がシングススレッド」という意味は、一つのオペレーションは複数のスレッドに分割されて処理するわけではなく、一つのスレッドが割り当てられてそのスレッドのみが処理する、という意だと理解しました。


まぁ1プロセス1スレッドで動いているとしたら、あれだけの速度で動作するのは超絶職人芸的なプログラミングが必要だろうなと思っていたので、ある意味納得です。