温馨提示×

centos mongodb怎么优化

小樊
44
2026-09-14 23:51:52
栏目: 云计算

CentOS 上优化 MongoDB,可以从 系统层、MongoDB 配置、索引、查询、存储、监控 几个方面入手。下面给你一套比较实用、可落地的优化方案。


一、系统层优化(CentOS)

1. 关闭 Transparent Huge Pages(非常重要)

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

2. 调整 ulimit

MongoDB 需要大量文件描述符。

cat >> /etc/security/limits.conf <<EOF
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
EOF

3. 磁盘与文件系统

  • 推荐使用 XFS(CentOS 默认)
  • 磁盘优先使用 SSD
  • 挂载参数建议:
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0

4. 关闭 swap(或降低 swappiness)

sysctl vm.swappiness=1
echo 'vm.swappiness=1' >> /etc/sysctl.conf

二、MongoDB 配置优化(mongod.conf)

1. 内存相关

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 8   # 物理内存的 50%~70%

⚠️ 如果机器是 16G,建议 cacheSizeGB: 10


2. 日志优化

systemLog:
  destination: file
  logAppend: true

3. 网络与连接

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536

三、索引优化(最关键)

1. 必须建索引

db.collection.createIndex({ user_id: 1 })
db.collection.createIndex({ status: 1, create_time: -1 })

2. 查看慢查询

db.setProfilingLevel(1, 100)  // 超过100ms记录
db.system.profile.find().sort({ts:-1}).limit(5)

3. 使用 explain 分析

db.collection.find({user_id:1}).explain("executionStats")

✅ 目标:

  • IXSCAN(索引扫描)
  • 避免 COLLSCAN(全表扫描)

四、查询与写入优化

1. 只返回需要的字段

db.collection.find({user_id:1}, {name:1, age:1})

2. 批量写入

db.collection.insertMany([...])

3. 避免大文档

  • 单文档 < 16MB
  • 大数组拆表

五、副本集 / 分片(高并发场景)

  • 读多写少 → 副本集 + 读从节点
  • 数据量大 → 分片集群
  • 写压力大 → 增加 writeConcern: majority 谨慎使用

六、监控与维护

1. 常用命令

db.serverStatus()
db.stats()
db.currentOp()

2. 定期维护

db.runCommand({compact: "collection"})

3. 监控工具

  • mongostat
  • mongotop
  • Prometheus + Grafana
  • PMM(Percona Monitoring)

七、常见性能问题排查顺序

  1. CPU 高?→ 看是否 COLLSCAN
  2. 内存高?→ cacheSize 是否合理
  3. 磁盘 IO 高?→ 是否 SSD / 索引缺失
  4. 连接数高?→ 连接池是否合理

如果你能告诉我:

  • MongoDB 版本
  • CentOS 版本
  • 数据量 / QPS
  • 是否副本集 / 分片

我可以给你 更针对性的配置方案

0