mongo 起動時のメモリ消費

1,089 views
Skip to first unread message

Ryuichiro Nishimura

unread,
Nov 23, 2014, 7:17:25 PM11/23/14
to mongo...@googlegroups.com
お世話になっております。

mongo のメモリ消費についてお伺いします。

すでに大量のデータが登録されている mongo を停止・起動で
再起動すると、起動だけで相当のメモリを消費しているようです。

たとえば、top コマンドで確認したところ、

VIRT : 4.5 GB
RES : 1.5GB
SHR : 1.3 GB

のような感じです。

このマシンは、8GB メモリのマシンで、1.5GB 程度であれば
まだ問題のないサイズなのですが、別のマシンでは、16GB
搭載で、起動だけで、RES 13GB とかになるものもあります。

このシステムでは、これから頻繁に insert が走るので、さらに
消費量は増えていく(ページアウト・インなどで調整はされま
すが)のですが、
そもそも起動時の状態では、どんな情報がメモリにロードされ
るんでしょうか。
データは起動だけではメモリに乗らないという記事をみたこと
があるので、メタ情報的なものがロードされてるんでしょうか。

insert でがんがんメモリが消費されていく mongo なので、せめ
て起動時点ではメモリに余裕をもたせたいと思っています。


Tetsutaro Watanabe

unread,
Nov 23, 2014, 7:55:35 PM11/23/14
to mongo...@googlegroups.com
渡部です。

> そもそも起動時の状態では、どんな情報がメモリにロードされ
るんでしょうか。

おそらくインデックスだと思われます。
MongoDBでメモリにロードされる主な物はインデックスとデータですが、
データは必要になったタイミングでOSのmmapの機能によりメモリにロードされます。

あと、そもそもメモリの「余裕」を気にされていますが、
メモリを使うこと自体は悪ではないです。コンピューティングリソースを有効に使えていると言えます。また、メモリが足りなくなればOS(mmap)によりmongodにメモリを与えなくなるようになるだけですので、メモリが使えなくて落ちるということはありません。

問題なのは、インデックスとよく使われるデータ(ホットデータといいます)がメモリに乗り切らなくなったときに、ディスクIOが発生して性能が劣化することです。

また、他のプロセスがメモリを使いたいのにmongodがメモリをとりすぎて問題になっているのであれば、そもそも他のプロセスをmonogdのマシンと同居させない用にした方がよいです。他のDBMSと同じく専用のマシンを用意してあげてください。


2014年11月24日 9:17 Ryuichiro Nishimura <nishimry...@gmail.com>:
> --
> このメールは Google グループのグループ「MongoDB JP」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mongodb-jp+...@googlegroups.com
> にメールを送信してください。
> このグループに投稿するには mongo...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/mongodb-jp からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Tetsutaro Watanabe

unread,
Nov 23, 2014, 8:26:53 PM11/23/14
to mongo...@googlegroups.com
渡部です。

> おそらくインデックスだと思われます。

と回答しましたが、自信がちょっとなくなってきました。
インデックスは初回ロードだった気がしますが、違うかもしれません。

ですが、他にMongoDBが使うデータで13Gも容量をしめる物がインデックス以外に思い当たりません。あとは、レプリケーションのoplogや、ジャーナリングのジャーナル、あたりですが、13Gにはならないと思います。

曖昧な回答で申し訳ありません。


2014年11月24日 9:55 Tetsutaro Watanabe <fet...@gmail.com>:

Ryuichiro Nishimura

unread,
Nov 23, 2014, 8:54:29 PM11/23/14
to mongo...@googlegroups.com
渡部さん、早速回答ありがとうございます。

>また、他のプロセスがメモリを使いたいのにmongodがメモリをとりすぎて問題になっているのであれば、そもそも他のプロセスをmonogdのマシンと同居させない用にした方がよいです。他のDBMSと同じく専用のマシンを用意してあげてください。 

もっともです。メモリ取りすぎへの対応として、capped collection にして必要以上に
大きな DB にしないようにするという対応も確認しているのですが、DB、コレクショ
ンの数がそれなりにあって、capped にしても結構なメモリ消費となるので、そういう
ことも考えると、やっぱり別マシンに持っていかないと、、、ということですね。
別サーバーにした時の通信パフォーマンスとかはきになるところではありますが。

今はどちらかというと、単一サーバー構成でどこまで対応できるかという方向から
確認をしているので、パフォーマンスに影響がでたポイント=複数構成への切り替え
ポイントとなるかもしれません。


2014年11月24日月曜日 10時26分53秒 UTC+9 Tetsutaro Watanabe:

Tetsutaro Watanabe

unread,
Nov 27, 2014, 7:21:59 AM11/27/14
to mongo...@googlegroups.com
渡部です。

その後ちょっと実機で試したところ、私の回答が間違っていることがわかりました。
MongoDBは起動直後にはデータファイルもインデックスもメモリにのせません。
両方ともDBのデータファイル内に存在し、mmapでメモリののせられるため、使われるまでメモリに乗りません。

すみません。

よって、

> 起動だけで、RES 13GB とかになるものもあります。

これはかなりおかしい状態です。起動だけであれば、データおよびインデックスはメモリに乗りません。本当ですか?



2014年11月24日 10:54 Ryuichiro Nishimura <nishimry...@gmail.com>:

Hiroaki Kubota

unread,
Nov 27, 2014, 8:47:13 AM11/27/14
to mongo...@googlegroups.com
> 起動だけで、RES 13GB とかになるものもあります。

そこまで行くのか解らないのだけど、動作だけ見ると、.ns だけマッピングしているように見えますね。

2014年11月27日 21:21 Tetsutaro Watanabe <fet...@gmail.com>:
このメールは Google グループのグループ「MongoDB JP」の登録者に送られています。

Ryuichiro Nishimura

unread,
Nov 27, 2014, 3:15:39 PM11/27/14
to mongo...@googlegroups.com
渡部さん

確認してもらってありがとうございます。
自分が怪しくなってきました。
確認します。

前回、journal 関連のこともご指摘もらっていますが、今の設定は、journal enabled=true
としてmongo を動かしているので、これも原因かと思います。
サイズがそこまで行くか、という疑問もありますが、コレクション数が1,000 近くあるの
で、積もり積もって、ということがあるかも。

あとで報告します。

2014年11月27日木曜日 21時21分59秒 UTC+9 Tetsutaro Watanabe:

Ryuichiro Nishimura

unread,
Nov 27, 2014, 4:07:50 PM11/27/14
to mongo...@googlegroups.com
ありがとうございます。

.ns のマッピングですね。
確認してみます。

いま怪しいと教えてもらったもの。
・.ns
・journal


2014年11月27日木曜日 22時47分13秒 UTC+9 crumbjp:

Ryuichiro Nishimura

unread,
Dec 11, 2014, 5:33:02 PM12/11/14
to mongo...@googlegroups.com
DB 数などを替えていろいろと試してみました。

initial で数十MB の消費がある分は除いて、やはり、起動時に、namespace
を読み込んでいるような結果でした。

現在 namepsace サイズを 16MB (=デフォルト) にしており、DB を増やすごと
に、ほぼこの分が top コマンドの RES の部分に反映されていました。

13GB とかあったのは、このインスタンスには、DB が 800-900 程度登録されて
いて、これに 16MB を掛けると、ほぼこの値になった、という感じでした。

初期にメモリにロードされたとしても、使われなければ追い出されるまでと考えれ
ば、あまり気にすることはないのかもしれませんが、DB を多くすると、こうなって
しまうんだな・・・、という感じです。

1DB 1 コレクション 2 インデックスくらいの感じで DB を作っているので、name
space サイズを小さくするということも考えられるのですが、デフォルトから下げ
る、というのが心配だったので、まだ確認はできていません。

これって、特に問題はないんでしょうか。


2014年11月28日金曜日 6時07分50秒 UTC+9 Ryuichiro Nishimura:

Hiroaki Kubota

unread,
Dec 14, 2014, 7:23:37 AM12/14/14
to mongo...@googlegroups.com

やはり、、因みに私は4MBにしてます。
DBを分ける方針に纏わる問題なので、なるべく小さくして良いかと。

また、スワップアウトを期待するのは危険かもしれません。
どう挙動するのか実験が必要ですね。

2014/12/12 7:33 "Ryuichiro Nishimura" <nishimry...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages