CentOS 6上のmongodb接続数が1000を突破できない解決策
問題の説明:
生産環境はCPUフル負荷運転を発見し、MongoDBの接続数は常に1000を突破できない.
ソリューション:
1、mongodbのログを見て、次のエラーを報告します.
2、同じcentos 5の機械でテストしたところ、2000個の接続に接続しても問題がないことが分かった.3、googleで問題を探し、キーワード「mongod.conf can't create new thread,closing connection」4、問題点を見つけた.d/90-nproc.confは、デフォルトでは一般ユーザーのnprocを1024に設定しているが、mongodbはちょうどmongodという非rootユーザーを使って走っているので、接続数はずっと上がらない.5、変更/etc/security/limits.d/90-nproc.confは、1024を20480に変更し、問題を解決します.
開くファイルハンドル数と最大ユーザープロセス数の制限:
Linuxの下にアプリケーションを配置するとき、Socket/File:Can't open so many filesの問題に遭遇することがあります.この値はサーバの最大同時数にも影響しますが、Linuxにはファイルハンドルの制限があり、Linuxのデフォルトは高くありません.一般的には1024で、本番サーバ用は簡単にこの数に達します.次に、このシステムのデフォルト値を正解構成で修正する方法について説明します.
表示方法
すべての制限値をulimit-aで表示できます
ここで、「open files(-n)」は、Linuxオペレーティングシステムがプロセスで開くファイルハンドルの数に制限され、デフォルトは1024です.(開いているSOCKETの数も含まれており、データベースの同時接続数に影響を与える可能性があります).
正しい方法は、/etc/security/limitsを変更することです.confにはhadoop soft nofile 32768 hadoop hard nofile 65536などの詳細なコメントがあります.
hadoop soft nproc 32768 hadoop hard nproc 65536
ファイルハンドル制限をソフト32768、ハード65536に統一することができます.プロファイルの先頭にはdomainがあり、アスタリスクに設定するとグローバルを表します.また、異なるユーザーに対して異なる制限を加えることもできます.
注意:この中のハード制限は実際の制限であり、ソフト制限はwarning制限であり、warning制限しかできない.実はulimitコマンド自体はソフトとハードの設定があって、プラス-Hはハードで、プラス-Sはソフトです
デフォルトではソフトリミットが表示されますが、ulimitコマンドの変更を実行しても追加されなければ、2つのパラメータが一緒に変更されます.
RHE 6以降のnprocの修正は/etc/security/limits.d/90-nproc.conf中
接続数の制限を変更する方法:
一時的な変更(現在のshellでユーザーが開く可能なプロセス数を変更):
永続的な修正、保険の方法は同時に/etc/security/limitsを修正することです.d/90-nproc.confおよび/etc/security/limits.confは以下の通りです.
limits_conf =/etc/security/limits.conf: * soft nproc s1 * hard nproc h1
nproc_conf =/etc/security/limits.d/90-nproc.conf: * soft nproc s2 * hard nproc h2
s 1,h 1,s 2,h 2は具体的に有意義な数である必要がある.このときulimit-uに表示される値は=min(h 1,h 2)
したがって、通常はs 1=s 2=h 1=h 2、例えばlimits_confとnproc_confに同時に追加:*soft nproc 65536*hard nproc 65536
生産環境はCPUフル負荷運転を発見し、MongoDBの接続数は常に1000を突破できない.
ソリューション:
1、mongodbのログを見て、次のエラーを報告します.
Wed Nov 21 15:26:09 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Wed Nov 21 15:26:09 [initandlisten] can't create new thread, closing connection
2、同じcentos 5の機械でテストしたところ、2000個の接続に接続しても問題がないことが分かった.3、googleで問題を探し、キーワード「mongod.conf can't create new thread,closing connection」4、問題点を見つけた.d/90-nproc.confは、デフォルトでは一般ユーザーのnprocを1024に設定しているが、mongodbはちょうどmongodという非rootユーザーを使って走っているので、接続数はずっと上がらない.5、変更/etc/security/limits.d/90-nproc.confは、1024を20480に変更し、問題を解決します.
[root@test ~]# cat /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 20480
開くファイルハンドル数と最大ユーザープロセス数の制限:
Linuxの下にアプリケーションを配置するとき、Socket/File:Can't open so many filesの問題に遭遇することがあります.この値はサーバの最大同時数にも影響しますが、Linuxにはファイルハンドルの制限があり、Linuxのデフォルトは高くありません.一般的には1024で、本番サーバ用は簡単にこの数に達します.次に、このシステムのデフォルト値を正解構成で修正する方法について説明します.
表示方法
すべての制限値をulimit-aで表示できます
[root@test ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256469
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 64000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65536
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ここで、「open files(-n)」は、Linuxオペレーティングシステムがプロセスで開くファイルハンドルの数に制限され、デフォルトは1024です.(開いているSOCKETの数も含まれており、データベースの同時接続数に影響を与える可能性があります).
正しい方法は、/etc/security/limitsを変更することです.confにはhadoop soft nofile 32768 hadoop hard nofile 65536などの詳細なコメントがあります.
hadoop soft nproc 32768 hadoop hard nproc 65536
ファイルハンドル制限をソフト32768、ハード65536に統一することができます.プロファイルの先頭にはdomainがあり、アスタリスクに設定するとグローバルを表します.また、異なるユーザーに対して異なる制限を加えることもできます.
注意:この中のハード制限は実際の制限であり、ソフト制限はwarning制限であり、warning制限しかできない.実はulimitコマンド自体はソフトとハードの設定があって、プラス-Hはハードで、プラス-Sはソフトです
デフォルトではソフトリミットが表示されますが、ulimitコマンドの変更を実行しても追加されなければ、2つのパラメータが一緒に変更されます.
RHE 6以降のnprocの修正は/etc/security/limits.d/90-nproc.conf中
接続数の制限を変更する方法:
一時的な変更(現在のshellでユーザーが開く可能なプロセス数を変更):
# ulimit -u xxx
永続的な修正、保険の方法は同時に/etc/security/limitsを修正することです.d/90-nproc.confおよび/etc/security/limits.confは以下の通りです.
limits_conf =/etc/security/limits.conf: * soft nproc s1 * hard nproc h1
nproc_conf =/etc/security/limits.d/90-nproc.conf: * soft nproc s2 * hard nproc h2
s 1,h 1,s 2,h 2は具体的に有意義な数である必要がある.このときulimit-uに表示される値は=min(h 1,h 2)
したがって、通常はs 1=s 2=h 1=h 2、例えばlimits_confとnproc_confに同時に追加:*soft nproc 65536*hard nproc 65536