MongoDB狀態值

_梓傑_發表於2020-10-24

一、db.serverStatus()

1.1 鎖資訊

鎖定模式描述
R表示共享(S)鎖。
W表示排他(X)鎖。
r表示意圖共享(IS)鎖。
w表示Intent Exclusive(IX)鎖。
rs0:PRIMARY> db.serverStatus().locks
{
    "ParallelBatchWriterMode" : {                       //並行批處理寫入模式下的鎖資訊,4.2新增
        "acquireCount" : {
            "r" : NumberLong(190252)
        }
    },
    "ReplicationStateTransition" : {                //複製狀態轉換的鎖定資訊,4.2新增
        "acquireCount" : {                                      //在該模式下需要獲取的鎖資源資訊
            "w" : NumberLong(1046893),
            "W" : NumberLong(2)
        },
        "acquireWaitCount" : {                              //由於鎖衝突,在獲取鎖資源時鎖等待的次數
            "w" : NumberLong(1)
        },
        "timeAcquiringMicros" : {                           //持有鎖的累計時間
            "w" : NumberLong(10527)
        }
    },
    "Global" : {                                                        //全域性鎖
        "acquireCount" : {
            "r" : NumberLong(1027547),
            "w" : NumberLong(19341),
            "W" : NumberLong(5)
        },
        "acquireWaitCount" : {
            "w" : NumberLong(1),
            "W" : NumberLong(1)
        },
        "timeAcquiringMicros" : {
            "w" : NumberLong(11191),
            "W" : NumberLong(90)
        }
    },
    "Database" : {                                                  //資料庫級別鎖
        "acquireCount" : {
            "r" : NumberLong(693553),
            "w" : NumberLong(2778),
            "W" : NumberLong(24)
        },
        "acquireWaitCount" : {
            "r" : NumberLong(1),
            "W" : NumberLong(2)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(11088),
            "W" : NumberLong(143)
        }
    },
    "Collection" : {                                                //集合級別鎖
        "acquireCount" : {
            "r" : NumberLong(186641),
            "w" : NumberLong(2773),
            "R" : NumberLong(1),
            "W" : NumberLong(18)
        },
        "acquireWaitCount" : {
            "r" : NumberLong(1)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(22532)
        }
    },
    "Mutex" : {                                                         //mytex互斥鎖
        "acquireCount" : {
            "r" : NumberLong(674754)
        }
    },
    "oplog" : {                                                         //oplog鎖
        "acquireCount" : {
            "r" : NumberLong(502132),
            "w" : NumberLong(2),
            "W" : NumberLong(1)
        }
    }
}

1.2 全域性鎖資訊

rs0:PRIMARY> db.serverStatus().globalLock
{
    "totalTime" : NumberLong("2651301900000"),      //自上次發生lock以來的時間
    "currentQueue" : {          //鎖等待佇列資訊
        "total" : 0,            //因為鎖而產生的排隊的總數
        "readers" : 0,          //等待讀鎖而產生的排隊數(kQueuedReader)
        "writers" : 0           //等待寫鎖而產生的排隊數(kQueuedWriter)
    },
    "activeClients" : {         //活躍連線數資訊
        "total" : 38,           //當前活躍連線數
        "readers" : 0,          //當前執行讀操作的活躍連線數(kActiveReader)
        "writers" : 0           //當前執行寫操作的活躍連線數(kActiveWriter)
    }
}

1.3 記憶體資訊

rs0:PRIMARY> db.serverStatus().mem
{ "bits" : 64,                              //當前mongod體系架構為64位(32/64)
  "resident" : 86,                      //當前使用的RAM量(以兆位元組(MB)為單位)
  "virtual" : 1788,                     //mongod程式使用的虛擬記憶體的總量(以兆位元組(MB)為單位),如果該值顯著增加表示可能存在記憶體洩漏
  "supported" : true                    //底層系統是否支援擴充套件記憶體資訊
 }

1.4 assert資訊

rs0:PRIMARY> db.serverStatus().asserts      //自mongod程式啟動以來引發的斷言數目的文件
{
    "regular" : 0,                          //
    "warning" : 0,                          //自mongod程式啟動以來引發的警告數
    "msg" : 0,                                  //
    "user" : 1683,                          //自mongod程式啟動以來引發的“使用者斷言”數
    "rollovers" : 0
}

1.5 連線資訊

rs0:PRIMARY> db.serverStatus().connections
{ "current" : 2,                            //當前連線數
  "available" : 1998,               //目前仍可允許的最大連線數
  "totalCreated" : 3,               //mongod建立的連線數(包括已經關閉的連線數)
  "active" : 1                              //當前活躍連線數
}

1.6 網路流量

rs0:PRIMARY> db.serverStatus().network
{
    "bytesIn" : NumberLong(41312),                          //網路入流量
    "bytesOut" : NumberLong(1757153),                       //網路出流量
    "physicalBytesIn" : NumberLong(41312),
    "physicalBytesOut" : NumberLong(1757153),
    "numRequests" : NumberLong(214),                        //網路請求次數,為bytesIn、bytesOut提供上下文
    "compression" : {
        "snappy" : {
            "compressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            },
            "decompressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            }
        },
        "zstd" : {
            "compressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            },
            "decompressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            }
        },
        "zlib" : {
            "compressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            },
            "decompressor" : {
                "bytesIn" : NumberLong(0),
                "bytesOut" : NumberLong(0)
            }
        }
    },
    "serviceExecutorTaskStats" : {
        "executor" : "passthrough",
        "threadsRunning" : 2
    }
}

1.7 操作延時資訊

rs0:PRIMARY> db.serverStatus().opLatencies
{
    "reads" : {                                                             //讀請求延時資訊
        "latency" : NumberLong(242),
        "ops" : NumberLong(2)
    },
    "writes" : {                                                            //寫請求延時資訊
        "latency" : NumberLong(14718),
        "ops" : NumberLong(4)
    },
    "commands" : {                                                      //資料庫命令延遲資訊
        "latency" : NumberLong(122386),
        "ops" : NumberLong(215)
    },
    "transactions" : {
        "latency" : NumberLong(0),
        "ops" : NumberLong(0)
    }
}

1.8 各Read Concern級別運算元

rs0:PRIMARY> db.serverStatus().opReadConcernCounters
{                                                                           //自mongod程式啟動以來各個read concern級別運算元
    "available" : NumberLong(0),
    "linearizable" : NumberLong(0),
    "local" : NumberLong(0),
    "majority" : NumberLong(0),
    "snapshot" : NumberLong(0),
    "none" : NumberLong(8584)
}

1.9 複製資訊

rs0:PRIMARY> db.serverStatus().repl
{
    "hosts" : [
        "192.168.0.199:27017"                                       //當前副本整合員資訊
    ],
    "setName" : "rs0",
    "setVersion" : 1,
    "ismaster" : true,                                              //當前節點是否為primary節點
    "secondary" : false,                                            //當前節點是否為secondry節點
    "primary" : "192.168.0.199:27017",              //primariy資訊
    "me" : "192.168.0.199:27017",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "lastWrite" : {
        "opTime" : {
            "ts" : Timestamp(1591517114, 1),
            "t" : NumberLong(1)
        },
        "lastWriteDate" : ISODate("2020-06-07T08:05:14Z"),
        "majorityOpTime" : {
            "ts" : Timestamp(1591517114, 1),
            "t" : NumberLong(1)
        },
        "majorityWriteDate" : ISODate("2020-06-07T08:05:14Z")
    },
    "rbid" : 1                                                              //回滾識別符號
}

1.10 儲存引擎資訊

rs0:PRIMARY> db.serverStatus().storageEngine
{
    "name" : "wiredTiger",                                              //儲存引擎
    "supportsCommittedReads" : false,                           //是否支援Read concert的“majorty”
    "oldestRequiredTimestampForCrashRecovery" : Timestamp(1591517334, 1),
    "supportsPendingDrops" : false,
    "dropPendingIdents" : NumberLong(0),
    "supportsSnapshotReadConcern" : true,
    "readOnly" : false,
    "persistent" : true,                                                    //是否支援持久化到磁碟
    "backupCursorOpen" : false
}

二、db.stats()

2.1 檢視某個資料庫統計資訊

db.db_name.stats() 或者db.runCommand({dbStats : 1,scale : 1073741824})可檢視某個資料庫下資料儲存佔用的統計資訊。

1)兩種檢視資料庫統計資訊方法

use db
db.stats()

use db
db.runCommand({dbStats : 1,scale : 1073741824})   //scale指定單位為GB

2)重要引數解釋

rs0:PRIMARY> db.stats()
{
    "db" : "test",                                          //資料庫名稱
    "collections" : 13,                 //集合數
    "views" : 0,
    "objects" : 106703,                 //文件數
    "avgObjSize" : 76.03043025969279,   //每個文件的平均大小(位元組為單位)
    "dataSize" : 8112675,               //未壓縮資料總大小;
                                                                            MMAPv1儲存引擎下,datasize包含預分配空間和填充因子,該大小因文件減小而減小;
                                                                            WiredTiger儲存引擎下,datasize可能要比storagesize大,該大小會隨著文件的減小而減小
    "storageSize" : 2797568,            //實際佔用磁碟空間總大小(壓縮後),該值不會隨著文件的remove或者減小而減小,如果儲存引擎開啟compression的情況下,該值可能會比dataSize小。
    "numExtents" : 0,
    "indexes" : 14,                     //索引數目
    "indexSize" : 2560000,              //索引大小
    "fsUsedSize" : 29936922624,
    "fsTotalSize" : 37688381440,
    "ok" : 1,
    "operationTime" : Timestamp(1557390462, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1557390462, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

2.2 檢視某個集合統計資訊

use db
db.collbame.stats()

use db
db.runCommand({"collStats":"oplog.rs",scale:1048576})  //scale指定單位,單位為MB

三、db.currentOp()

3.1 db.currentOp()檢視當前資料庫會話執行情況。

db.currentOp()
或者
db.currentOp(
   {
     "active" : true,
     "secs_running" : { "$gt" : 3 },
     "ns" : /^db1\./
   }
)

3.2 重點關注

client          #請求是由哪個客戶端發起
opid            #操作的opid,可以通過 db.killOp(opid) 直接殺掉會話
secs_running/microsecs_running
                #這個值重點關注,代表請求執行的時間,如果這個值特別大,就得注意了,看看請求是否合理
query/ns:       #這個能看出是對哪個集合正在執行什麼操作
lock*:         #還有一些跟鎖相關的引數

3.3 關於kill會話

1)斷開MongoDB Shell後,連線會關閉,但是連線請求的執行緒並沒有結束,直到命令執行完畢,執行緒給客戶端返回結果時,發現連線已經關閉時才會退出執行緒。

2)MongoDB並不是傳送完killOp後請求就會立刻結束

當連線對應的服務執行緒在程式碼邏輯上儲存了killPending欄位時程式碼會不斷呼叫該引數檢查判斷killPending的狀態。

傳送killOp後,請求要執行到下一個【檢查點】,判斷killPending=1後才會殺掉當前會話。

3.4 殺掉慢會話

> db.killOp(380692)
{ "info" : "attempting to kill op" }

3.5 db.killOp(opid)的實現原理

  每個連線對應的服務執行緒儲存了一個killPending的欄位,當傳送killOp時,會將該欄位置1;請求在執行過程中,可以通過不斷的呼叫OperationContext::checkForInterrupt()來檢查killPending是否被設定,如果被設定,則執行緒退出。
  一個請求要支援killOp,必須在請求的處理邏輯里加上checkForInterrupt()檢查點才行,否則即使傳送了killOp,也只能等待請求完全處理完畢執行緒才會退出。

相關文章