在 Debian 上调优 MongoDB,通常从系统层、MongoDB 配置、索引与查询、监控几个方面入手。下面给你一套比较实用的调优思路(以 MongoDB 5.x/6.x + Debian 11/12 为例)。
MongoDB 官方明确要求关闭 THP。
sudo apt install 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"
编辑:
sudo vim /etc/security/limits.conf
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
确认:
ulimit -n
/dev/sdb /data xfs defaults,noatime 0 0
atimesudo sysctl -w vm.swappiness=1
sudo sysctl -w vm.dirty_ratio=10
sudo sysctl -w vm.dirty_background_ratio=5
路径通常是:
/etc/mongod.conf
storage:
dbPath: /data/db
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 物理内存的 50%~70%
collectionConfig:
blockCompressor: snappy
⚠️ cacheSizeGB 不要超过内存的 80%
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
replication:
replSetName: rs0
如果是单机测试:
storage:
journal:
enabled: true
高写入场景可考虑:
writeConcern: { w: 1, j: false }
(但有断电丢数据风险)
db.setProfilingLevel(1, { slowms: 100 })
分析:
db.system.profile.find().sort({ts:-1}).limit(10)
db.orders.createIndex({ user_id: 1, created_at: -1 })
避免:
db.orders.find({ user_id: 123 }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅totalKeysExamined vs totalDocsExamineddb.serverStatus()
db.stats()
top
iostat -x 1
iotop
mongostatmongotop| 问题 | 可能原因 |
|---|---|
| CPU 高 | 缺索引 / 聚合重 |
| IO 高 | 内存不足 / 无 SSD |
| 延迟高 | 锁等待 / 网络 |
| OOM | cacheSize 太大 |
如果你愿意,可以告诉我:
我可以直接帮你写一套针对性的 mongod.conf 和索引方案。