mongoDBの設定とかチューニングメモ。
おすすめのCPU・メモリ・プロセス数の設定
いきなりおすすめ設定の紹介からです。なんとmongoDB公式ページに、おすすめの設定がもろに書いてあります。
Every deployment may have unique requirements and settings; however, the following thresholds and settings are particularly important for mongod and mongos deployments
- mongoDB Linux ulimit Settings
「色んなサーバー構成があるだろうけど、おおむね次のような設定がいい感じだよ」だそうです。
- -f (file size): unlimited
- -t (cpu time): unlimited
- -v (virtual memory): unlimited
- -n (open files): 64000
- -m (memory size): unlimited
- -u (processes/threads): 32000
mongoDBの現在の設定は下記のコマンドで見れます。
$ cat /proc/[mongoDB's process id]/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 1024 1024 processes Max open files 12000 12000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 4585 4585 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Soft Limit/Hard Limit
Softは一般ユーザが変更できる上限値で、Hardはrootが変更できる 上限値、らしいです。(参考) 一般ユーザーだと、Hardの値を下げることはできても、上げることはできません。ただ、OSとかの構成によっては一般ユーザーでもHardの値を上げ下げできます。
ログインユーザーの設定は下記のコマンドで見れます。
$ 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) 4585 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
ulimitの設定項目とかそれに類似する設定は、/etc/security/limits.conf、PAM認証、ログインユーザー、su、sudo、自動起動デーモン、手動起動デーモン、などなど色々な条件が絡んで複雑なので、ぱっと説明することができません。
mongoDBが現在どういう設定で動いているのかは、/proc/[mongoDB's process id]/limits を見れば分かるので、mongoDB公式おすすめの設定と突き合わせながら試行錯誤しましょう。
一度設定を変えたらmongoDBを再起動しないと有効にならない点に注意。
ちなみに、デフォルトの設定ででかいデータを扱うと、OOM-Killerからプロセスを強制終了されたりします。
mongoDBモニタリングツール
ざっくり言うと、mongostat が手軽です。
$ mongostat connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time 0 0 0 0 0 1 0 0m 128m 28m 0 local:0.0% 0 0|0 0|0 62b 1k 1 23:36:26 0 0 0 0 0 1 0 0m 128m 28m 0 local:0.0% 0 0|0 0|0 62b 1k 1 23:36:27 0 0 0 0 0 1 0 0m 128m 28m 0 local:0.0% 0 0|0 0|0 62b 1k 1 23:36:28 0 0 0 0 0 1 0 0m 128m 28m 0 local:0.0% 0 0|0 0|0 62b 1k 1 23:36:29
mongoDBのコンソールから db.serverStatus() を実行すると色々な情報が分かります。
他にも便利なツールはたくさんあるみたいなので詳しくはこの公式ドキュメントを見てください。
mongoDB Monitoring Database Systems
/etc/mongodb.confの設定
シャーディング(水平分散)をせずにローカルホストでほそぼそと使うなら特にいじる必要はないようです。
スロークエリを探したり、詳細なログを落としてバグ調査するとき用の設定とかがあります。
公式ドキュメントはこちら
mongoDB Run-time Database Configuration
クエリ等のチューニング
インデックスを使おう、クエリにlimitをつけよう、必要なデータのみ取得しよう、DBプロファイラーでパフォーマンスを計測しよう、explainでクエリが適切にインデックスを使うか調べよう、みたいな。
公式ドキュメントはこちら
Optimization Strategies for MongoDB Applications
まとめ
ざっくり言うと、個人がそこそこのアクセス数のサイトを運営するだけなら、デフォルトの設定のままでだいたいOKのようです。大きいデータを扱うなら搭載しているメモリ量を増やす、同時アクセスが多いなら最大プロセス利用可能数を増やす、くらい。
間違いのご指摘等は @ts_3156 までご連絡いただけますと助かります。