在 Debian 下优化 MongoDB,通常可以从系统层面、MongoDB 配置、存储与索引、监控与运维几个方面入手。下面给你一份比较系统、可落地的优化清单。
MongoDB 对文件句柄和线程数敏感。
# 查看当前限制
ulimit -n
ulimit -u
修改 /etc/security/limits.conf:
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
MongoDB 官方强烈建议关闭 THP:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
持久化(systemd):
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"
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0
swapon --show
路径通常为:/etc/mongod.conf
storage:
dbPath: /data/db
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 建议 = 物理内存的 50%~70%
collectionConfig:
blockCompressor: snappy
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
replication:
replSetName: rs0
生产环境建议:
db.orders.createIndex({ user_id: 1, created_at: -1 })
db.orders.find({ status: "paid" }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅只查索引字段,避免回表。
cacheSizeGB: 物理内存 * 0.6
resident 内存rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" },
{ _id: 2, host: "mongo3:27017" }
]
})
db.getMongo().setReadPref("secondary")
mongostat
mongotop
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
htopiostat -x 1dstat| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 | 加索引 |
| 磁盘 IO 高 | 日志/压缩 | SSD + snappy |
| 内存涨 | cache 过大 | 调小 cacheSizeGB |
| 延迟高 | 网络/写关注 | 调整 w / wtimeout |
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4
net:
maxIncomingConnections: 65536
operationProfiling:
slowOpThresholdMs: 100
如果你能告诉我:
我可以给你更针对性的参数建议。