前言
MongoDB 是最流行的 NoSQL 数据库之一,在 CentOS 服务器上运行 MongoDB 时,内存配置是影响性能的核心因素。合理的内存配置可以显著提升读写性能,避免 OOM(内存溢出)问题。本文将详细介绍在 CentOS 系统中如何科学配置 MongoDB 内存。
一、了解 MongoDB 的内存模型
MongoDB 的内存使用分为几个主要部分:
- WiredTiger 缓存:默认占用 50% 的可用内存减去 1GB,用于存储数据和索引
- 连接与线程栈:每个连接约占用 1MB 栈空间
- 内部元数据:集合、索引的元数据信息
- 文件系统缓存:操作系统层面的 page cache
内存总量 = WiredTiger 缓存 + 连接栈 + 元数据 + 操作系统预留
二、基础配置步骤
步骤1:查看系统内存
free -h
cat /proc/meminfo | grep MemTotal
建议 MongoDB 独占 4GB 以上的物理内存,以确保缓存有足够空间。
步骤2:修改 mongod.conf
sudo vi /etc/mongod.conf
关键配置项:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 2 # 设置缓存大小,建议为物理内存的50%
步骤3:重启服务
sudo systemctl restart mongod
sudo systemctl status mongod
三、高级内存优化配置
1. WiredTiger 引擎调优
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4
journalCompressor: snappy
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
2. 连接数与线程配置
net:
port: 27017
maxIncomingConnections: 2000
operationProfiling:
slowOpThresholdMs: 100
3. 内存映射限制
对于大内存服务器(64GB+),建议:
# 设置透明大页为关闭,避免内存碎片
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
四、监控与验证
查看内存使用情况
# 进入 MongoDB Shell
mongosh
# 查看 WiredTiger 缓存统计
db.serverStatus().wiredTiger.cache
# 查看内存命中率
db.serverStatus().wiredTiger.cache['bytes read into cache']
db.serverStatus().wiredTiger.cache['pages read from cache']
关键监控指标
| 指标 | 说明 | 理想值 |
|---|---|---|
| cache dirty | 脏数据占比 | < 40% |
| cache used | 缓存使用率 | 80-90% |
| pages evicted | 淘汰页面数 | 越少越好 |
使用 top 验证
top -p $(pgrep -f mongod)
观察 RES(实际内存占用)是否接近 cacheSizeGB + 1GB。
五、常见问题解决方案
Q1:MongoDB 占用内存过高怎么办?
- 检查
cacheSizeGB是否设置过大 - 查看是否存在大批量写入导致缓存激增
- 增加物理内存或迁移到更大内存的服务器
Q2:内存不足导致 OOM 崩溃?
# 设置 ulimit
ulimit -v unlimited
# 在 systemd 配置中添加限制
sudo vi /etc/systemd/system/mongod.service.d/override.conf
添加:
[Service]
MemoryLimit=8G
Q3:如何计算最优 cacheSizeGB?
最优 cacheSizeGB = (物理内存 - 操作系统预留 2GB) × 0.6
示例:16GB 服务器 → 建议配置 8GB
六、生产环境推荐配置
根据不同服务器规格,推荐配置如下:
4GB 内存服务器:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
8GB 内存服务器:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4
16GB+ 服务器:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
collectionConfig:
blockCompressor: zstd
结语
MongoDB 的内存配置没有标准答案,需要根据实际业务量、数据量和服务器资源综合考量。建议先用保守配置(物理内存的 50%)运行一段时间,观察监控数据后再逐步调优。如遇性能瓶颈,可考虑升级服务器内存或优化查询语句,从根本上降低内存压力。