下面从 系统层面、MongoDB 配置、索引、查询、写入、监控 几个角度,系统性讲一下 Ubuntu 上 MongoDB 的调优思路(以 MongoDB 4.x/5.x/6.x 通用为主)。
MongoDB 官方强烈建议关闭 THP:
sudo echo never > /sys/kernel/mm/transparent_hugepage/enabled
sudo echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效(Ubuntu):
sudo systemctl edit mongod
添加:
[Service]
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
编辑 /etc/security/limits.conf:
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0
路径通常是 /etc/mongod.conf
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 根据内存调整,不超过物理内存50%
storage:
journal:
enabled: true
高写入场景可适当调整:
systemLog:
verbosity: 0
net:
maxIncomingConnections: 65536
wireObjectCheck: false
db.setProfilingLevel(1, 100) // >100ms 记录
db.system.profile.find().sort({ts:-1}).limit(10)
或配置:
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
db.orders.createIndex({ user_id: 1, created_at: -1 })
原则:
db.orders.find(
{ status: "paid" },
{ _id: 0, user_id: 1, amount: 1 }
)
需要:
db.orders.createIndex({ status: 1, user_id: 1, amount: 1 })
db.orders.find({ $where: "this.amount > 100" }) // ❌
✅ 改为:
db.orders.find({ amount: { $gt: 100 } })
db.orders.insertMany([...])
db.orders.find({}, { name: 1, price: 1 })
secondaryreadPreference=secondary
mongostat
mongotop
db.orders.find({ user_id: 1 }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅totalKeysExamined vs totalDocsExamined| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 | 建索引 |
| 磁盘 IO 高 | 全表扫描 | 优化查询 |
| 内存高 | 缓存小 | 增大 cacheSizeGB |
| 写入慢 | journal | SSD |
| 连接爆 | ulimit | 调整 limits |
如果你愿意,可以告诉我:
我可以给你 针对性调优方案。