MongoDB在CentOS上的卡頓通常與硬件資源不足、配置不合理、查詢效率低或索引缺失有關。以下是針對性的解決步驟,覆蓋從基礎到進階的優化方向:
升級硬件配置
優化操作系統設置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
并將上述命令添加到/etc/rc.local
中,確保開機生效。/etc/sysctl.conf
,增加以下配置(優化網絡和文件句柄限制):net.core.somaxconn = 65535 # 增加TCP連接隊列長度
vm.swappiness = 10 # 減少Swap使用(值越低,越傾向于使用物理內存)
fs.file-max = 1000000 # 提升系統最大文件句柄數
執行sysctl -p
使配置生效。/etc/security/limits.conf
,添加以下內容(針對MongoDB用戶):mongodb soft nofile 65535
mongodb hard nofile 65535
mongodb soft nproc 65535
mongodb hard nproc 65535
重啟MongoDB服務后生效。調整WiredTiger緩存大小
WiredTiger是MongoDB的默認存儲引擎,其緩存大小直接影響性能。編輯/etc/mongod.conf
,設置cacheSizeGB
為物理內存的50%-70%(避免占用過多內存導致系統交換):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 示例:8GB內存分配給WiredTiger
重啟服務使配置生效:systemctl restart mongod
。
優化日志與持久化設置
operationProfiling
模塊記錄執行時間超過閾值的查詢,幫助定位性能瓶頸:operationProfiling:
mode: slowOp # 記錄慢查詢
slowOpThresholdMs: 100 # 慢查詢閾值(毫秒)
syncPeriodSecs
(默認100ms)可減少磁盤I/O,但會略微降低數據安全性:storage:
journal:
enabled: true
commitIntervalMs: 100 # 日志提交間隔(默認100ms,可根據需求調整)
/etc/mongod.conf
:systemLog:
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen # 支持日志輪轉
結合logrotate
工具(如/etc/logrotate.d/mongod
)實現自動輪轉。配置副本集與分片(大數據量必備)
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.1.101:27017" },
{ _id: 1, host: "192.168.1.102:27017" },
{ _id: 2, host: "192.168.1.103:27017" }
]
})
user_id
、timestamp
),避免數據傾斜(如避免使用單調遞增的字段作為分片鍵)。創建高效索引
email
字段查詢用戶,執行:db.users.createIndex({ email: 1 }) // 1表示升序索引
status=1 AND create_time>='2025-01-01'
),創建復合索引:db.orders.createIndex({ status: 1, create_time: -1 }) // 覆蓋查詢條件
db.collection.getIndexes()
檢查并刪除未使用的索引。優化查詢語句
db.users.find({ status: 1 }, { name: 1, email: 1, _id: 0 }) // 僅返回name和email
skip()
(性能隨頁數增加而下降),改用基于范圍的分頁(如記錄上次查詢的_id
):// 第一頁
db.orders.find().sort({ _id: 1 }).limit(10)
// 第二頁(假設上一頁最后一條記錄的_id為123)
db.orders.find({ _id: { $gt: 123 } }).sort({ _id: 1 }).limit(10)
explain()
方法分析查詢計劃,確保查詢使用了索引:db.users.find({ email: "test@example.com" }).explain("executionStats")
若winningPlan
中stage
為COLLSCAN
(全表掃描),需優化索引。定期監控性能
mongostat
(查看每秒操作數、讀寫延遲)、mongotop
(查看集合級讀寫時間)實時監控性能。定期維護數據庫
reIndex
命令:db.users.reIndex()
mongodump
和mongorestore
定期備份,避免數據丟失。通過以上步驟,可系統性解決CentOS上MongoDB的卡頓問題。需注意的是,優化效果因業務場景而異,建議在測試環境中驗證后再應用于生產環境。