#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. возможно , вам потребуется сохранить некоторые из предыдущих настроек , таких как порт, хост, сеть и т. Д