MongoDBのコネクション数上限問題メモ

MongoDBサーバーのマスター/スレーブ環境でコネクション数が上限に達したトラブルのメモです。

サーバー環境
MongoDBサーバー名 OSバージョン MongoDBサーバーバージョン
mongodb01.example.com CentOS 6.2 mongo-server-2.0.5-0.el6.x86_64 マスター
mongodb02.example.com CentOS 6.2 mongo-server-2.0.5-0.el6.x86_64 スレーブ


ケース1

MongoDBサーバーをCentOS5系からCentOS6系にリプレイスした後、
MongoDBサーバーにコネクションが張れない状態になりました。


その時のMongoDBサーバーのログに以下のような出力がありました。

Mon Jan  1 00:00:01 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Mon Jan  1 00:00:01 [initandlisten] can't create new thread, closing connection

どうもスレッドが作成出来ていない様子。

プロセス(スレッド)数を確認

そこで以下のコマンドでサーバーのプロセス(スレッド)数を確認。

[root@mongodb01 ~]# ps aux -L | grep mongo | wc -l

何度スレッド数をカウントしても900ちょいくらいで、そこから増えることも減ることもなく変化がありませんでした。


これプロセス(スレッド)数が1000くらいで頭打ちになってね?と、焦りながらulimitを打ってみるとなんと1024になってました。
※このコマンドでも確認したが、こっちは問題無し→cat /proc/sys/kernel/threads-max

[root@mongodb01 ~]# ulimit -u
1024


…。


原因

これまでのCentOS5系で「max user processes」はデフォルトでunlimitedだったのですが、
CentOS6系ではデフォルトで1024になっているようです。
参考情報:CentOS6で制限されているプロセス最大数を制限解除する


/etc/security/limits.d/90-nproc.conf
こんな設定ファイルが新たに追加されたのですね。


/etc/security/limits.confにちゃんとnprocの設定を1024以上の設定を行ってるのになーと思ったら

[/etc/security/limits.conf]で変更しても上書きされるので注意!

がーん

対応

MongoDB公式の「Recommended Settings」を参考にデフォルト設定から変更を行いました。

/etc/security/limits.d/90-nproc.conf

デフォルト

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     1024



修正後

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

* soft nproc 32000
* hard nproc 32000


この後、MongoDBデーモンの再起動を行うことで解決しました。
これはMongoDBを運用している時に発生したというだけで原因はCentOSの設定ミスですね。

ケース2

一難去ってまた一難。
ケース1と同じ環境でまたコネクションに関するトラブルが発生しました。

MongoDBサーバーのログに以下のような出力が延々と続きました。

Mon Jan 01 00:00:01 [initandlisten] connection refused because too many open connections: 20000
Mon Jan 01 00:00:01 [initandlisten] connection refused because too many open connections: 20000
(略)
Mon Jan 01 00:05:01 [initandlisten] connection refused because too many open connections: 20000
Mon Jan 01 00:05:01 [initandlisten] connection refused because too many open connections: 20000


ケース1の反省を踏まえて導入したZabbixのMongoDBのコネクション数の監視グラフです。

ちょっと見づらいかもですが、使用コネクション数(緑線)が20000に張り付いてます。
20000以下になる時があっても20000以上になっていません。

原因

ケース1で色々設定の見直しや修正を行ってきたので、何だろうと思ったのですがこちらはMongoDBの仕様のようです。

Note: You cannot set maxConns to a value higher than 20000.

http://docs.mongodb.org/manual/reference/configuration-options/#maxConns