MongoDB默认使用WiredTiger存储引擎(CentOS上推荐配置),其缓存大小由storage.wiredTiger.engineConfig.cacheSizeGB参数控制。默认情况下,该值为系统物理内存的50%,若服务器有其他应用(如Web服务、中间件),需适当降低此值以避免内存争抢。
操作步骤:
sudo vi /etc/mongod.conf;storage.wiredTiger.engineConfig section,修改cacheSizeGB(例如设置为2GB):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 2 # 根据服务器内存调整(如8GB内存可设为3-4GB)
sudo systemctl restart mongod。vm.swappiness参数vm.swappiness控制操作系统使用交换空间(Swap)的倾向,默认值为60(较高),会导致MongoDB频繁将内存数据写入磁盘,降低性能。建议设置为10以下(甚至0,但需谨慎,避免内存耗尽时无法使用Swap)。
操作步骤:
sudo sysctl vm.swappiness=10;/etc/sysctl.conf文件末尾添加vm.swappiness=10,然后执行sudo sysctl -p。vm.overcommit_memory参数vm.overcommit_memory控制内存分配策略,默认值为0(允许过度分配),可能导致MongoDB申请过多内存而崩溃。建议设置为2(禁止过度分配),避免内存波动。
操作步骤:
/etc/sysctl.conf文件,添加vm.overcommit_memory=2;sudo sysctl -p使配置生效。若MongoDB以systemd服务运行(CentOS默认方式),可通过systemctl set-property命令限制其内存使用,防止占用过多系统资源。
操作步骤:
sudo systemctl set-property mongod MemoryLimit=10G;sudo systemctl restart mongod。cacheSizeGB(如cacheSizeGB=2时,MemoryLimit可设为3-4倍)。全表扫描(无索引查询)会加载大量数据到内存,导致内存占用飙升。需为高频查询字段(如_id、user_id、timestamp)创建索引,优先使用复合索引(覆盖查询字段)。
示例:为orders集合的user_id和create_time字段创建索引:
db.orders.createIndex({ user_id: 1, create_time: -1 });
避免使用$where、$regex等低效操作符,尽量使用索引覆盖查询(返回字段均在索引中,无需加载数据文件)。
示例:使用投影限制返回字段(仅返回name和age):
db.users.find({ age: { $gt: 18 } }, { name: 1, age: 1, _id: 0 });
使用compact命令回收未使用的存储空间(需停机执行),减少内存映射文件的大小:
use admin;
db.runCommand({ compact: 'your_collection_name' });
使用repairDatabase命令整理数据文件,删除损坏或无用的数据(需停机执行):
use admin;
db.runCommand({ repairDatabase: 1 });
为临时数据(如日志、会话)设置过期时间,自动删除过期文档,释放内存:
db.logs.createIndex({ expire_at: 1 }, { expireAfterSeconds: 0 }); // 30天后过期
mongostat:查看实时操作统计(如读写次数、内存使用);mongotop:查看集合级别的读写时间(定位慢查询)。mongostat --all(显示所有集合的操作情况)。top/htop:查看MongoDB进程的内存占用(RES列为核心内存使用);free -h:查看系统内存使用情况(available列表示可用内存);vmstat 1:查看内存、Swap、IO等系统指标(每秒刷新一次)。若服务器内存不足导致系统卡顿,可通过以下命令临时释放内存(不会重启MongoDB,但会导致缓存失效,后续查询变慢):
sync; echo 3 > /proc/sys/vm/drop_caches
说明:sync命令将内存中的数据写入磁盘,echo 3清除页缓存、目录项和inode缓存。
以上方法需根据服务器配置(内存大小、CPU核心数)、业务场景(读写比例、数据量)灵活调整。建议先在测试环境验证效果,再应用到生产环境。