首先檢查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
設置)。