Ubuntu环境下,MongoDB(3.2及以上版本)默认采用WiredTiger作为存储引擎,其内存管理的核心是可配置的缓存池。通过storage.wiredTiger.engineConfig.cacheSizeGB参数设置缓存上限,建议值为系统总内存的50%-70%(需预留足够内存给操作系统及其他进程)。例如,8GB内存的服务器可将cacheSizeGB设为4-5GB,避免内存过度占用导致系统卡顿。
WiredTiger采用LRU(最近最少使用)算法自动淘汰不常用数据,当缓存使用量接近上限时,会将部分冷数据移出内存,为热点数据腾出空间。此外,还支持通过evictionTarget(默认80%,即缓存使用量达到80%时开始淘汰)、evictionThreshold(默认95%,超过则请求线程会参与淘汰)等参数调整淘汰策略,平衡性能与延迟。
尽管WiredTiger能有效利用内存,但仍需合理配置操作系统内存机制,防止内存耗尽导致进程崩溃。
vm.swappiness(默认值60)调整系统使用Swap的倾向,取值范围0-100。建议设置为10以下(如sudo sysctl vm.swappiness=10),减少Swap使用频率,避免频繁磁盘IO影响MongoDB性能。定期监控内存使用情况是优化的前提,可通过以下工具和方法实现:
db.serverStatus().mem命令:查看MongoDB实例的内存详情,包括常驻内存(resident)(实际使用的物理内存)、虚拟内存(virtual)(进程占用的虚拟地址空间)、映射数据大小(mapped)(映射到内存的文件大小)等指标。top、htop或free -h命令查看MongoDB进程的内存占用情况,重点关注RES(常驻内存)列。除上述核心策略外,还可通过以下方式间接优化内存使用:
projection(投影)仅返回必要字段,减少数据传输量;用limit()限制返回结果数量,避免一次性加载大量数据到内存。net.ipv4.tcp_wmem(写缓冲区)、net.ipv4.tcp_rmem(读缓冲区)等系统参数,优化TCP连接的内存使用,避免因连接过多导致内存耗尽。以上策略需结合服务器硬件配置(内存、磁盘类型)、应用场景(读写比例、数据量)及业务需求动态调整,建议在测试环境中验证后再应用于生产环境。