温馨提示×

centos mongodb如何优化

小樊
46
2026-09-27 01:18:54
栏目: 云计算

在 CentOS 上优化 MongoDB,一般从 系统层、MongoDB 配置、索引、查询、存储、监控 几个维度来做。下面给你一份比较实用、可落地的优化清单。


一、系统层优化(CentOS)

1. 关闭 Transparent Huge Pages(THP)

MongoDB 官方强烈建议关闭 THP:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

永久生效:

vi /etc/rc.d/rc.local
# 添加上面两行
chmod +x /etc/rc.d/rc.local

2. 调整 ulimit

MongoDB 需要大量文件句柄和进程数:

vi /etc/security/limits.conf
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000

3. 磁盘与文件系统

  • 使用 XFS(推荐)
  • 磁盘尽量用 SSD
  • 挂载选项:
vi /etc/fstab
/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0

4. 内核参数(可选)

sysctl -w vm.swappiness=1
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5

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

1. 内存相关

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

2. 日志优化

systemLog:
  destination: file
  logAppend: true

3. 网络与连接

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536

三、索引优化(最关键)

1. 必须建索引的字段

  • find() 常用字段
  • sort() 字段
  • join(如 aggregation $lookup)
db.orders.createIndex({ user_id: 1, created_at: -1 })

2. 使用复合索引

遵循 ESR 原则:

  • Equality
  • Sort
  • Range

3. 查看慢查询

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

4. 避免全表扫描

db.orders.find({ status: "paid" }).explain("executionStats")

确保 winningPlan 不是 COLLSCAN


四、查询与写入优化

1. 只查需要的字段

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

2. 批量写入

db.orders.insertMany([...])

3. 写关注(writeConcern)

非核心数据可降低:

db.orders.insertOne(doc, { writeConcern: { w: 1 } })

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

副本集

  • 读写分离
  • 从节点读:readPreference: secondary

分片

  • 数据量 > 500GB
  • 写入瓶颈明显
  • 片键选择均匀 + 高频查询字段

六、监控与定位问题

1. 常用命令

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

2. 工具

  • mongostat
  • mongotop
  • Prometheus + Grafana
  • Atlas(云)

七、常见性能问题速查

问题 原因 解决
CPU 高 缺索引 / 聚合重 建索引 / 优化聚合
内存高 cache 大 调 cacheSizeGB
磁盘 IO 高 慢查询 索引 + SSD
连接爆 连接未释放 连接池 + maxIncomingConnections

八、示例(常见生产配置)

storage:
  dbPath: /data/mongodb
  wiredTiger:
    engineConfig:
      cacheSizeGB: 12
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
net:
  port: 27017
  bindIp: 0.0.0.0

如果你能补充:

  • MongoDB 版本
  • 数据量
  • 读写比例
  • 是否有副本集/分片

我可以给你 更针对性的优化方案。

0 踩