在 Debian 上优化 MongoDB,通常可以从系统层面、MongoDB 配置、索引与查询、存储与硬件几个维度来做。下面给你一套比较实用的优化思路(适用于 Debian 10/11/12 + MongoDB 4.x/5.x/6.x)。
编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-mongodb.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
应用:
sysctl --system
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]
WantedBy=multi-user.target
EOF
systemctl enable --now disable-thp
编辑 /etc/security/limits.conf:
mongodb soft nofile 65535
mongodb hard nofile 65535
或 systemd 中:
[Service]
LimitNOFILE=65535
配置文件通常在:
/etc/mongod.conf
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 建议为物理内存的 50%~70%
collectionConfig:
blockCompressor: snappy
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65535
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
db.orders.createIndex({ user_id: 1, created_at: -1 })
使用:
db.orders.find({ user_id: 123 }).explain("executionStats")
关注:
COLLSCAN ❌IXSCAN ✅只查索引字段,避免回表。
遵循 ESR 原则:
对一致性要求不高时可降低:
db.orders.insertOne(doc, { writeConcern: { w: 1 } })
db.orders.insertMany(docs)
db.orders.find().readPref("secondary")
mongotop
mongostat
或:
db.serverStatus()
db.currentOp()
生产建议:
❌ 使用 apt 默认版本太旧
✅ 使用 MongoDB 官方源
apt install gnupg curl
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
如果你能补充:
我可以给你更针对性的参数配置示例。