在 Linux 上部署 MongoDB 时,性能调优通常从操作系统层、MongoDB 配置层、存储与索引设计、监控与运维四个方面入手。下面按实战角度给你一份较系统的调优清单。
MongoDB 官方强烈建议关闭 THP,否则会导致延迟抖动。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效(systemd 示例):
cat > /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WWantedBy=multi-user.target
EOF
systemctl enable --now disable-thp
MongoDB 需要大量文件描述符和进程数。
# /etc/security/limits.conf
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
xfs/dev/sdb /data xfs defaults,noatime,nodiratime 0 0
sysctl vm.swappiness=1
MongoDB 默认使用 WiredTiger,重点调以下参数:
storage:
dbPath: /data/db
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 建议 = 物理内存的 50%~70%
collectionConfig:
blockCompressor: snappy # 或 zstd
⚠️ cacheSizeGB 不要超过内存的 80%,留足给 OS cache
replication:
replSetName: rs0
writeConcernMajorityJournalDefault: true
如果对安全性要求不高、追求性能:
db.collection.insert(doc, { writeConcern: { w: 1, j: false } })
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
db.orders.createIndex({ user_id: 1, created_at: -1 })
db.orders.find({ status: "paid" }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅查询字段都在索引中,避免回表:
db.orders.find(
{ user_id: 1 },
{ _id: 0, total: 1 }
)
db.getMongo().setReadPref("secondary")
适合:
分片键选择原则:
db.serverStatus()
db.currentOp()
db.stats()
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
mongostatmongotop| 问题 | 可能原因 |
|---|---|
| 延迟高 | THP 未关 |
| CPU 高 | 缺少索引 |
| 磁盘 IO 高 | journal + 大批量写 |
| 内存爆 | cacheSize 配置过大 |
| 连接数满 | 连接未释放 |
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 12
collectionConfig:
blockCompressor: zstd
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
net:
maxIncomingConnections: 65536
如果你愿意,可以告诉我:
我可以直接给你针对性配置方案。