在探索 MongoDB 性能監控的過程中,我爬了一堆文章,最後總結一系列我認為很重要的關鍵指標,本文將藉著實務經驗分享我們該如何使用各項查詢指令,並分析這些關鍵指標代表什麼意義,幫助我們了解系統運行狀況,及早發現潛在問題並及時採取優化措施。
透過 db.rawdata.stats()
檢視集合的基本資訊:
{
count: 3109528, // 文件總數
size: 22859420160, // 原始數據大小(約 21.3 GB)
avgObjSize: 7351, // 平均每筆文件大小(約 7.2 KB)
storageSize: 3371008000, // 實際存儲大小(約 3.14 GB)
totalIndexSize: 63892480, // 索引總大小(約 61 MB)
nindexes: 2 // 索引數量
}
通過 db.serverStatus().mem
檢視系統記憶體使用情況:
{
bits: 64,
resident: 5813, // 實際使用的實體記憶體(約 5.8 GB)
virtual: 6266, // 虛擬記憶體使用量(約 6.3 GB)
supported: true
}
通過 db.serverStatus().wiredTiger
檢視存儲引擎效能指標:
cache: {
'maximum bytes configured': 8589934592, // 配置的最大快取大小(8 GB)
'bytes currently in the cache': 6442450944,// 當前使用的快取(6 GB)
'pages requested from the cache': 11958296,// 快取頁面請求總數
'pages read into cache': 203920, // 從磁碟讀入的頁面數
'pages written from cache': 423890, // 寫入磁碟的頁面數
'modified pages evicted': 156789, // 被逐出的已修改頁面數
'unmodified pages evicted': 234567 // 被逐出的未修改頁面數
}
connection: {
'total read I/Os': 3109528, // 總讀取操作次數(與文件數相當)
'total write I/Os': 89756, // 總寫入操作次數
'total fsync I/Os': 15678, // 檔案同步操作次數
'total read time (usecs)': 892345,
'total write time (usecs)': 234567
}
cursor: {
'cursor create calls': 3893410, // 游標創建次數(約為文件數的 1.25 倍)
'cursor next calls': 15547640, // 游標遍歷次數(約為文件數的 5 倍)
'cursor search calls': 3109528, // 精確查詢次數(與文件數相當)
'cursor search near calls': 1554764 // 範圍查詢次數(約為文件數的 0.5 倍)
}
transaction: {
'transaction begins': 567890,
'transaction commits': 456789,
'transaction rollbacks': 12345,
'transactions rolled back by conflict': 234
}
好的,明明是因為系統曾經出現 oom-kill
(記憶體使用達上限導致服務強制中斷),才開啟我的優化之路的,結果現在卻是機制良好、運作順暢?!
其實是因為我寫這篇文章時,並不是用量尖峰時期,那要怎麼觀察用量尖峰的狀態呢?
下一篇我會寫如何實作 MongoDB 簡易的監控方式,幫助我們捕捉到尖峰時的崩潰是怎麼發生的,進而採取下一步調整,敬請期待!