在 CentOS 上优化 MongoDB,可以从 系统层、MongoDB 配置、索引、查询、存储、监控 几个方面入手。下面给你一套比较实用、可落地的优化方案。
MongoDB 官方强烈要求关闭 THP。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效(CentOS 7):
systemctl disable tuned
echo '
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
MongoDB 需要大量文件描述符。
cat >> /etc/security/limits.conf <<EOF
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
EOF
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0
sysctl vm.swappiness=1
echo 'vm.swappiness=1' >> /etc/sysctl.conf
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 物理内存的 50%~70%
⚠️ 如果机器是 16G,建议 cacheSizeGB: 10
systemLog:
destination: file
logAppend: true
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65536
db.collection.createIndex({ user_id: 1 })
db.collection.createIndex({ status: 1, create_time: -1 })
db.setProfilingLevel(1, 100) // 超过100ms记录
db.system.profile.find().sort({ts:-1}).limit(5)
db.collection.find({user_id:1}).explain("executionStats")
✅ 目标:
IXSCAN(索引扫描)COLLSCAN(全表扫描)db.collection.find({user_id:1}, {name:1, age:1})
db.collection.insertMany([...])
writeConcern: majority 谨慎使用db.serverStatus()
db.stats()
db.currentOp()
db.runCommand({compact: "collection"})
mongostatmongotop如果你能告诉我:
我可以给你 更针对性的配置方案。