温馨提示×

linux mongodb配置如何调优性能

小樊
35
2026-10-28 05:07:53
栏目: 云计算

在 Linux 上部署 MongoDB 时,性能调优通常从操作系统层、MongoDB 配置层、存储与索引设计、监控与运维四个方面入手。下面按实战角度给你一份较系统的调优清单。


一、Linux 系统层调优(非常重要)

1. 关闭 Transparent Huge Pages(THP)

MongoDB 官方强烈建议关闭 THP,否则会导致延迟抖动。

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

永久生效(systemd 示例):

cat > /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WWantedBy=multi-user.target
EOF

systemctl enable --now disable-thp

2. 调整 ulimit

MongoDB 需要大量文件描述符和进程数。

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

3. 磁盘与文件系统

  • 文件系统:推荐使用 xfs
  • 挂载选项:
/dev/sdb /data xfs defaults,noatime,nodiratime 0 0
  • 磁盘类型:
    • SSD / NVMe:性能提升明显
    • 避免云盘高延迟盘做主节点

4. 禁用 swap(或降低 swappiness)

sysctl vm.swappiness=1

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

1. 存储引擎(WiredTiger)

MongoDB 默认使用 WiredTiger,重点调以下参数:

storage:
  dbPath: /data/db
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 8   # 建议 = 物理内存的 50%~70%
    collectionConfig:
      blockCompressor: snappy  # 或 zstd

⚠️ cacheSizeGB 不要超过内存的 80%,留足给 OS cache


2. 写关注与日志

replication:
  replSetName: rs0

writeConcernMajorityJournalDefault: true

如果对安全性要求不高、追求性能:

db.collection.insert(doc, { writeConcern: { w: 1, j: false } })

3. 网络与连接

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 65536

三、索引与查询优化(最关键)

1. 必须用索引

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

2. 避免全表扫描

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

关注:

  • COLLSCAN ❌
  • IXSCAN ✅

3. 覆盖索引(Covering Index)

查询字段都在索引中,避免回表:

db.orders.find(
  { user_id: 1 },
  { _id: 0, total: 1 }
)

4. 避免大文档

  • 单文档 < 16MB
  • 尽量 < 几十 KB

四、副本集与分片(高并发场景)

1. 读写分离

db.getMongo().setReadPref("secondary")

2. 分片(Sharding)

适合:

  • 数据量 > 1TB
  • 写入 QPS 很高

分片键选择原则:

  • 高基数
  • 写分布均匀
  • 查询常用字段

五、监控与诊断工具

1. 内置命令

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

2. 慢查询日志

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100

3. 监控工具

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

六、常见性能问题速查

问题 可能原因
延迟高 THP 未关
CPU 高 缺少索引
磁盘 IO 高 journal + 大批量写
内存爆 cacheSize 配置过大
连接数满 连接未释放

七、示例:高并发写入型配置(参考)

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 12
    collectionConfig:
      blockCompressor: zstd

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

net:
  maxIncomingConnections: 65536

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

  • MongoDB 版本
  • 数据量 / QPS
  • 单机 or 副本集 / 分片
  • 读多还是写多

我可以直接给你针对性配置方案。

0 踩