MongoDBのマニュアルにはwiredTigerCacheSizeGBという設定項目があり、これを使えばWiredTigerがキャッシュに使うメモリサイズを制限してできるものなのだが、単位がGBであり1GB未満の値は割り当てられない。
しかし裏オプションを使えば、任意の値を指定できるのことを発見してしまったので、紹介する。
やりかた
「--wiredTigerEngineConfigString」という裏オプションを使って、以下の様にmongodにWiredTigerの設定文字列を直接指定する。
例) 100Mに設定
$ mongod --dbpath data --wiredTigerEngineConfigString='cache_size=100M'
実験
本当に100Mで制限できたか調査してみる。MongoDB 3.4.1を利用した。
まずは、起動直後にmongostatを起動してみる。
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 211b 44.6k 3 Jan 10 01:17:15.045
*0 *0 *0 *0 0 6|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 721b 68.5k 3 Jan 10 01:17:16.045
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 158b 44.6k 3 Jan 10 01:17:17.045
物理メモリ量(res)をみるとは最初は43Mであり、これはMongoDB本体が使ってるメモリ量である。
そこでデータを挿入していく
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 6|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 664b 68.4k 3 Jan 10 01:17:18.045
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 158b 44.7k 3 Jan 10 01:17:19.043
*0 *0 *0 *0 0 6|0 0.0% 0.0% 0 260M 43.0M 0|0 0|0 664b 68.5k 3 Jan 10 01:17:20.042
24076 *0 *0 *0 0 2|0 8.1% 21.5% 0 311M 73.0M 0|0 0|0 31.1m 45.8k 3 Jan 10 01:17:21.039
36009 *0 *0 *0 0 6|0 4.9% 50.2% 0 343M 103M 0|0 0|0 46.6m 70.0k 3 Jan 10 01:17:22.039
39980 *0 *0 *0 0 1|0 8.4% 85.1% 0 371M 132M 0|0 0|0 51.7m 46.4k 3 Jan 10 01:17:23.039
39003 *0 *0 *0 0 6|0 3.4% 62.7% 0 381M 142M 0|0 0|0 50.4m 70.2k 3 Jan 10 01:17:24.039
27936 *0 *0 *0 0 1|0 7.9% 64.6% 0 381M 143M 0|0 0|0 36.1m 45.8k 3 Jan 10 01:17:25.041
30034 *0 *0 *0 0 6|0 6.8% 81.1% 0 381M 143M 0|0 0|0 38.8m 69.8k 3 Jan 10 01:17:26.040
35003 *0 *0 *0 0 2|0 6.2% 75.0% 0 383M 144M 0|0 0|0 45.3m 46.2k 3 Jan 10 01:17:27.040
すると、どんどん物理メモリ量は増えていくが、143M付近で頭打ちとなった。つまり MongoDB本体のメモリ使用量43M + WiredTigerキャッシュ100M で143Mだ。
うまく動いているようだ。
さいごに
注意してほしいのは、これは公式にはない裏オプションで、WiredTigerに設定文字列を直接渡すというハックなので、WiredTigerに自信が無い人は本番環境では絶対に使わないでください。私も使いません。