内存是MongoDB性能的核心瓶颈,合理分配内存需平衡数据库缓存与系统可用内存。
关键配置:
cacheSizeGB参数决定了数据库缓存数据与索引的内存用量。建议设置为物理内存的50%-75%(如8GB内存服务器可设为4-6GB),避免占用过多内存导致系统交换(swap)频繁,影响性能。/etc/mongod.conf文件,在storage section下添加/修改wiredTiger.engineConfig.cacheSizeGB参数(如storage: wiredTiger: engineConfig: cacheSizeGB: 4),重启MongoDB服务使配置生效(sudo systemctl restart mongod)。cacheSizeGB设置为超过物理内存的80%,预留足够内存给系统进程(如内核、SSH)及其他应用;db.serverStatus().wiredTiger.cache命令监控缓存命中率(理想值>90%),若命中率低需考虑增加缓存大小或优化查询。存储I/O是数据库性能的另一关键瓶颈,需从硬件选择与配置优化两方面入手。
1. 硬件选择:
storage.journal.enabled: true(默认开启),保证数据持久性与崩溃恢复能力;storage.dbPath指向性能高的磁盘分区(如/mnt/ssd/mongodb),避免与系统文件共用同一分区;MongoDB的性能与CPU核心数密切相关,尤其是写密集型或复杂查询场景(如聚合管道、全文搜索)。
关键建议:
cgroups设置CPU配额),防止资源抢占。Ubuntu系统的配置需配合MongoDB的需求,减少不必要的资源消耗。
关键措施:
sudo systemctl disable <service_name>),减少系统负载;atime(文件访问时间更新):修改/etc/fstab文件,在挂载选项中添加noatime(如/dev/sda1 / ext4 noatime 0 1),减少磁盘I/O;echo never > /sys/kernel/mm/transparent_hugepage/enabled永久禁用;vm.swappiness设置为10以下(默认60),减少系统使用交换空间的概率(sudo sysctl -w vm.swappiness=10,并添加到/etc/sysctl.conf永久生效)。除内存外,还需调整MongoDB的其他配置参数,提升整体性能。
关键参数:
net.maxIncomingConnections(默认10000),根据并发连接数适当增加(如20000),避免连接拒绝;operationProfiling.slowOpThresholdMs: 100,单位毫秒),通过db.currentOp()或mongotop工具定位慢查询,优化索引;replication.replSetName: "rs0"),提升数据可靠性与读取性能;sharding.clusterRole: "shardsvr"),将数据分布到多个节点,提升写入与查询性能。资源分配需根据实际负载动态调整,监控是关键。
工具推荐:
mongostat(监控QPS、延迟)、mongotop(监控集合级读写时间)、db.serverStatus()(查看内存、CPU使用情况);top、htop、iostat);