在 CentOS 上优化 MongoDB,一般从 系统层、MongoDB 配置、索引、查询、存储、监控 几个维度来做。下面给你一份比较实用、可落地的优化清单。
MongoDB 官方强烈建议关闭 THP:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效:
vi /etc/rc.d/rc.local
# 添加上面两行
chmod +x /etc/rc.d/rc.local
MongoDB 需要大量文件句柄和进程数:
vi /etc/security/limits.conf
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
vi /etc/fstab
/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0
sysctl -w vm.swappiness=1
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 物理内存的 50%~70%
systemLog:
destination: file
logAppend: true
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
find() 常用字段sort() 字段join(如 aggregation $lookup)db.orders.createIndex({ user_id: 1, created_at: -1 })
遵循 ESR 原则:
db.setProfilingLevel(1, 100) // 超过100ms记录
db.system.profile.find().sort({ts:-1}).limit(10)
db.orders.find({ status: "paid" }).explain("executionStats")
确保 winningPlan 不是 COLLSCAN
db.users.find({}, { name: 1, age: 1 })
db.orders.insertMany([...])
非核心数据可降低:
db.orders.insertOne(doc, { writeConcern: { w: 1 } })
readPreference: secondarydb.serverStatus()
db.currentOp()
db.stats()
mongostatmongotop| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 / 聚合重 | 建索引 / 优化聚合 |
| 内存高 | cache 大 | 调 cacheSizeGB |
| 磁盘 IO 高 | 慢查询 | 索引 + SSD |
| 连接爆 | 连接未释放 | 连接池 + maxIncomingConnections |
storage:
dbPath: /data/mongodb
wiredTiger:
engineConfig:
cacheSizeGB: 12
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
net:
port: 27017
bindIp: 0.0.0.0
如果你能补充:
我可以给你 更针对性的优化方案。