MongoDBをNUMAなマシンで使うときの注意

デュアル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 分のメモリでしょうかね。