MongoDB MongoError:内存不足

MongoDB MongoError:内存不足

我有一个新安装的 MongoDB 服务器,运行在 AWS Ubuntu EC2 上。该服务器上没有安装任何其他东西。数据库当前包含 35 个文档,每个文档 3 MB,这意味着数据量小于 110 MB。

我正在运行一个包含 2 个阶段的聚合查询:一个简单的 $match 阶段,确保仅聚合 31 个文档,以及一个包含 $accumulator 的 $group 阶段(该阶段不会分配太多新空间,即使分配了,我预计在处理 3 MB 文档时也不会分配太多)。查询的结果应该是单个 3 MB 文档,它是上述所有内容的合并。

当仅存在 3 个文档时运行查询 - 顺利完成。但当存在 35 个文档时 - 我总是收到以下错误:

MongoError: Out of memory
    at MessageStream.messageHandler (/app/node_modules/mongodb/lib/cmap/connection.js:268:20)
    at MessageStream.emit (events.js:314:20)
    at processIncomingData (/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
    at MessageStream._write (/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
    at writeOrBuffer (_stream_writable.js:352:12)
    at MessageStream.Writable.write (_stream_writable.js:303:10)
    at Socket.ondata (_stream_readable.js:717:22)
    at Socket.emit (events.js:314:20)
    at addChunk (_stream_readable.js:307:12)
    at readableAddChunk (_stream_readable.js:282:9)

/etc/mongod.conf:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,<IP>



# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:
    authorization: "enabled"

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

我在网上读了很多但无法解决,我尝试过:

  1. 将服务器硬件升级到 t2.large(8 GB RAM)。
  2. 添加allowDiskUse到查询:
const options = {
  allowDiskUse: true,
  // explain: true,
}
mongoConn.db(dbConfig.database).collection(collection).aggregate(aggregationPipeline, options).toArray((err: MongoError, result: any) => {
  1. 使用htop,我可以看到重新启动 MongoDB 后的总内存使用量210M/7.68G,并且在查询期间它会攀升到 的峰值691M/7.68G,然后失败,然后保持在 的状态627M/7.68G在此处输入图片描述

  2. db.enableFreeMonitoring()可以看到虚拟内存使用量恒定为 2 GB,峰值达到 2.1 GB: 图像

  3. 的结果db.serverStatus().tcmalloc.tcmalloc.formattedString在此处输入图片描述

  4. 的结果db.serverStatus().mem在此处输入图片描述

摘要:我知道 MongoDB 有 100MB 的内存限制,但我猜想 3 MB 的文档不应该达到这个限制allowDiskUse。我在这里遗漏了什么?

相关内容