首先检查MongoDB服务运行状态及系统资源使用情况,快速定位基础问题:
systemctl status mongod或service mongod status确认服务是否正常运行(若未运行,需查看日志排查启动失败原因)。top、htop查看CPU使用率(是否因高并发导致CPU饱和)、free -h查看内存占用(是否因内存不足触发频繁磁盘交换)、vmstat 1查看磁盘I/O(是否存在高等待时间)、iostat -x 1查看具体磁盘设备的负载情况。日志是定位性能问题的关键线索:
/var/log/mongodb/mongod.log,检查是否有错误信息(如连接拒绝、写入失败)、慢查询记录(需提前开启慢查询日志)。db.setProfilingLevel(1, 100)启用慢查询记录(阈值设为100毫秒),执行慢查询后用db.system.profile.find().sort({millis: -1}).limit(10)查看最耗时的查询,针对性优化。使用MongoDB自带工具实时监控性能指标,快速识别瓶颈:
mongostat 1(每秒刷新)观察是否有操作堆积(如insert或query列数值过高)。mongotop 1查看哪个集合消耗最多资源(如某集合的read时间远高于其他)。db.serverStatus()查看服务器整体状态(连接数、内存使用、锁争用等)、db.currentOp()查看当前正在执行的操作(识别长时间运行的查询)。索引是提升查询性能的核心,不合理索引会导致全表扫描:
.explain("executionStats")(如db.users.find({age: {$gt: 18}}).explain("executionStats")),查看executionStats.executionStages.stage(若为COLLSCAN表示全表扫描,需优化索引)。db.users.createIndex({email: 1}))、复合索引(如db.users.createIndex({age: 1, name: 1})用于age和name联合查询)、覆盖索引(索引包含查询所需的所有字段,避免回表)。select)只返回必要字段(如db.users.find({}, {name: 1, email: 1}))、限制结果集(limit(100))、避免$where(JavaScript执行慢)、使用聚合管道替代多个查询。根据硬件资源和业务需求调整MongoDB配置,释放性能潜力:
/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB(默认为物理内存的50%,可根据服务器内存调整,如16GB内存可设为8GB),确保足够内存缓存数据和索引。net.maxIncomingConnections(默认10000,根据并发连接数调整)、net.socketTimeoutMS(默认30000ms,根据网络延迟调整),避免连接超时或堆积。systemLog.verbosity设为0(默认)减少不必要的日志输出,提升性能(仅在排查问题时临时调高)。硬件资源不足是常见的性能瓶颈,需逐一排查:
fio工具测试磁盘性能(如fio --name=randread --ioengine=libaio --rw=randread --bs=4k --numjobs=4 --size=1G --runtime=60 --time_based)。lscpu查看CPU核心数。针对大规模数据或高并发场景,采用以下策略进一步提升性能:
sh.status()查看分片状态。readPreference=secondaryPreferred设置)。