温馨提示×

mongodb内存映射centos配置

小樊
36
2025-12-07 13:30:10
栏目: 云计算

CentOS 上 MongoDB 内存映射与存储引擎配置

一、先确认存储引擎与内存映射的关系

  • 内存映射文件(MMAPv1):MongoDB 将数据库文件直接映射到进程地址空间,由操作系统负责分页与缓存;该引擎没有可配置的“缓存上限”参数,内存占用受数据规模与系统内存压力共同影响。适用于需要 MMAP 语义的场景。
  • WiredTiger(默认):采用自管理的缓存,可通过参数限制内存使用,避免无界占用。
  • 查看当前引擎:在 mongo shell 执行
    db.runCommand({ connectionStatus: 1 }).storageEngine.name
    若返回 mmapv1 则为内存映射模式;返回 wiredTiger 则为 WiredTiger。

二、使用 MMAPv1 时的关键配置与系统优化(CentOS 7/8)

  • 配置文件示例(/etc/mongod.conf):
    storage:
    engine: mmapv1
    dbPath: /var/lib/mongo
    journal:
    enabled: true
  • 数据盘读预读(readahead)建议:MongoDB 官方建议将数据盘的预读设置为 256KB(512 sectors)或更小。检查与调整示例:
    • 查看:blockdev --getra /dev/sdX
    • 设置:blockdev --setra 256 /dev/sdX
      若预读过大,mongod 启动日志会出现类似 “Readahead … We suggest setting it to 256KB …” 的告警。
  • 可选:启用 MMAPv1 的小文件模式(降低单文件尺寸,适用于小规模数据或测试环境):
    storage:
    mmapv1:
    smallFiles: true
  • 重启生效:
    sudo systemctl restart mongod
  • 说明:MMAPv1 下没有“cacheSizeGB”这类旋钮,内存由操作系统页缓存与映射机制决定;应结合工作集大小与内存容量规划。

三、使用 WiredTiger 时限制内存的正确方式

  • 配置文件示例(/etc/mongod.conf):
    storage:
    engine: wiredTiger
    dbPath: /var/lib/mongo
    wiredTiger:
    engineConfig:
    cacheSizeGB: 4 # 按服务器内存合理设置,如 4GB
  • 重启生效:
    sudo systemctl restart mongod
  • 验证:
    mongo --eval ‘db.serverStatus().wiredTiger.cache’
    观察 wiredTiger.cache 中的 maxcurrent 是否符合预期。
  • 提示:WiredTiger 缓存是 MongoDB 可控的主要内存项;操作系统页缓存仍会缓存文件数据,但不计入该 cacheSizeGB。

四、系统层面的优化与注意事项

  • 文件描述符与内核参数(/etc/security/limits.conf 与 /etc/sysctl.conf):
    • limits.conf:
      • soft nofile 65536
      • hard nofile 65536
    • sysctl.conf(按需):
      vm.swappiness=1
      vm.vfs_cache_pressure=50
      net.core.somaxconn=65535
      net.ipv4.ip_local_port_range=1024 65535
      应用:sysctl -p;重启 mongod 后生效。
  • 透明大页(THP):建议关闭以避免内存碎片与性能抖动:
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    并将上述命令加入系统启动脚本以确保持久化。
  • 监控与容量规划:
    • 观察内存与缓存:mongo --eval ‘db.serverStatus().mem’(总体内存)、db.serverStatus().wiredTiger.cache(WT 缓存)
    • 观察连接与队列:db.serverStatus().connections、db.serverStatus().globalLock
    • 结合工作集大小、索引规模与磁盘 IO 能力,合理设置 cacheSizeGB 与存储/日志布局。

0