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