MongoDB在Ubuntu上默认使用WiredTiger存储引擎(自3.0版本起替代MMAPv1成为默认),其内存管理围绕缓存机制与数据持久化设计。WiredTiger通过内存缓存频繁访问的数据和索引,减少磁盘I/O,提升查询与写入性能。
cacheSizeGB)storage.wiredTiger.engineConfig.cacheSizeGB 是核心内存参数,用于限制WiredTiger引擎可使用的内存上限。建议设置为系统可用内存的50%-70%(如16GB内存服务器可设置为8-11GB),避免占用过多内存导致系统或其他进程崩溃。配置示例如下:
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整
修改后需重启MongoDB服务使配置生效:sudo systemctl restart mongod。
合理配置Swap空间可在物理内存不足时,将部分内存数据转移至磁盘,避免进程崩溃。建议创建与物理内存相当的Swap分区(如16GB内存创建16GB Swap),并通过vm.swappiness参数(默认60)调整内存交换倾向:
vm.swappiness的命令示例:sudo sysctl vm.swappiness=10 # 临时生效
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf # 永久生效
```。
## 四、内存使用监控与验证
### 1. 查看内存配置是否生效
通过MongoDB shell执行以下命令,查看WiredTiger缓存大小及其他内存指标:
```javascript
db.serverStatus().mem
输出结果包含wiredTiger.cache部分,显示缓存使用量、限制及命中率等信息。
使用top或htop命令查看MongoDB进程(mongod)的内存使用情况,重点关注RES(常驻内存)指标:
top -p $(pgrep mongod)
或使用htop(需安装):
sudo apt install htop
htop
通过监控可及时发现内存瓶颈,调整配置参数。
为频繁查询的字段创建索引,可减少全表扫描,降低内存占用。例如,为用户表的email字段创建索引:
db.users.createIndex({ email: 1 })
使用explain()方法分析查询计划,确认索引是否被正确使用。
projection)限制返回字段,减少内存传输量;limit)控制返回结果数量,避免一次性加载大量数据;bulkWrite)减少网络往返与内存开销。db.users.find({}, { email: 1 }).limit(10)
```。