MongoDB 在 Debian 上的内存优化指南
一 核心机制与容量规划
- WiredTiger 缓存:MongoDB 默认使用 WiredTiger 存储引擎,其缓存大小由参数 storage.wiredTiger.engineConfig.cacheSizeGB 控制。默认会占用系统可用内存的约 50%,建议在生产环境中显式设置为系统可用内存的 50%–60%,为操作系统、文件系统缓存及其他进程预留足够空间。若数据集远大于内存,需配合索引与分片策略,避免工作集膨胀导致频繁换页。
- 内存映射文件:WiredTiger 与操作系统会协同工作,热点数据优先驻留在内存,超出部分由操作系统按 LRU 管理;当工作集超过物理内存时,启用 Swap 可能引发明显性能下降,应谨慎权衡。
- 连接与会话开销:每个连接都会消耗一定的内存与内核资源,连接数过高会放大内存与 CPU 的竞争,需结合业务并发合理控制。
二 MongoDB 配置优化
- 设置 WiredTiger 缓存上限(关键)
编辑 /etc/mongod.conf,为缓存设置明确上限(示例为 8GB):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
修改后重启服务:sudo systemctl restart mongod。一般建议值为系统可用内存的 50%–60%,避免与其他服务争用内存。
- 控制并发连接数
通过 net.maxIncomingConnections 限制最大连接数(默认 10000),并结合应用连接池(如设置最大连接池大小、合理超时)避免空闲会话堆积。
- 内存紧张的应急参数(权衡性能)
启用 tcmalloc 的激进内存回收(仅在明确需要时启用):
db.adminCommand({setParameter: 1, tcmallocAggressiveMemoryDecommit: 1})
该设置会更快归还未使用内存,但可能带来一定的性能波动。
- 查询与排序内存上限
通过 setParameter 限制聚合/排序等算子使用的内存,避免单次操作过度占用:
setParameter:
internalQueryExecMaxBlockingSortBytes: 209715200 # 200MB
internalQueryExecMaxMemoryUsageMB: 512 # 512MB
以上参数需结合业务查询特征与实例规格逐步调优。
三 操作系统与 systemd 层优化
- 降低换页倾向
适度降低 vm.swappiness(示例设为 0,仅在确保内存充足时采用),减少不必要的 Swap 使用:
sudo sysctl -w vm.swappiness=0
echo “vm.swappiness=0” | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
注意:禁用或降低 swappiness 后需严防 OOM。
- 资源限制与容器化隔离
使用 cgroups 为 mongod 设置内存上限(示例 4GB):
sudo cgcreate -g memory:/mongodb
echo “4G” | sudo tee /sys/fs/cgroup/memory/mongodb/memory.limit_in_bytes
sudo cgclassify -g memory:mongodb <mongod_pid>
或使用 ulimit 调整进程资源限制(如文件句柄数等),避免资源争用。
- systemd 服务内存限制(可选)
在 /etc/systemd/system/mongod.service.d/override.conf 中配置 MemoryLimit=…,对服务实施硬性内存上限,作为兜底策略。
四 查询与索引优化
- 建立高效索引:为高频 find/sort/aggregate 字段创建单字段或复合索引,优先使用覆盖索引以减少回表;用 explain() 验证是否走索引、是否存在全表扫描。
- 减少返回数据量:使用 limit() 与投影仅返回必要字段,降低网络与内存压力。
- 慢查询治理:利用 mongostat、mongotop 与慢查询日志定位问题查询,结合索引与查询改写持续优化。
五 维护与扩容策略
- 碎片整理与空间回收
对集合执行 compact 回收未使用空间(会阻塞写入,建议在维护窗口进行);必要时使用 repairDatabase(耗时且影响性能,谨慎使用)。
- 数据生命周期管理
定期清理过期数据、归档冷数据,控制集合与索引规模,避免工作集无限增长。
- 架构扩展
当单机内存无法容纳工作集或并发压力过大时,引入 分片 将数据水平拆分,或采用 复制集 提升可用性与读扩展能力。
- 监控与验证
持续观察 db.serverStatus().mem 的关键指标:resident(常驻内存)、virtual(虚拟内存)、mapped(映射大小)及 wiredTiger.cache(缓存命中/脏页等),并结合 mongostat/mongotop 与第三方监控(如 PMM)进行容量与性能评估。