mongoDBの公式おすすめ設定、mongodb.conf、クエリチューニングなど

mongoDBの設定とかチューニングメモ。


maptail
画像は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


「色んなサーバー構成があるだろうけど、おおむね次のような設定がいい感じだよ」だそうです。


  1. -f (file size): unlimited
  2. -t (cpu time): unlimited
  3. -v (virtual memory): unlimited
  4. -n (open files): 64000
  5. -m (memory size): unlimited
  6. -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 までご連絡いただけますと助かります。


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール