MongoDB вылетает из — за исключения нехватки памяти

#mongodb #memory #out-of-memory #pymongo

#mongodb #память #из-за нехватки памяти #пимонго

Вопрос:

Я обрабатываю огромное количество данных в MongoDB, и в последнее время мой сервер, на котором размещается озеро данных, постоянно выходит из строя при обработке данных. Файлы журнала указывают на нехватку памяти со следующим сообщением об ошибке:

 [conn29] out of memory.  

Это странно, потому что на диске моего сервера все еще много места, поэтому я не понимаю, почему MongoDB вылетает с этой ошибкой. Ранее я запускал команду compact, чтобы освободить любое свободное пространство после завершения обработки. Возможно ли, что это просто каким-то образом постепенно отнимает место у MongoDB и возвращает его обратно в ОС, отсюда и исключение нехватки памяти? Как я могу отслеживать объем памяти, доступной для MongoDB?

Правка: Размер оперативной памяти моего сервера составляет около 8 ГБ. Я не делюсь MongoDB с другими приложениями. Размер кэша (с помощью команды db.serverStatus().wiredTiger.cache и выбора настроенного максимального количества байтов) составляет около 3,7 ГБ.

Файлы системного журнала MongoDB показывают следующее:

 2021-12-01T07:07:54.843 0000 I COMMAND [conn29] command nimbus.tmp.agg_out.55 command: renameCollection { renameCollection: "nimbus.tmp.agg_out.55", to: "nimbus.ACTIVITY_STAGE", dropTarget: true, $db: "admin" } numYields:0 reslen:38 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_msg 684ms 2021-12-01T07:07:55.146 0000 I COMMAND [conn29] command nimbus.ACTIVITY_STAGE command: aggregate { aggregate: "RMPlus", pipeline: [ { $match: { $and: [ { DATE_LOADED: "2021-11-30" }, { DATA_TYPE: "activities" } ] } }, { $unwind: { path: "$activities", preserveNullAndEmptyArrays: true } }, { $project: { activities.rowLevelSecurity: 0 } }, { $project: { activities.additionalRMs: 0 } }, { $addFields: { activities.DATA_TYPE: "$DATA_TYPE" } }, { $addFields: { activities.DATE_LOADED: "$DATE_LOADED" } }, { $addFields: { activities.FILE_NAME: "$FILE_NAME" } }, { $addFields: { activities.region: "$activities.rowLevelSecurity.region" } }, { $replaceRoot: { newRoot: "$activities" } }, { $project: { additionalRMCode: 0 } }, { $project: { activityTopics: 0 } }, { $project: { userParticipations: 0 } }, { $project: { entityParticipations: 0 } }, { $project: { rowLevelSecurity: 0 } }, { $project: { text: 0 } }, { $project: { textPreviewLong: 0 } }, { $unwind: { path: "$additionalRMCode", preserveNullAndEmptyArrays: true } }, { $group: { _id: { FILE_NAME: "$FILE_NAME", DATA_TYPE: "$DATA_TYPE", DATE_LOADED: "$DATE_LOADED" }, count: { $sum: 1 }, Values: { $push: "$ROOT" } } }, { $project: { Values.DATA_TYPE: 0, Values.DATE_LOADED: 0, Values.FILE_NAME: 0 } }, { $project: { DATA_TYPE: "$_id.DATA_TYPE", DATE_LOADED: "$_id.DATE_LOADED", FILE_NAME: "$_id.FILE_NAME", Values: 1, _id: 0, ROW_COUNT: "$count" } }, { $out: "ACTIVITY_STAGE" } ], allowDiskUse: true, cursor: {}, lsid: { id: UUID("c255f805-2156-42d4-8664-e2f851358570") }, $db: "nimbus", $readPreference: { mode: "primaryPreferred" } } planSummary: IXSCAN { DATE_LOADED: 1, DATA_TYPE: 1 } keysExamined:2293 docsExamined:2293 fromMultiPlanner:1 replanned:1 cursorExhausted:1 numYields:2301 nreturned:0 reslen:102 locks:{ Global: { acquireCount: { r: 6804, w: 2250, W: 1 } }, Database: { acquireCount: { r: 4551, w: 2248, W: 2 } }, Collection: { acquireCount: { r: 4550, w: 2247 } } } protocol:op_msg 306799ms 2021-12-01T07:31:03.274 0000 F - [conn29] out of memory. mongod.exe ...srcmongoutilstacktrace_windows.cpp(247) mongo::printStackTrace 0x67x mongod.exe ...srcmongoutilsignal_handlers_synchronous.cpp(361) ??? mongod.exe ...srcmongoutilallocator.cpp(46) mongo::mongoMalloc 0x25x mongod.exe ??? mongod.exe ???  

Там есть кое-что, что нуждается в контексте, но главный вывод заключается в том, что все выполняется по плану до тех пор, пока не будет сказано out of memory

Комментарии:

1. Может быть, стоит добавить, сколько общего объема оперативной памяти вашего сервера ? Делитесь ли вы своей базой данных с другими приложениями ? Каков размер вашего файла mongodb cacheSizeGB или содержимого файла mongodb.conf ?

2. Размер оперативной памяти моего сервера составляет около 8 ГБ. Я не делюсь MongoDB с другими приложениями. Размер кэша (с помощью команды db.serverStatus().wiredTiger.cache и выбора настроенного максимального количества байтов) составляет около 3,7 ГБ.

3. И каков размер вашей базы данных и индексы , а также когда возникает проблема с загрузкой процессора?

4. Размер базы данных составляет 40 ГБ. Когда приложение запущено, загрузка процессора составляет 55%, а загрузка оперативной памяти-около 33%. Есть ли способ зафиксировать загрузку процессора или оперативной памяти в том случае, если приложение выходит из строя в Windows?

5. какие-либо сообщения в средстве просмотра событий в Windows или в системном журнале mongod?

Ответ №1:

Файлы системного журнала MongoDB показывают следующее:

 2021-12-01T07:07:54.843 0000 I COMMAND [conn29] command nimbus.tmp.agg_out.55 command: renameCollection { renameCollection: "nimbus.tmp.agg_out.55", to: "nimbus.ACTIVITY_STAGE", dropTarget: true, $db: "admin" } numYields:0 reslen:38 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_msg 684ms 2021-12-01T07:07:55.146 0000 I COMMAND [conn29] command nimbus.ACTIVITY_STAGE command: aggregate { aggregate: "RMPlus", pipeline: [ { $match: { $and: [ { DATE_LOADED: "2021-11-30" }, { DATA_TYPE: "activities" } ] } }, { $unwind: { path: "$activities", preserveNullAndEmptyArrays: true } }, { $project: { activities.rowLevelSecurity: 0 } }, { $project: { activities.additionalRMs: 0 } }, { $addFields: { activities.DATA_TYPE: "$DATA_TYPE" } }, { $addFields: { activities.DATE_LOADED: "$DATE_LOADED" } }, { $addFields: { activities.FILE_NAME: "$FILE_NAME" } }, { $addFields: { activities.region: "$activities.rowLevelSecurity.region" } }, { $replaceRoot: { newRoot: "$activities" } }, { $project: { additionalRMCode: 0 } }, { $project: { activityTopics: 0 } }, { $project: { userParticipations: 0 } }, { $project: { entityParticipations: 0 } }, { $project: { rowLevelSecurity: 0 } }, { $project: { text: 0 } }, { $project: { textPreviewLong: 0 } }, { $unwind: { path: "$additionalRMCode", preserveNullAndEmptyArrays: true } }, { $group: { _id: { FILE_NAME: "$FILE_NAME", DATA_TYPE: "$DATA_TYPE", DATE_LOADED: "$DATE_LOADED" }, count: { $sum: 1 }, Values: { $push: "$ROOT" } } }, { $project: { Values.DATA_TYPE: 0, Values.DATE_LOADED: 0, Values.FILE_NAME: 0 } }, { $project: { DATA_TYPE: "$_id.DATA_TYPE", DATE_LOADED: "$_id.DATE_LOADED", FILE_NAME: "$_id.FILE_NAME", Values: 1, _id: 0, ROW_COUNT: "$count" } }, { $out: "ACTIVITY_STAGE" } ], allowDiskUse: true, cursor: {}, lsid: { id: UUID("c255f805-2156-42d4-8664-e2f851358570") }, $db: "nimbus", $readPreference: { mode: "primaryPreferred" } } planSummary: IXSCAN { DATE_LOADED: 1, DATA_TYPE: 1 } keysExamined:2293 docsExamined:2293 fromMultiPlanner:1 replanned:1 cursorExhausted:1 numYields:2301 nreturned:0 reslen:102 locks:{ Global: { acquireCount: { r: 6804, w: 2250, W: 1 } }, Database: { acquireCount: { r: 4551, w: 2248, W: 2 } }, Collection: { acquireCount: { r: 4550, w: 2247 } } } protocol:op_msg 306799ms 2021-12-01T07:31:03.274 0000 F - [conn29] out of memory. mongod.exe ...srcmongoutilstacktrace_windows.cpp(247) mongo::printStackTrace 0x67x mongod.exe ...srcmongoutilsignal_handlers_synchronous.cpp(361) ??? mongod.exe ...srcmongoutilallocator.cpp(46) mongo::mongoMalloc 0x25x mongod.exe ??? mongod.exe ???  

Там есть кое-что, что нуждается в контексте, но главный вывод заключается в том, что все выполняется по плану до тех пор, пока не будет сказано out of memory

Ответ №2:

раздел хранилища, в котором вы можете изменить кэшизегб, выглядит более или менее следующим образом:

 storage:  dbPath: lt;the data directorygt;  journal:  enabled: true  directoryPerDB: true  engine: wiredTiger  wiredTiger:  engineConfig:  cacheSizeGB: 2  

Комментарии:

1. После того, как я добавлю это, все, что мне нужно сделать, это перезапустить MongoDB?

2. да, это делается для постоянной настройки конфигурации

3. кстати , учитывая ваше предыдущее сообщение: «Нет, я не думаю , что хост-сервер настроен на использование подкачки памяти», я думаю, что для Windows вам необходимо настроить некоторую подкачку превентивно даже для серверов баз данных, которые не рекомендуется использовать, поскольку это влияет на производительность …

4. Я вижу, спасибо за помощь! Кстати, я изменил файл .cfg, но там написано Windows could not start MongoDB server on Local Computer . Я помещу содержимое файлов журнала в другой комментарий.

5. возможно , вам потребуется сохранить некоторые из предыдущих настроек , таких как порт, хост, сеть и т. Д