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 中的 max 与 current 是否符合预期。
- 提示: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 与存储/日志布局。