2013-07-08 22 views
24

これは基本的な質問ですが、非常に重要です。MongoDBキャッシュシステムを理解してください

公式ドキュメントで私達は

のMongoDBはRAMで最近使用したデータのすべてを保持して読むことができます。クエリのインデックスを作成し、作業データセットがRAMに収まる場合、MongoDBはメモリからのすべてのクエリを処理します。あなたは、クエリのインデックスを作成しているし、あなたの作業データセットがRAMに収まる場合

私が理解することを確認していない部分が

ここで「インデックス」をどういう意味

です?

たとえば、私がモデルを更新した場合、私はそれを更新したので、今はRAMに入っているのでメモリから来ますが、これは私の考えではあまり明確ではありません。

質問するデータがメモリから来るかどうかを確認するにはどうすればよいですか?私は、MongoDBが空きメモリを使用して、その時点で無料のメモリに関するデータをキャッシュすることを理解していますが、誰かがさらにグローバルな振る舞いを説明できるでしょうか?

MongoDBキャッシュシステムを信頼するよりもデータを保管するノードサーバーで変数を使用するほうが良いでしょうか?

大量のトラフィックにMongoDBを使用する方法は、どのようにグローバルにアドバイスしていますか?

答えて

21

指標である正確かを理解するために開始するには良い場所:http://docs.mongodb.org/manual/core/indexes/

あなたは、彼らはとても良いですなぜあなたはもっと複雑なのいくつかを楽しみに飛ばし、しかし、udersandすることにブラッシュアップした後質問。

質問するデータがメモリから来るかどうかを確認するにはどうすればよいですか?

いずれのクエリでもyieldsフィールドを調べることもできます。explain()これは、データがRAMにないため、リーダーがロックを何回取得したかを示します。

さらに詳しい方法は、mongostatなどのプログラムを見ることです。これらのプログラムは、あなたのmongodで何ページフォールト(データがディスクからRAMにページングされる必要があるか)が起こっているかどうかを知らせます。

私は、MongoDBが空きメモリを使用して、その時点で無料のメモリに関するデータをキャッシュしていることを理解していますが、誰かがさらにグローバルな動作を説明できますか?

これは実際には間違っています。 MongoDBがこれをしていると言うだけでは簡単ですが、実際にはそうではありません。実際にはOSとそれ自身のページングアルゴリズム(通常はLRU)がMongoDBに対してこれを行います。 MongoDBは一定期間インデックスプランをキャッシュしますが、インデックスのチェックとテストを常に続ける必要はありません。

この場合、MongoDBキャッシュシステムを信頼するよりもデータを格納するノードサーバーで変数を使用する方が良いでしょうか?あなたはそれが動作することを期待する方法

わからない...私は、2つの全く異なることを行う意味し、そのVARへの起動時にアプリケーションにMongoDBのからあなたのデータを読み取るしようとするならば、私は間違いなくそれをお勧めしません。

さらに、メモリ管理のためのOSアルゴリズムは非常に成熟していて高速ですので、問題ありません。

大量のトラフィックにMongoDBを使用する方法は、どのようにグローバルにアドバイスしていますか?

ええと、これは大きな問題です。本当に私はあなたにこの件について少しお勧めしますが、ドキュメンテーションが述べるように、ワーキングセットがRAMに収まるようにする必要があります。ここで

は良い出発点である:What does it mean to fit "working set" into RAM for MongoDB?

5

MongoDBはコレクション全体をメモリに保存しようとします。つまり、各コレクションページをメモリマップします。すべてがメモリに格納されるには、データページとそれを参照するインデックスの両方をメモリに保持する必要があります。

MongoDBがレコードを返す場合は、メモリに保存されていることを確認してください(クエリがより前の場合は)。

MongoDBは、たとえばWebブラウザと同じ方法でレコードの「キャッシュ」を保持しません。変更をコミットすると、メモリとディスクの両方が更新されます。

Mongoは、greatであり、適切な使用例に一致した場合です。すべてをキャッシュするのに十分なサーバーメモリがあり、そのポイントをすばやく下回る場合は、非常にの高性能です。多くの大量のウェブサイトではMongoDBを使用しています。これはメモリがとても安いことです。

+0

「それメモリマップ各コレクションページは、」それはVirutalのメモリにコンテンツをマップRAMではない、彼らは2つの異なってものであり、これは人によって、このような一般的な間違いである、MongoDBはありますインメモリデータベースではありません! – Sammaye

+0

@Sammayeそれは仮想アドレスか物理アドレスかに関係なく、メモリアドレスにマップされます。アウトオブコアアドレスが参照されると、ページフォルトが発生し、そのディスクページが物理メモリに移動されます。 MongoDBは、あなたのサーバが持っているすべての物理メモリをかなり吸い取ってしまいます(OS自体や他のプロセスのために少しだけ予約しています)。 MongoDBを実行するには、利用可能な物理メモリがデータベースサイズを超えている必要があります。 – Curt

+0

OSが許可するので、メモリを吸います。しかし作業セットがRAMにロードされるのは、あなたの作業セットが小さければMongoDBは実際にはデータサイズよりもはるかに小さい少量しか使用しません。 – Sammaye

関連する問題