2

MongoDB で GridFS を使用して、将来のアプリケーション用にファイルを保存できるかどうかを確認するために、いくつかのテストを行っています。10gen の C# ドライバーを使用して、80Mb ファイルをデータベースに「アップロード」しています。

最初の追加は問題なく、約 3 秒かかりましたが、私のテスト マシンではそれほど悪くはありません。ただし、同じファイルを後で追加すると、さらに時間がかかり、最大 30 秒かかりました。最終的に MongoDB は、メモリが不足してクラッシュしたことを通知しました。

サイズが 80Mb の 10 個のファイルを追加すると、システムがクラッシュする前に dbaseName.0 から dbaseName.7 という名前のデータベース用に 8 つのファイルが作成され、ファイル サイズはファイル 0 から 5 まで 16Mb から 512Mb に指数関数的に増加し、ファイル 6 と 7 は両方とも512メガバイト。

これらのファイルは 2Gb 弱になります。明らかに、ファイルを 10 回追加すると、dbase が 2Gb を超えます。これは、私の 32 ビット テスト バージョンの制限を超えています。

800Mb 相当のファイルを保存すると 2Gb を超えるのはなぜですか? どこかに見逃した設定はありますか?

MongoDB は GridFS 全体を常に RAM に保持しますか? もしそうなら、ディスクのポイントは何ですか?実稼働サーバーに 32Gb の RAM しかない場合、GridFS に 32Gb のみを保存できますか?

私はMongoGridFSオブジェクトでEnsureIndexesを使用し、GridFS用にインデックスが作成されたことを示すデータベースをチェックしたので、Mongoはデータストア全体をRAMに収めようとするべきではありませんか?

MongoDB はすべてのニーズに適合しますが、大きなファイル コレクションを保持できるようにする必要があります。明らかな何かが欠けていますか?

スタックトレース:

Mon Oct 15 11:57:15 [conn15] insert busyNow.fs.chunks keyUpdates:0 locks(micros) w:112892 113ms
Mon Oct 15 11:57:15 [conn15] MapViewOfFileEx for /data/db/busyNow.7 failed with errno:8 Not enough storage is available to process this command. (file size is 536608768) in MemoryMappedFile::map

Mon Oct 15 11:57:15 [conn15]  busyNow.fs.chunks Fatal Assertion 16166
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\assert_util.cpp(124)                               mongo::fassertFailed+0x75
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\mmap_win.cpp(211)                                  mongo::MemoryMappedFile::map+0x4ce
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\mongommf.cpp(182)                                    mongo::MongoMMF::create+0xa3
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(469)                                      mongo::MongoDataFile::open+0x141
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(280)                                    mongo::Database::getFile+0x34f
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(332)                                    mongo::Database::suitableFile+0x129
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\database.cpp(359)                                    mongo::Database::allocExtent+0x41
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1271)                                     mongo::outOfSpace+0x107
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1293)                                     mongo::allocateSpaceForANewRecord+0x5d
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1463)                                     mongo::DataFileMgr::insert+0x493
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\pdfile.cpp(1217)                                     mongo::DataFileMgr::insertWithObjMod+0x33
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(761)                                    mongo::checkAndInsert+0x72
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(821)                                    mongo::receivedInsert+0x4cd
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\instance.cpp(434)                                    mongo::assembleResponse+0x62a
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\db\db.cpp(192)                                          mongo::MyMessageHandler::process+0xe8
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\mongo\util\net\message_server_port.cpp(86)                    mongo::pms::threadRun+0x424
Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\third_party\boost\boost\thread\detail\thread.hpp(62)          boost::detail::thread_data<boost::_bi::bind_t<void,void (__cdecl*)(mongo::MessagingPort *),boost::_bi::list1<boost::_bi::value<mongo::MessagingPort *
> > > >::run+0x9Mon Oct 15 11:57:17 [conn15] mongod.exe  ...\src\third_party\boost\libs\thread\src\win32\thread.cpp(16707566)  boost::`anonymous namespace'::thread_start_function+0x47
Mon Oct 15 11:57:17 [conn15] mongod.exe  f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c(314)                _callthreadstartex+0x1b
Mon Oct 15 11:57:17 [conn15] mongod.exe  f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c(292)                _threadstartex+0x64
Mon Oct 15 11:57:17 [conn15]

***aborting after fassert() failure


Mon Oct 15 11:58:33 [initandlisten] connection accepted from 127.0.0.1:56308 #16 (3 connections now open)
4

2 に答える 2

5

Ok; 多くの検索の後、MongoDB は、各ファイルが 2G になると、最大 2Gb の指数サイズのファイルにスペースを事前に割り当てているようです。

http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

私のテスト プログラムは、バックグラウンド ファイル (.0 - .7 など) 内に 80Mb ファイルを追加し、データ チャンクが最後のファイルに書き込まれ始めると、Mongo は最後のファイルより指数関数的に大きい別のファイルを事前に割り当てます。

したがって、最初の 80Mb ファイルが 16Mb ファイル、32Mb ファイル、および 64Mb バックグラウンド ファイルでいっぱいになり、メタデータが原因で、もう少し多くのスペースを占有し、128Mb ファイルにわずかに侵入する必要があります。これにより、mongo は合計 256Mb ファイルを事前に割り当てます。 496MB; より多くのファイルが追加されると、より多くのファイルが事前に割り当てられ、テスト マシンで 2Gb に達すると、Mongo はスペースにアクセスできず、崩壊します。

そのため、1 つの 80Mb ファイルが本来よりも多くのスペースを占有しているように見えますが、これは遠回しに理にかなっています。

これは --noprealloc を指定して mongod を実行することでオフにできますが、これはテスト マシンにのみ推奨されます。

返信ありがとうございます。

于 2012-10-16T10:23:37.630 に答える
0

GridFS はすべてのファイルを RAM にのみ格納するわけではありません。

スタックトレースがありますか、それともクラッシュを再現できますか?

于 2012-10-15T11:40:44.020 に答える