温馨提示×

Ubuntu MongoDB内存管理技巧

小樊
46
2025-11-15 02:50:23
栏目: 云计算

Ubuntu 上 MongoDB 内存管理实用技巧

一 核心原则与默认行为

  • WiredTiger 是 MongoDB 的默认存储引擎,采用内存映射与自管理缓存。若未显式配置,其缓存大小默认为以下两者的较大者:50% ×(RAM − 1 GB)256 MB。例如:总内存为 4 GB 时约为 1.5 GB;总内存为 1.25 GB 时为 256 MB。当一台机器运行多个 mongod 实例时,应为每个实例单独下调该值以避免争用。索引构建等额外内存开销不包含在该缓存内。建议在生产环境优先使用 WiredTiger。

二 配置 WiredTiger 缓存上限

  • /etc/mongod.conf 中显式设置缓存上限,避免与系统其他服务争抢内存;修改后需重启生效。
  • 示例(将缓存限制为约 3 GB):
    storage:
      wiredTiger:
        engineConfig:
          cacheSizeGB: 3
    
  • 命令行等效方式:
    mongod -f /etc/mongod.conf --wiredTigerCacheSizeGB 3
    
  • 场景建议:
    • 8 GB 内存单机:可将 cacheSizeGB 设为约 3–4 GB,为操作系统与其他进程预留充足内存。
    • 多实例共存:按实例数均分或按负载分配,确保总和低于可用物理内存的**70%–80%**更稳妥。

三 操作系统层优化

  • 禁用透明大页(THP):THP 可能引发内存抖动与延迟尖峰,建议关闭。
    • 创建禁用 THP 的 systemd 服务(示例):
      sudo tee /etc/systemd/system/disable-thp.service <<EOF
      [Unit]
      Description=Disable Transparent Huge Pages (THP)
      [Service]
      Type=simple
      ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"
      [Install]
      WantedBy=multi-user.target
      EOF
      sudo systemctl daemon-reload
      sudo systemctl enable --now disable-thp.service
      
  • 调整 vm.swappiness(降低换页倾向,减少抖动):
    sudo sysctl vm.swappiness=10
    echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
    
  • 调整 vm.overcommit_memory(更保守的内存过量使用策略):
    sudo sysctl vm.overcommit_memory=2
    echo "vm.overcommit_memory=2" | sudo tee -a /etc/sysctl.conf
    
  • 文件句柄与进程数限制(编辑 /etc/security/limits.d/mongodb.conf):
    mongod soft nproc 64000
    mongod hard nproc 64000
    mongod soft nofile 64000
    mongod hard nofile 64000
    
  • 存储与文件系统:优先使用 SSD/NVMe,并合理设置文件系统挂载选项(如 noatime)以减少不必要的元数据写入。

四 查询与索引层面的内存控制

  • 限制阻塞排序与聚合内存:
    • 设置单次阻塞排序可用内存(示例 100 MB):
      db.adminCommand({
        setParameter: 1,
        internalQueryExecMaxBlockingSortBytes: 104857600
      })
      
    • 视版本与需求设置聚合/查询阶段可用内存(示例 512 MB):
      db.adminCommand({
        setParameter: 1,
        internalQueryExecMaxMemoryUsageMB: 512
      })
      
  • 优化查询与索引:
    • 使用 explain(“executionStats”) 检查是否走索引,避免全表扫描。
    • 只返回必要字段(投影),减少传输与内存占用。
    • 为高频查询建立合适的复合索引,并定期清理不再使用的索引。
    • 控制连接池规模,避免连接风暴导致内存与 CPU 压力上升。

五 监控与容量规划

  • 内置工具与命令:
    • mongostat:观察插入/查询/更新/删除速率、连接数、缓存命中与脏页比例等。
    • mongotop:按集合维度查看读写耗时。
    • db.serverStatus().mem:查看内存相关指标(如 resident、virtual、mapped)。
  • 第三方监控:如 PMM,用于长期趋势与瓶颈定位。
  • 容量规划要点:
    • 工作集(常访问数据 + 索引)尽量放入内存;若工作集超过内存,优先考虑加内存SSD分片数据归档/压缩

0