MongoDB雑用
10426 ワード
MongoDB雑用。
昨日、オンライン上でmongoが一度故障し、クライアントが接続できなくなったり、クエリーが遅くなったりして、一日中復元できない問題を排除しましたが、この過程でmongoとpymongoについてもっと理解しました.
819接続数
ログを表示すると、次のログが多数表示されます.Getting connection refused because too many open connections: 819
dbを使用します.serverStatus().接続数を表示するには、次の手順に従います.> db.serverStatus().connections
{ "current" : 71, "available" : 748 }
current , available
このエラーの原因は、linuxの各プロセス1024個のファイルハンドル制限によるものです.現在のシステム制限を表示するには、ulimit-nまたはulimit-aを使用します.
ulmit-n 65535を使用すると、現在のsessionのファイルハンドル制限のみが変更され、システムの制限を変更するにはvim/etc/security/limitsが必要です.confは、下りのように追加されます.* soft nofile 65535
* hard nofile 65535
mongoのプロファイルもvim/etc/mongodbを変更する必要があります.conf maxConns=20000 #mongo 20000
ps.linuxシステムはサーバーとして一般的にいくつかの最適化を行う必要があります.ここでは、vim/etc/sysctlの一般的な最適化項目を示します.conf: net.ipv4.tcp_max_tw_buckets = 819200
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 819200
#net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 0
net.ipv6.conf.all.disable_ipv6 = 1
vm.swappiness=5
pymongo接続パラメータ
接続数が大きすぎる問題を解決するためにpymongoコードをひっくり返して、2つのオプションを発見して、起点の作用ができます
auto_start_request:Trueに設定すると、MongoClientはスレッドごとにsocketを割り当てます.これは比較的安全で、unacknowledgedが書いた後の読み取りも正しいことを保証します.Falseに設定すると、複数のスレッドがsocketを共有しますが、read-your-own-writes consistencyを保証するために単一のsocket上でシーケンス操作をしたい場合はstart_request/end_request. 詳細は以下を参照してください.http://emptysqua.re/blog/requests-in-python-and-mongodb/
use_Greenlets:Trueの場合、geventを使用する場合、このパラメータをTrue,start_に設定requestは、現在のgreenletが同じsocketを使用することを保証します.
mongostat
mongostatはとても使いやすい監視ツールです
$mongostat insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time
2 6 3 0 0 6 0 4.44g 13g 772m 0 0 0 0|0 0|0 3k 40k 71 16:12:48
10 13 13 1 0 18 0 4.44g 13g 775m 0 0.3 0 0|0 0|0 46k 29k 71 16:12:49
6 7 7 0 0 14 0 4.44g 13g 772m 0 0.2 0 0|0 0|0 7k 5k 71 16:12:50
0 0 0 0 0 1 0 4.44g 13g 772m 0 0 0 0|0 0|0 62b 1k 71 16:12:51
2 3 3 0 0 6 0 4.44g 13g 772m 0 0 0 0|0 0|0 3k 4k 71 16:12:52
47 32 54 2 0 66 0 4.44g 13g 776m 0 1.1 0 0|0 0|0 422k 160k 71 16:12:53
0 0 0 0 0 1 0 4.44g 13g 776m 0 0 0 0|0 0|0 62b 1k 71 16:12:54
8 10 10 0 0 19 0 4.44g 13g 776m 0 0.1 0 0|0 0|0 11k 8k 71 16:12:55
4 5 5 0 0 10 0 4.44g 13g 776m 0 0 0 0|0 0|0 5k 5k 71 16:12:56
0 0 0 0 0 1 0 4.44g 13g 776m 0 0 0 0|0 0|0 62b 1k 71 16:12:57
insert/query/update/delete:1秒あたりの挿入/クエリー/更新/削除数
getmore:クエリー時のカーソルのgetmoreオペランド
command:1秒あたりのコマンド数
flush:1秒以内のflushの回数、flushのオーバーヘッドはとても大きくて、もし頻繁にflushならば、原因を調べる必要があるかもしれません
mapped:mmapされたすべてのデータ量、単位はMB
vsize:仮想メモリ使用量
res:物理メモリ使用量
faults:毎秒アクセス失敗数(Linuxのみ)で、データが物理メモリに交換され、swapに格納されます.100を超えないでください.そうしないと、マシンのメモリが小さすぎて、頻繁にswapが書き込まれます.メモリまたは拡張機能をアップグレードする
locked:書き込みロックの占める時間比、この数値が大きすぎる(>10%)場合は注意が必要です
idx miss:インデックスがヒットしない割合です.通常、すべてのクエリはインデックスを通過する必要があります.
qr|qw ar|aw:mongo負荷が高い場合、コマンドが処理に間に合わず、mongoはコマンドをキューに入れます.qr|qwリード/ライト待ちキュー長ar|aw実行リード/ライト操作クライアント数
NetIn/netOut:出入りネットワーク帯域幅
conn:現在の接続数
mongo command
索引の表示/作成/削除db.collection.getIndexes();
db.collection.ensureIndex({x: 1})
db.collection.dropIndexes();
db.collection.dropIndex({x: 1})
バックグラウンドでインデックスを作成する(オンライン・データベースにインデックスを付けると、通常のアプリケーションに影響を与えないようにする)db.collection.ensureIndex({x: 1, y: 1}, {background: true});
インデックスの再構築(collectionサイズが大きく変更されたり、インデックスがスペースを消費しすぎたりした場合に実行)db.collection.reIndex();
データベース情報の表示db.stats();
サーバのステータスdb.serverStatus();
mongodbが現在実行中の操作db.currentOp()
もしあなたが操作が長すぎてデータベースをカードで殺すことに気づいたら、このコマンドで彼を殺すことができます.db.killOp("xxxx")
mongonメモリ
mongoは有名なメモリを食べて、空間の破片の問題は深刻で、今のところ良い方法はありません.
dbを使ってもいいです.repaireDatabase()はデータベースを整理して、とても遅くて、オンラインシステムは使いません.
システムメモリの表示free -m
total used free shared buffers cached
Mem: 15793 6879 8913 0 385 4102
-/+ buffers/cache: 2391 13401
Swap: 8183 0 8183
linuxで使用可能なメモリの計算方法はfree+buffers+cachedで、実際の使用メモリはused-buffers-cachedです.
MongoDBはメモリマッピングストレージエンジンを使用しており、データファイルをメモリにマッピングし、読み取り操作であればメモリ中のデータをキャッシュする役割を果たし、書き込み操作であればメモリはランダムな書き込み操作を順番の書き込み操作に変換することができ、とにかく性能を大幅に向上させることができる.MongoDBはメモリ管理の仕事に干渉するのではなく、これらの仕事をオペレーティングシステムの仮想メモリマネージャに残して処理するメリットは、MongoDBの仕事を簡素化することですが、悪いところは、MongoDBがどれだけのメモリを占めているかを簡単に制御する方法がありません.幸いなことに、仮想メモリマネージャの存在は私たちに多くの場合、この問題に関心を持つ必要はありません.
メモリ関連の詳細は次のとおりです.http://huoding.com/2011/08/19/107
Getting connection refused because too many open connections: 819
> db.serverStatus().connections
{ "current" : 71, "available" : 748 }
current , available
* soft nofile 65535
* hard nofile 65535
maxConns=20000 #mongo 20000
net.ipv4.tcp_max_tw_buckets = 819200
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 819200
#net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 0
net.ipv6.conf.all.disable_ipv6 = 1
vm.swappiness=5
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time
2 6 3 0 0 6 0 4.44g 13g 772m 0 0 0 0|0 0|0 3k 40k 71 16:12:48
10 13 13 1 0 18 0 4.44g 13g 775m 0 0.3 0 0|0 0|0 46k 29k 71 16:12:49
6 7 7 0 0 14 0 4.44g 13g 772m 0 0.2 0 0|0 0|0 7k 5k 71 16:12:50
0 0 0 0 0 1 0 4.44g 13g 772m 0 0 0 0|0 0|0 62b 1k 71 16:12:51
2 3 3 0 0 6 0 4.44g 13g 772m 0 0 0 0|0 0|0 3k 4k 71 16:12:52
47 32 54 2 0 66 0 4.44g 13g 776m 0 1.1 0 0|0 0|0 422k 160k 71 16:12:53
0 0 0 0 0 1 0 4.44g 13g 776m 0 0 0 0|0 0|0 62b 1k 71 16:12:54
8 10 10 0 0 19 0 4.44g 13g 776m 0 0.1 0 0|0 0|0 11k 8k 71 16:12:55
4 5 5 0 0 10 0 4.44g 13g 776m 0 0 0 0|0 0|0 5k 5k 71 16:12:56
0 0 0 0 0 1 0 4.44g 13g 776m 0 0 0 0|0 0|0 62b 1k 71 16:12:57
db.collection.getIndexes();
db.collection.ensureIndex({x: 1})
db.collection.dropIndexes();
db.collection.dropIndex({x: 1})
db.collection.ensureIndex({x: 1, y: 1}, {background: true});
db.collection.reIndex();
db.stats();
db.serverStatus();
db.currentOp()
db.killOp("xxxx")
free -m
total used free shared buffers cached
Mem: 15793 6879 8913 0 385 4102
-/+ buffers/cache: 2391 13401
Swap: 8183 0 8183