読者です 読者をやめる 読者になる 読者になる

UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

MongoDBでのメモリーリークへの対処法

MongoDBはメモリーを食う

実際にデフォルトの設定でMongoDBを運用しているとOSの割り当てたメモリをほぼ使い切っているようで、ほかのプロセスのメモリーリークを頻繁に引き起こしています。

https://docs.mongodb.com/v3.2/reference/program/mongod/#cmdoption--wiredTigerCacheSizeGB

公式には以下のようなことが書いてあります。

With WiredTiger, MongoDB utilizes both the WiredTiger internal cache and the filesystem cache.

WiredTigerを利用して、MongoDBはWiredTigerの内部キャッシュとファイルシステムキャッシュの両方を使用します。

Changed in version 3.2: Starting in MongoDB 3.2, the WiredTiger internal cache, by default, will use the larger of either:60% of RAM minus 1 GB, or 1 GB.

バージョン3.2からはは1GBまたは全メモリのうち60%から1GBを引いた分のメモリを使用します。

Via the filesystem cache, MongoDB automatically uses all free memory that is not used by the WiredTiger cache or by other processes. Data in the filesystem cache is compressed.

ファイルシステムのキャッシュを経由して、MongoDBはWiredTigerキャッシュとほかのプロセスに試用されていないすべてのメモリを自動的に使用します。ファイルシステムキャッシュのデータは圧縮されます。

メモリ使用量を制限したい

MongoDBのストレージエンジンのWiredTigerはメモリ使用量の上限を設定することができます。それは簡単でMongoDBのインスタンスの起動時にオプションの--wiredTigerCacheSizeGBを利用すればよいのです。

メモリ使用量を最大2GBに制限する例

mongod --wiredTigerCacheSizeGB 2

このオプションでは1GB単位での指定ができます。 つまり最低でもプロセス1つあたり1GBは消費すると考えていいでしょう。

最低でも2GBは欲しい

当然ですがデータベースはアプリケーションと連携して動かすのが通常だと思います。同一マシン上で動かす場合ももちろんですが、データベースサーバーとして単独で運用する場合も余裕をもって最低2GBは確保すべきでしょう。MongoDBは一般的にメモリが積めば積むほど性能は向上していくので、できる限りメモリの多い環境で使用すべきです。

実際にメモリ使用量を確認する。

MongoDBのREPLを使用してメモリ使用量を確認することができます。

mongo

次にadminモードに切り替えます。

use admin

そして以下のコマンドを入力できます。

> db.serverStatus().mem
{
    "bits" : 64,
    "resident" : 48,
    "virtual" : 292,
    "supported" : true,
    "mapped" : 0,
    "mappedWithJournal" : 0
}

residentには物理メモリの割り当てが、virtualには仮想メモリの割り当てが、MB単位で対応しています。