MongoDB 内存配置 CentOS 最优方案 (2026)

前言

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 占用内存过高怎么办?

  1. 检查 cacheSizeGB 是否设置过大
  2. 查看是否存在大批量写入导致缓存激增
  3. 增加物理内存或迁移到更大内存的服务器

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%)运行一段时间,观察监控数据后再逐步调优。如遇性能瓶颈,可考虑升级服务器内存或优化查询语句,从根本上降低内存压力。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注