通常在排查MongoDB的性能時,我們首先想到的是MongoDB自身內置的兩個監測命令工具:mongostat和mongotop,通過這兩個命令的輸出可以了解到當前MongoDB實例的讀寫情況,現介紹它們的使用,環境為linux環境。
1、mongostat命令
在運行mongod實例的linux機器上運行如下命令:
mongostat --host ip:port -u "用戶名" -p "密碼" --authenticationDatabase "admin"
(1)參數說明
- ip:MongoDB集群中的路由服務器IP地址或者是某個副本集中主從庫的IP地址
- port:路由服務器IP對應的端口號,或者副本集中主從庫IP對應的端口號
- 用戶名和密碼:與上述ip、port所在的機器保持一致,都是相應管理員的賬號和密碼,若服務器上沒有添加權限認證的話,可以不用設置這些參數
- authenticationDatabase:必須是admin庫
(2)效果圖
在上圖中,mongostat命令默認是每隔一秒輸出一行數據。
(3)mongostat輸出字段說明
字段名稱 | 解釋描述 |
insert | 每秒插入次數 |
query | 每秒查詢次數 |
update | 每秒更新次數 |
delete | 每秒刪除次數 |
getmore | 每秒執行getmore次數 |
command | 每秒的命令數,除了插入、查找、更新、刪除命令統計外,還統計了別的命令 |
flushes | 對於WiredTiger引擎來說,是指checkpoint的觸發次數在一個輪詢間隔期間 對於MMAPv1 引擎來說,是指每秒執行fsync將數據寫入硬盤的次數 一般flushes都是0,間斷性會是1, 通過計算兩個1之間的間隔時間,可以大致了解多長時間flush一次。 flush開銷是很大的,如果頻繁的flush,就需要排查一下原因了 |
mapped | 所有的被mmap的數據量 |
vsize | 虛擬內存使用量(在mongostat最后一次調用的總數據) |
res | 物理內存使用量(在mongostat最后一次調用的總數據) vsize一般不會有大的變動, res會慢慢的上升,如果res經常突然下降,就需要排查一下是否存在其他的程序正在消費內存 |
faults | 每秒訪問失敗數,與內存swap有關 |
qrw | 客戶端讀寫等待隊列數量,高並發時,一般隊列值會升高 |
arw | 客戶端讀寫活躍個數 |
net_in | 網絡帶寬壓力,MongoDB實例的網絡進流量 |
net_out | 網絡帶寬壓力,MongoDB實例的網絡出流量 |
conn | 打開連接的總數,是qr,qw,ar,aw的總和 MongoDB為每一個連接創建一個線程,線程的創建與釋放也會有開銷,所以盡量要適當配置連接數的啟動參數maxIncomingConnections |
time | 時間戳 |
(4)官方介紹
2、mongotop命令
在運行mongod實例的linux機器上運行如下命令:
mongotop --host ip:port -u "用戶名" -p "密碼" --authenticationDatabase "admin" 60
(1)參數說明
- ip:必須是分片集群中主從庫的IP地址
- port:必須是分片集群中主從庫的端口號
- 用戶名和密碼:分片集群中副本集管理員權限的賬號,若沒有添加任何用戶的話,那么可以不用設置用戶名和密碼
- authenticationDatabase:必須是admin庫
- 60:表示每隔一分鍾就輸出一組數據,若不設置這個參數的話,那么默認是每隔一秒就輸出一組數據
(2)效果圖
在上圖中,我們看到兩組數據相差一秒鍾。
(3)mongotop輸出字段說明
字段名出 | 解釋說明 |
ns | 全稱namespace,由庫名+點號+集合名組成 |
total | 指定周期內每次統計mongod實例的讀寫總耗時時長 (在上圖中指定的周期是60秒,默認是1秒) |
read | 指定周期內每次統計的讀操作耗時時長 (在上圖中指定的周期是60秒,默認是1秒) |
write | 指定周期內每次統計的寫操作耗時時長 (在上圖中指定的周期是60秒,默認是1秒) |
(4)官方介紹