温馨提示×

ubuntu mongodb为何占用高

小樊
47
2026-10-28 17:36:05
栏目: 云计算

在 Ubuntu 上 MongoDB 占用资源(CPU / 内存 / 磁盘 IO)过高,通常不是单一原因,而是以下几类常见情况之一。你可以对照排查:


一、内存占用高(最常见)

1. WiredTiger 缓存机制

MongoDB 默认会使用 约 50% 的物理内存 作为 WiredTiger 缓存:

db.serverStatus().wiredTiger.cache

这是正常现象,不是内存泄漏。

✅ 解决方式:

  • 如果是云服务器,限制 cacheSizeGB
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2

2. 连接数过多

每个连接都会占用内存:

db.serverStatus().connections

如果 current 很高(几百+),说明应用没用连接池或连接未释放。

✅ 解决:

  • 应用使用连接池
  • 限制最大连接数
net:
  maxIncomingConnections: 500

二、CPU 占用高

3. 慢查询 / 缺少索引

这是 CPU 高的核心原因。

查看慢查询:

db.setProfilingLevel(1, { slowms: 100 })
db.system.profile.find().sort({ ts: -1 }).limit(5)

常见原因:

  • 全表扫描(COLLSCAN)
  • 排序无索引
  • 聚合管道复杂

✅ 解决:

  • 建立合适索引
db.collection.createIndex({ field: 1 })
  • 用 explain() 分析
db.collection.find({...}).explain("executionStats")

4. 大量写入(insert / update)

  • 日志型应用
  • 高频埋点
  • 批量任务

✅ 优化:

  • 批量写入
  • 异步写入
  • 关闭 journal(仅测试环境)

三、磁盘 IO 高

5. 日志 & Journal

MongoDB 频繁写:

  • oplog
  • journal
  • 数据文件

✅ 检查:

iostat -x 1

✅ 优化:

  • 使用 SSD
  • 分离数据盘和日志盘

四、系统层面的问题

6. Ubuntu 的 swap 没开

MongoDB 在内存紧张时容易卡死或高 CPU。

✅ 检查:

free -h
swapon --show

7. 版本 Bug / 配置错误

  • 使用了不兼容的 MongoDB 版本
  • 配置文件错误导致重启循环

✅ 查看日志:

journalctl -u mongod
/var/log/mongodb/mongod.log

五、快速自查清单 ✅

# 内存
free -h
db.serverStatus().wiredTiger.cache

# CPU
top
db.currentOp()

# 连接
db.serverStatus().connections

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

六、如果你愿意

你可以贴出:

  • MongoDB 版本
  • 服务器配置(CPU / 内存)
  • mongod.log 报错或警告
  • top / htop 截图

我可以帮你精准定位是哪一类问题。

0 踩