centos

centos上mongodb内存占用高怎么办

小樊
36
2025-10-06 23:27:37
栏目: 云计算

1. 调整WiredTiger存储引擎缓存大小

MongoDB默认使用WiredTiger存储引擎(CentOS上推荐配置),其缓存大小由storage.wiredTiger.engineConfig.cacheSizeGB参数控制。默认情况下,该值为系统物理内存的50%,若服务器有其他应用(如Web服务、中间件),需适当降低此值以避免内存争抢。
操作步骤

2. 优化操作系统内存参数

调整vm.swappiness参数

vm.swappiness控制操作系统使用交换空间(Swap)的倾向,默认值为60(较高),会导致MongoDB频繁将内存数据写入磁盘,降低性能。建议设置为10以下(甚至0,但需谨慎,避免内存耗尽时无法使用Swap)。
操作步骤

调整vm.overcommit_memory参数

vm.overcommit_memory控制内存分配策略,默认值为0(允许过度分配),可能导致MongoDB申请过多内存而崩溃。建议设置为2(禁止过度分配),避免内存波动。
操作步骤

3. 使用systemd限制MongoDB内存

若MongoDB以systemd服务运行(CentOS默认方式),可通过systemctl set-property命令限制其内存使用,防止占用过多系统资源。
操作步骤

4. 优化查询与索引减少内存消耗

创建高效索引

全表扫描(无索引查询)会加载大量数据到内存,导致内存占用飙升。需为高频查询字段(如_iduser_idtimestamp)创建索引,优先使用复合索引(覆盖查询字段)。
示例:为orders集合的user_idcreate_time字段创建索引:

db.orders.createIndex({ user_id: 1, create_time: -1 });

优化查询语句

避免使用$where$regex等低效操作符,尽量使用索引覆盖查询(返回字段均在索引中,无需加载数据文件)。
示例:使用投影限制返回字段(仅返回nameage):

db.users.find({ age: { $gt: 18 } }, { name: 1, age: 1, _id: 0 });

5. 定期清理与维护数据库

压缩数据文件

使用compact命令回收未使用的存储空间(需停机执行),减少内存映射文件的大小:

use admin;
db.runCommand({ compact: 'your_collection_name' });

修复数据库

使用repairDatabase命令整理数据文件,删除损坏或无用的数据(需停机执行):

use admin;
db.runCommand({ repairDatabase: 1 });

设置TTL索引

临时数据(如日志、会话)设置过期时间,自动删除过期文档,释放内存:

db.logs.createIndex({ expire_at: 1 }, { expireAfterSeconds: 0 });  // 30天后过期

6. 监控内存使用情况

使用MongoDB自带工具

使用Linux系统工具

7. 临时释放内存(紧急情况)

若服务器内存不足导致系统卡顿,可通过以下命令临时释放内存(不会重启MongoDB,但会导致缓存失效,后续查询变慢):

sync; echo 3 > /proc/sys/vm/drop_caches

说明sync命令将内存中的数据写入磁盘,echo 3清除页缓存、目录项和inode缓存。

以上方法需根据服务器配置(内存大小、CPU核心数)、业务场景(读写比例、数据量)灵活调整。建议先在测试环境验证效果,再应用到生产环境。

0
看了该问题的人还看了