【发布时间】:2022-01-08 00:51:23
【问题描述】:
我在 MongoDB 中处理大量数据,最近我托管数据湖的服务器在数据处理完成时不断崩溃。日志文件表明内存不足,并显示以下错误消息:
[conn29] out of memory.
这很奇怪,因为我的服务器磁盘上还有很多空间,所以我很困惑为什么 mongoDB 会因为这个错误而崩溃。以前,我一直在运行 compact 命令以在处理完成后回收任何可用空间。这是否可能只是以某种方式逐渐从 mongoDB 中占用空间并将其返回给操作系统,从而导致内存不足异常?如何监控 mongoDB 的可用内存量?
编辑:
我的服务器的 RAM 大小约为 8GB。我不与其他应用程序共享 mongoDB。缓存大小(使用命令db.serverStatus().wiredTiger.cache 并选择配置的最大字节数)约为 3.7GB。
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 ...\src\mongo\util\stacktrace_windows.cpp(247) mongo::printStackTrace+0x67x
mongod.exe ...\src\mongo\util\signal_handlers_synchronous.cpp(361) ???
mongod.exe ...\src\mongo\util\allocator.cpp(46) mongo::mongoMalloc+0x25x
mongod.exe ???
mongod.exe ???
那里有些东西需要上下文,但主要的收获是一切都按计划执行,直到它显示out of memory
【问题讨论】:
-
最好补充一下您的服务器总 RAM 大小是多少?您是否与其他应用程序共享您的数据库?您的 mongodb cacheSizeGB 的大小或您的 mongodb.conf 文件的内容是多少?
-
我服务器的 RAM 大小约为 8GB。我不与其他应用程序共享 mongoDB。缓存大小(使用命令
db.serverStatus().wiredTiger.cache并选择配置的最大字节数)约为 3.7GB。 -
您的数据库大小和索引是多少,当问题发生时,cpu 负载如何?
-
数据库大小为40GB。当应用程序运行时,CPU 负载为 55%,RAM 负载约为 33%。有没有办法在应用程序在 Windows 上失败的确切实例中捕获 CPU 或 RAM 负载?
-
windows 的事件查看器或 mongod 系统日志中的任何消息?
标签: mongodb memory out-of-memory pymongo