温馨提示×

Debian中MongoDB咋调优

小樊
36
2026-10-11 07:43:00
栏目: 云计算

在 Debian 上调优 MongoDB,通常从系统层、MongoDB 配置、索引与查询、存储引擎、监控几个方面入手。下面按“实用优先”的方式给你一份调优清单。


一、系统层调优(Debian)

1. 内核参数

编辑 /etc/sysctl.conf 或 /etc/sysctl.d/mongodb.conf:

vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
fs.file-max = 1000000
net.core.somaxconn = 4096

应用:

sysctl -p

2. 文件描述符限制

MongoDB 需要大量 FD。

/etc/security/limits.conf:

mongodb soft nofile 1000000
mongodb hard nofile 1000000

或 systemd 中:

[Service]
LimitNOFILE=1000000

3. 关闭 Transparent Huge Pages(重要)

MongoDB 官方强烈建议关闭:

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

永久生效(Debian):

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'

二、MongoDB 配置调优

配置文件通常在:

/etc/mongod.conf

1. 存储引擎(WiredTiger)

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4   # 物理内存的 50%–70%
    collectionConfig:
      blockCompressor: snappy

2. 日志

systemLog:
  verbosity: 0
  logRotate: reopen

3. 网络

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536

三、索引与查询优化

1. 查看慢查询

db.setProfilingLevel(1, 100)  // 超过100ms记录

查看:

db.system.profile.find().sort({ts:-1}).limit(10)

2. 建合适索引

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

避免:

  • 全集合扫描
  • 大文档排序无索引

3. 使用 explain

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

关注:

  • COLLSCAN(差)
  • IXSCAN(好)

四、写入与一致性调优

1. 写关注(Write Concern)

高吞吐可放宽:

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

金融类建议:

{ w: "majority", j: true }

2. 批量写入

db.orders.insertMany(docs)

五、监控与诊断

1. 自带命令

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

2. 系统工具

iostat -x 1
htop

3. 可视化(可选)

  • MongoDB Compass
  • Prometheus + Grafana
  • mongostat / mongotop

六、常见坑(Debian 特有)

  • 磁盘 IO 差(云盘)→ 用本地 SSD
  • OOM Kill → cacheSizeGB 设小
  • 时间不同步 → 装 ntp 或 chrony
  • apt 安装的旧版本 → 用官方 repo

七、如果你愿意,我可以更具体

你可以告诉我:

  1. MongoDB 版本(mongod --version)
  2. 数据量 & QPS
  3. 读多还是写多
  4. 单机 / 副本集 / 分片

我可以直接给你一份可落地的配置文件 + 索引方案。

0 踩