在 Ubuntu 上优化 MongoDB 配置,通常从系统层面、MongoDB 配置、存储与索引、运维监控几个方面入手。下面给你一套比较实用、可落地的优化方案(以 MongoDB 5.x / 6.x 为例,Ubuntu 20.04/22.04)。
MongoDB 官方强烈建议关闭 THP,否则会导致延迟抖动。
sudo apt install -y hugepages
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
永久生效:
sudo 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"
或写成 systemd 服务。
MongoDB 需要大量文件描述符和进程数。
编辑:
sudo nano /etc/security/limits.conf
添加:
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
并确认:
ulimit -n
格式化示例:
mkfs.xfs /dev/sdb
挂载:
mount -o noatime,nodiratime /dev/sdb /data
避免 MongoDB 被 swap:
sudo sysctl vm.swappiness=1
永久:
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
net:
bindIp: 0.0.0.0
port: 27017
⚠️ 生产环境建议只绑定内网 IP
storage:
dbPath: /data/db
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 建议 = 物理内存的 50% 左右
collectionConfig:
blockCompressor: snappy
replication:
replSetName: rs0
如果是单机:
storage:
journal:
commitIntervalMs: 100
net:
maxIncomingConnections: 65536
db.orders.createIndex({ user_id: 1, created_at: -1 })
db.orders.find({ status: "paid" }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅db.orders.find({}, { name: 1, price: 1 })
writeConcern: majorityoperationProfiling:
mode: slowOp
slowOpThresholdMs: 100
db.system.profile.find().sort({ ts: -1 }).limit(10)
mongostatmongotop| 问题 | 原因 | 解决 |
|---|---|---|
| CPU 高 | 缺索引 | 建索引 |
| 磁盘 IO 高 | journal / 写放大 | SSD |
| 内存爆 | cacheSize 过大 | 调小 |
| 延迟抖动 | THP | 关闭 |
| 连接数满 | 连接泄漏 | 连接池 |
storage:
dbPath: /data/db
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
net:
bindIp: 10.0.0.10
port: 27017
maxIncomingConnections: 65536
replication:
replSetName: rs0
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
如果你愿意,可以告诉我:
我可以给你更精准的配置参数。