Ubuntu上MongoDB资源占用高的定位与优化
一、先快速定位占用来源
top -p $(pidof mongod) 或 htop,关注 RES(常驻内存)与 %CPU。free -h,注意 Linux 会把大量文件页计入 buff/cache,判断可用内存应看 available 列,避免把 cache 误判为内存吃紧。必要时用 sar -r/sar -W 观察内存与换页趋势。db.serverStatus().mem(关注 resident、virtual)。db.serverStatus().wiredTiger.cache(关注 bytes currently in the cache、bytes dirty in the cache 及 eviction 相关阈值)。db.serverStatus().connections(当前/可用连接数),db.serverStatus().tcmalloc(tcmalloc 未归还内存,如 pageheap_free_bytes + total_free_bytes)。mongostat(观察 dirty、used、**miss 等)、mongotop`(按集合看读写耗时)。二、常见根因与对应处置
net.maxIncomingConnections),优化聚合与排序(加索引、allowDiskUse:true),减少大结果集返回。db.serverStatus().tcmalloc 显示大量未归还内存,RSS 长时间不回落。explain("executionStats") 验证执行计划;索引构建尽量错峰,避免并发创建多个大索引;必要时清理/重建碎片化索引。allowDiskUse:true 或将大聚合拆分为多阶段任务。三、关键配置与系统优化
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1.5 # 依据总内存与业务负载调整
net.maxIncomingConnections,避免每个连接带来的线程栈与内核缓冲开销;结合应用连接池(如每个服务 20–50 长连接)控制总连接数在 1000 以内更稳。explain("executionStats") 与 mongostat/mongotop 持续验证优化成效。ulimit -n 20000),避免“too many open files”。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
mongostat、mongotop,必要时引入 PMM 等可视化监控。四、按资源维度的处置清单
| 资源维度 | 快速判断 | 立即动作 | 验证与注意 |
|---|---|---|---|
| 内存 | resident 高、wiredTiger.cache 接近 95% 或脏页超过 20% |
下调 storage.wiredTiger.engineConfig.cacheSizeGB;优化慢查询与索引;错峰建索引 |
观察 mongostat 的 dirty/used 回落、请求 P95 延迟下降 |
| CPU | mongostat 显示高 qr/qw、高 faults、CPU 持续打满 |
为热点查询加索引、改写聚合、减少大结果集;必要时水平扩展 | 用 explain 与慢查询日志确认改进效果 |
| 连接数 | connections.current 接近上限、线程栈与网络缓冲占用高 |
降低应用连接池与 net.maxIncomingConnections,合并短连接 |
观察连接创建速率与超时率是否下降 |
| 磁盘 IO | mongostat page_faults 高、wiredTiger 读写吞吐大 |
使用 SSD、优化索引与查询、避免无索引扫描 | 观察 bytes_read/written_from_cache 与磁盘 util 是否改善 |
| 聚合/排序 | 聚合报错或 P95 高、临时空间不足 | 在聚合中启用 allowDiskUse:true,拆分阶段与结果集 |
大聚合尽量在从节点或离线窗口执行 |
以上步骤覆盖了定位、根因、配置与系统层面的关键做法。优先从“缓存与连接”两大可控项入手,配合索引与查询优化,通常即可显著降低资源占用并恢复稳定性。