在 CentOS 上调优 MongoDB 性能,通常从 系统层、MongoDB 配置、索引、查询、硬件 几个方面入手。下面给你一套实用、可落地的调优指南。
MongoDB 官方明确要求关闭 THP。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效(CentOS 7/8)
systemctl disable tuned
或写开机脚本:
vi /etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
chmod +x /etc/rc.d/rc.local
vi /etc/security/limits.conf
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
建议使用 deadline 或 none(SSD)
cat /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sda/queue/scheduler
mkfs.xfs /dev/sdb
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 建议 = 物理内存的 50%~70%
storage:
journal:
commitIntervalMs: 100
net:
maxIncomingConnections: 65536
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
db.system.profile.find().sort({ts:-1}).limit(10)
或:
mongostat
mongotop
db.orders.createIndex({ user_id: 1, created_at: -1 })
db.orders.find(
{ status: "paid" },
{ _id: 0, order_id: 1 }
)
db.users.find({ age: { $gt: 20 } }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅db.collection.insertMany([...])
db.users.find({}, { name: 1, _id: 0 })
db.getMongo().setReadPref("secondary")
mongostat
mongotop
或:
| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 | 建索引 |
| 磁盘 IO 高 | Journal / 写放大 | SSD |
| 内存不足 | cacheSize 小 | 调大 |
| 连接爆 | ulimit | 调高 |
| 延迟高 | THP | 关闭 |
✅ 关闭 THP
✅ 调整 ulimit
✅ XFS + SSD
✅ 合理 cacheSizeGB
✅ 慢查询 + 索引
✅ 开启 slowOp
如果你愿意,可以告诉我:
我可以给你针对性调优方案或配置文件模板。