在 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
systemctl stop tuned
或写脚本 /etc/rc.d/rc.local:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
MongoDB 需要大量文件描述符和进程数。
编辑 /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
sysctl -w vm.swappiness=1
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5
写入 /etc/sysctl.conf 永久生效。
storage:
dbPath: /data/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 物理内存的 50%-70%
collectionConfig:
blockCompressor: snappy
⚠️ cacheSizeGB 不要超过物理内存的 80%
systemLog:
verbosity: 0
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
db.orders.createIndex({ user_id: 1, created_at: -1 })
避免 SELECT * 式查询,只返回需要的字段。
db.currentOp()
db.orders.find({...}).explain("executionStats")
关注:
COLLSCAN(全表扫描 ❌)IXSCAN(索引扫描 ✅)db.collection.insertMany(docs)
非核心数据可降低:
writeConcern: { w: 1, j: false }
⚠️ 交易/订单类不建议这样
mongostatmongotop| 现象 | 可能原因 |
|---|---|
| CPU 高 | 缺索引 / 聚合重 |
| 磁盘 IO 高 | Journal / 写放大 |
| 延迟抖动 | THP 未关 |
| 内存爆 | cacheSize 过大 |
| 连接数爆 | 连接未复用 |
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 10
systemLog:
logRotate: reopen
operationProfiling:
mode: slowOp
slowOpThresholdMs: 50
如果你愿意,可以告诉我:
我可以给你 更针对性的优化配置。