私はmongo dbをテストしています。3 つのコレクションがあり、そのうちの 1 つはユーザー コレクションで、1,000 万のドキュメントがあります。コレクションのインデックス作成後、クエリに約 0.002 ミリ秒かかります。とにかく、ボックスを再起動した後-ubuntu 12.04-同じクエリには約200ミリ秒かかります。これは、コレクションにインデックスがなかったかのようです。これは、ボックスを再起動した後の mongodb の通常の動作ですか? 起動時にインデックスを RAM にロードする方法はありますか?
1 に答える
通常の MongoDB の動作では、アプリケーションで使用されるようにデータとインデックスをメモリにページングし、何をページアウトするかの決定はオペレーティング システムのメモリ管理に任せます。アプリケーションで通常使用されるデータとインデックスは、「ワーキング セット」と呼ばれます。
しばらく稼働しているmongod
サーバーは、すでにメモリ内に自然なワーキング セットを持っているはずなので、この影響を理解していない限り、毎晩のデータ/インデックスのリロードをスケジュールする必要はありません (またはしたくありません)。
サーバーを「予熱」して適切なデータをメモリにロードするには、いくつかの異なるシナリオがあります。
注: 注意して使用してください
一般に、これらのアプローチは、夜間ではなく「コールド サーバー」(つまり、最初の起動時) でのみ使用する必要があります。データとインデックスが MongoDB で使用できるメモリよりも大きい場合、有用なデータまたはインデックスを簡単にスワップアウトしてしまう (そしてパフォーマンスに悪影響を与える) 可能性があります。また、使用頻度の低いデータやインデックスを強制的に RAM にロードすることで、必要以上のメモリを使用することになります。
シナリオ #1: 特定のコレクションのすべてのデータまたはインデックスをロードする
touch
MongoDB 2.2+ では、このコマンドを使用して、コレクションのすべてのデータまたはインデックスをディスクからメモリにロードできます。これは、コレクションの完全なデータまたはインデックスを操作する必要があり、これらを格納するための利用可能なメモリがある場合に役立ちます。
シナリオ #2: 現在のワーキング セットに基づいてサブセットを読み込む
現在の作業セットに対応するデータのサブセットをロードしたい場合は、いくつかのクエリを実行してデータベースを「ウォームアップ」することができます。Parse の開発者は、現在の操作をサンプリングして再生することにより、より具体的な予熱を提供するのに役立ついくつかのユーティリティをオープンソース化しました: MongoDB セカンダリのウォームアップのためのテクニック.
シナリオ #3: アプリケーションの一般的なクエリを実行してプリロードする
アプリケーションの一般的なクエリのセットを実行できます。これにより、コレクションまたは現在の操作のサンプルの「すべて」のデータ/インデックスと比較して、より現実的なワーキング セットが読み込まれる可能性があります。