MongoDB MongoError : Out of memory

标签 mongodb ubuntu memory out-of-memory

我有一个新安装的 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:

我在网上看了很多都无法解决,我试过了:
  • 将服务器的硬件升级到 t2.large(8 GB RAM)。
  • 添加 allowDiskUse到查询:

  • const options = {
      allowDiskUse: true,
      // explain: true,
    }
    mongoConn.db(dbConfig.database).collection(collection).aggregate(aggregationPipeline, options).toArray((err: MongoError, result: any) => {
    
  • htop ,我可以看到210M/7.68G的总内存使用量重新启动 MongoDB 后,在查询期间它攀升至 691M/7.68G 的峰值,失败,并保持在 627M/7.68G之后。
    enter image description here
  • db.enableFreeMonitoring()我可以看到恒定的 2 GB 虚拟内存使用量,峰值为 2.1 GB:
    image
  • db.serverStatus().tcmalloc.tcmalloc.formattedString 的结果:
    enter image description here
  • db.serverStatus().mem 的结果:
    enter image description here

  • 摘要:我知道 MongoDB 有 100MB 的内存限制,但我想它不应该用 3 MB 的文档来达到它,并且 allowDiskUse .我在这里想念什么?

    最佳答案

    我不确定这里到底发生了什么,但考虑到 100MB 的限制,3MB*35docs = 105MB 是可疑的。

    关于MongoDB MongoError : Out of memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64193318/

    相关文章:

    mongodb - 无法连接到工作的Dockerized Mongo ReplSet

    ubuntu - wkhtmltopdf 带有快速错误

    c++ - C++ OpenMP 代码中的内存泄漏

    database - 更改了 MongoDB 端口但仍尝试默认端口

    java - 如何捕获 MongoSecurityException?

    PyCharm 中的 Python 错误消息 : Unable to attach to shared memory segment

    c - 分析C程序的内存使用情况

    PHP数组操作时内存使用突然增加

    mongodb - MongoDB中聚合($match)和查找之间的区别?

    php - 在 PHP cli 脚本中更改用户的当前目录