【发布时间】:2021-01-19 09:58:50
【问题描述】:
我有一个新安装的 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,我可以看到重启MongoDB后210M/7.68G的总内存使用量,在查询过程中它攀升到691M/7.68G的峰值,失败,之后保持在627M/7.68G。 -
使用
db.enableFreeMonitoring(),我可以看到恒定的 2 GB 虚拟内存使用量,峰值为 2.1 GB:
总结:我知道 MongoDB 有 100MB 的内存限制,但我猜它不应该用 3 MB 的文档达到它,allowDiskUse。我在这里错过了什么?
【问题讨论】:
-
将硬件更改为 t3.xlarge(16GB RAM)也没有解决问题
-
从 mongo shell 运行聚合并查看服务器日志是否有错误。
标签: mongodb ubuntu memory out-of-memory