デュアルCPUで計12コア24スレッド、メモリ48GBというマシンで MongoDB-2.0.8 をしばらく稼働させたところ、突然 CPU の system time が1コア分暴走したようになる、という現象が起きました。
最初は原因がよく分からず、とりあえず mongod のプロセスを kill して起動し直したら復旧したのですが、またしばらくすると同じ現象に。
mongoのメモリ使用量と Load Average をプロットしてみると、どうもある程度 (約24GB?) のメモリを使ったところで暴走が起きているような……とログを見直してみると、起動時に WARNING がでていました。
Sun Jan 20 00:10:01 [initandlisten] MongoDB starting : pid=12669 port=27017 dbpath=/var/lib/mongo 64-bit host=mng-log04 Sun Jan 20 00:10:01 [initandlisten] Sun Jan 20 00:10:01 [initandlisten] ** WARNING: You are running on a NUMA machine. Sun Jan 20 00:10:01 [initandlisten] ** We suggest launching mongod like this to avoid performance problems: Sun Jan 20 00:10:01 [initandlisten] ** numactl --interleave=all mongod [other options] Sun Jan 20 00:10:01 [initandlisten] Sun Jan 20 00:10:01 [initandlisten] ** WARNING: /proc/sys/vm/zone_reclaim_mode is 1 Sun Jan 20 00:10:01 [initandlisten] ** We suggest setting it to 0 Sun Jan 20 00:10:01 [initandlisten] ** http://www.kernel.org/doc/Documentation/sysctl/vm.txt Sun Jan 20 00:10:01 [initandlisten] Sun Jan 20 00:10:01 [initandlisten] db version v2.0.8, pdfile version 4.5 Sun Jan 20 00:10:01 [initandlisten] git version: a340a57af7cdda865da420704e1d1b2fac0cedc2
本家のドキュメントにも書いてありました。MongoDB on NUMA Hardware
NUMAのハードウェアで動かす場合は以下の通り設定せよ、とのこと。
- numactl --interleave=all mongod [オプション] で起動する
- /proc/sys/vm/zone_reclaim_mode を 0 にする
この設定をして起動したところ、メモリ使用量が29GBを超えても今のところ問題ないようです。2 CPUで 48GBなので、暴走する閾値の24GBというのは 1 CPU 分のメモリでしょうかね。