温馨提示×

ubuntu mongodb如何调优

小樊
38
2026-10-28 19:24:06
栏目: 云计算

下面从 系统层面、MongoDB 配置、索引、查询、写入、监控 几个角度,系统性讲一下 Ubuntu 上 MongoDB 的调优思路(以 MongoDB 4.x/5.x/6.x 通用为主)。


一、系统层面调优(Ubuntu)

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

MongoDB 官方强烈建议关闭 THP:

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

永久生效(Ubuntu):

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"

2. 调整 ulimit

编辑 /etc/security/limits.conf:

mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000

3. 磁盘与文件系统

  • 使用 XFS(官方推荐)
  • 使用 SSD(IOPS 是关键)
  • 挂载参数示例:
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0

4. 内存

  • MongoDB 依赖 WiredTiger 缓存
  • 原则:内存越大越好
  • 建议:
    • 缓存 ≈ 50% 物理内存(默认)
    • 不要开启 swap 依赖

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

路径通常是 /etc/mongod.conf

1. WiredTiger 缓存

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 8   # 根据内存调整,不超过物理内存50%

2. 日志与写策略

storage:
  journal:
    enabled: true

高写入场景可适当调整:

systemLog:
  verbosity: 0

3. 网络与连接

net:
  maxIncomingConnections: 65536
  wireObjectCheck: false

三、索引优化(最常用)

1. 查看慢查询

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

或配置:

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100

2. 建立合适索引

db.orders.createIndex({ user_id: 1, created_at: -1 })

原则:

  • 查询字段建索引
  • 排序字段建索引
  • 避免过多索引(影响写入)

3. 覆盖查询(Covering Index)

db.orders.find(
  { status: "paid" },
  { _id: 0, user_id: 1, amount: 1 }
)

需要:

db.orders.createIndex({ status: 1, user_id: 1, amount: 1 })

四、查询与写入优化

1. 避免全表扫描

db.orders.find({ $where: "this.amount > 100" }) // ❌

✅ 改为:

db.orders.find({ amount: { $gt: 100 } })

2. 批量写入

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

3. 使用投影减少数据量

db.orders.find({}, { name: 1, price: 1 })

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

副本集

  • 读请求走 secondary
readPreference=secondary

分片

  • 单表 > 数千万行
  • shard key 选择高频查询字段

六、监控工具

1. 自带

mongostat
mongotop

2. 查看执行计划

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

关注:

  • COLLSCAN ❌
  • IXSCAN ✅
  • totalKeysExamined vs totalDocsExamined

七、常见性能问题速查表

问题 原因 解决
CPU 高 缺索引 建索引
磁盘 IO 高 全表扫描 优化查询
内存高 缓存小 增大 cacheSizeGB
写入慢 journal SSD
连接爆 ulimit 调整 limits

如果你愿意,可以告诉我:

  • MongoDB 版本
  • 数据量 / QPS
  • 是否副本集 / 分片
  • 具体慢查询 SQL

我可以给你 针对性调优方案。

0 踩