011.MongoDB效能監控

木二發表於2019-06-15

一 MongoDB 監控

1.1 監控概述

MongoDB自帶了mongostat 和 mongotop 這兩個命令來監控MongoDB的執行情況。這兩個命令用於處理MongoDB資料庫變慢等等問題非常有用,能詳細的統計MongoDB當前的狀態資訊。除此之外,還可以用db.serverStatus()、db.stats()、開啟profile功能通過檢視日誌進行監控分析。

1.2 模擬插入資料

  1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
  2 > use admin
  3 > db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
  4 > for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
 

二 相關命令

2.1 mongostat 命令

mongostat是mongodb自帶的狀態檢測工具,在命令列下使用。它會間隔固定時間獲取mongodb的當前執行狀態,並輸出。捕捉並返回各種型別(如插入、 查詢、 更新、 刪除等)資料庫操作的統計。
相關輸出解釋:
  1 inserts/s		#每秒插入次數
  2 query/s		#每秒查詢次數
  3 update/s		#每秒更新次數
  4 delete/s		#每秒刪除次數
  5 getmore/s		#每秒執行getmore次數
  6 command/s		#每秒的命令數,比以上插入、查詢、更新、刪除的綜合還多,還統計了別的命令
  7 dirty		#僅僅針對WiredTiger引擎,髒資料位元組的快取百分比
  8 used		#僅僅針對WiredTiger引擎,正在使用中的快取百分比
  9 flushs/s		#每秒執行fsync將資料寫入硬碟的次數。
 
注意:flushs一般都是0,間斷性會是1,通過計算兩個1之間的間隔時間,可以大致瞭解多長時間flush一次。flush開銷較大,如果頻繁的flush,可能存在異常。
  1 mapped/s		#所有的被mmap的資料量,單位是MB,
  2 vsize		#虛擬記憶體使用量,單位MB
  3 res			#實體記憶體使用量,單位MB
  4 faults/s		#每秒訪問失敗數(只有Linux有),資料被交換出實體記憶體,放到swap。不要超過100,否則就是機器記憶體太小,造成頻繁swap寫入。此時要升級記憶體或者擴充套件
  5 locked %		#被鎖的時間百分比,儘量控制在50%以下吧
  6 idx miss %		#索引不命中所佔百分比。如果太高的話就要考慮索引是不是少了
  7 q t|r|w		#當Mongodb接收到太多的命令而資料庫被鎖住無法執行完成,它會將命令加入佇列。這一欄顯示了總共、讀、寫3個佇列的長度,都為0的話表示mongo毫無壓力。高併發時,一般佇列值會升高。
  8 qr			#客戶端等待從MongoDB例項讀資料的佇列長度
  9 qw			#客戶端等待從MongoDB例項寫入資料的佇列長度
 10 ar			#執行讀操作的活躍客戶端數量
 11 aw			#執行寫操作的活客戶端數量
 
注意:如果這兩個數值很大,即DB的處理速度不及請求速度。可能存在開銷很大的慢查詢。如果查詢一切正常,確實是負載很大,可能是資源不夠。
  1 conn			#當前連線數,是qr,qw,ar,aw的總和
  2 time			#時間戳
  3 net_in			#MongoDB例項的網路進流量
  4 net_out			#MongoDB例項的網路出流量
 
注意:MongoDB為每一個連線建立一個執行緒,執行緒的建立與釋放也會有開銷,所以儘量要適當配置連線數的啟動引數,maxIncomingConnections建議在5000以下,基本滿足多數場景。
示例:
  1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
  2 > use admin
  3 > db.grantRolesToUser( "admin",[{ role: "clusterMonitor",db:"admin" }])
  4 [root@client ~]# mongostat -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin --discover -n 30 3
 
引數說明
-discover:提供叢集中所有節點的狀態;
-n 30 3:表示輸出30次,每次休眠3秒鐘。
031

2.2 mongotop 命令

mongotop也是mongodb下的一個內建工具,mongotop提供了一個方法,用來跟蹤一個MongoDB的例項,檢視哪些大量的時間花費在讀取和寫入資料。 追蹤並報告MongoDB例項當前的讀取和寫入活動,而且是基於每個集合報告這些統計資料。提供每個集合的水平的統計資料。預設情況下,mongotop返回值的每一秒。
相關輸出解釋:
  1 ns			        #資料庫名稱空間,後者結合了資料庫名稱和集合。
  2 db			        #資料庫的名稱。名為 . 的資料庫針對全域性鎖定,而非特定資料庫。
  3 total			#mongod在這個命令空間上花費的總時間。
  4 read			#在這個命令空間上mongod執行讀操作花費的時間。
  5 write			#在這個名稱空間上mongod進行寫操作花費的時間。
 
示例:
  1 [root@client ~]# mongotop -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin -n 30 3
032
引數說明
  1 -n 30 3:表示輸出30次,每次休眠3秒鐘。

2.3 profile

mongodb慢查詢檢查,Profiler預設為關閉狀態,可以選擇全部開啟,或者有慢查詢的時候開啟。
相關輸出解釋:
  1 ts			        #時間戳
  2 info			#具體的操作
  3 millis			#操作所花時間,毫秒
  4 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
  5 > use mydb
  6 > db.setProfilingLevel(2)	#開啟profile
  7 { "was" : 2, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
  8 > db.getProfilingLevel()
  9 2
 10 > use mydb
 11 switched to db mydb
 12 > db.system.profile.find().sort({$natural:-1}).pretty()	#檢視Profile日誌
 13 > db.system.profile.count()				#檢視系統中的慢查詢數量
 14 6
 
注意:profile操作必須連線mongod程式,而mongos無法執行此類操作;
造成滿查詢可能是索引的問題,也可能是資料不在記憶體造成因此磁碟讀入造成。
更多慢查詢操作見官方文件:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/

2.4 serverStatus

serverStatus命令,或mongo shell中的db.serverStatus()返回資料庫狀態的總覽,具體包括磁碟使用狀況、記憶體使用狀況、連線、日誌和可用的索引。此命令迅速返回,並不會影響MongoDB效能。
  1 > use mydb
  2 > db.serverStatus()					#只顯示部分內容
  3 {
  4 "uptime" : 21.0,					#表示此例項程式已啟用的總時間,單位是秒
  5 "localTime" : ISODate("2017-07-09T05:28:17.007Z"),	#表示例項所在伺服器的當前時間
  6 "globalLock" : {
  7         "totalTime" : NumberLong(20935000),		#資料庫啟動後執行的總時間,單位是微秒
  8         "currentQueue" : {				#表示因為鎖引起讀寫佇列數
  9             "total" : 0,
 10             "readers" : 0,				#等待讀鎖的運算元
 11             "writers" : 0				#等待寫鎖的運算元
 12         },
 13         "activeClients" : {				#連線的啟用客戶端寫操作的總數
 14             "total" : 10,
 15             "readers" : 0,				#啟用客戶端讀運算元
 16             "writers" : 0				#啟用客戶端寫運算元
 17         }
 18     },
 19     "mem" : {					#表示當前記憶體使用情況
 20         "bits" : 64,				#mongod執行的目標機器的架構
 21         "resident" : 96,				#當前被使用的實體記憶體總量,單位MB
 22         "virtual" : 271,				#MongoDB程式對映的虛擬記憶體大小,單位MB
 23         "supported" : true,				#表示系統是否支援可擴充套件記憶體
 24         "mapped" : 0,				#對映資料檔案所使用的記憶體大小,單位MB
 25         "mappedWithJournal" : 0			#對映journaling所使用的記憶體大小,單位MB
 26     },
 27 }
 
關鍵輸出:
connections:當前連線和可用連線數,設個一個合理值,當到達這個值mongodb就拒絕新的連線請求,避免連線太多而影響效能。
indexCounters:btree:misses 索引的不命中數,和hits的比例高就要考慮索引是否正確建立。

2.5 db.stats()、db.c.stats()

MongoDB資料檔案狀態指標命令: db.stats(), db.c.stats(),檢視檔案大小,儲存空間大小等。返回一份針對儲存使用情況和資料卷的文件,dbStats顯示了儲存的使用量、包含在資料庫中的資料的總量以及物件、集合和索引計數器。
示例:
  1 > use mydb
  2 > db.stats()
  3 {
  4         "db" : "mydb",				#當前資料庫
  5         "collections" : 2,				#集合數量
  6         "views" : 0,
  7         "objects" : 50007,				#物件(記錄)數量
  8         "avgObjSize" : 53.88963545103685,		#物件平均大小
  9         "dataSize" : 2694859,			#所有資料總大小
 10         "storageSize" : 917504,			#資料佔磁碟大小
 11         "numExtents" : 0,				#所有集合佔用的區間總數
 12         "indexes" : 1,				#索引數
 13         "indexSize" : 491520,			#索引大小
 14         "fsUsedSize" : 2733277184,
 15         "fsTotalSize" : 27375431680,
 16         "ok" : 1
 17 }
 
提示:MongoDB資料庫磁碟佔用大小=storageSize+indexes,壓縮比=dataSize/storageSize。

2.6 db.collection.stats()

在集合級別上提供類似dbStats的統計資料,包括集合中物件的計數、集合的大小、集合佔用的硬碟空間總量以及集合索引的相關資訊。
  1 > use mydb
  2 switched to db mydb
  3 > db.user.stats()
 

2.7 db.currentOp()

通常Mongodb的命令一般很快就完成,但是在一臺繁忙的機器或者有比較慢的命令時,可以通過db.currentOp()獲取當前正在執行的操作。
  1 > db.currentOp()
提示:若發現一個操作太長,導致資料庫卡死,可以使用db.killOp("110752")殺死。

2.8 rs.status()

MongoDB副本集狀態指標命令。
相關輸出解釋:
分段
說明
set
當前副本集名稱
date
執行命令時間
myState
當前節點的狀態(角色)
syncingTo
同步源
heartbeatIntervalMillis
心跳間隔
members
節點成員
members.id
成員編號
members.name
成員名稱
members.heath
健康狀態,1-true,0-false
members.state
成員狀態(角色)1-主節點 2-備節點 7-仲裁節點
members.stateStr
成員狀態名
members.uptime
成員啟動執行時長
members.optime
成員oplog時間戳(欄位ts)
members.optimeDate
成員oplog時間(格式化)
members.lastHeartbeat
當前節點對成員的最後一個心跳
members.lastHeartbeatRecv
當前節點收到該成員的最後一個心跳
members.pingMs
當前節點到該成員的迴路時長
members.syncingTo
成員同步源
members.electionTime
主節點選舉時間戳(ms)
members.electionDate
主節點選舉時間(格式化)
  1. 檢查每個成員的state/stateStr確認是否正常;
提示:state狀態欄位解釋可參考官方:https://docs.mongodb.com/manual/reference/replica-states/或https://yq.aliyun.com/articles/405274。
  1. 檢查每個成員的optimeDate差異,檢視複製延遲;
  2. 檢查lastHeartbeat、pingMs值排查網路延遲問題
使用db.printReplicationInfo()輸出節點oplog資訊,可在主備節點輸出對比
  1 configured oplog size:   20480MB
  2 log length start to end: 589911secs (163.86hrs)
  3 oplog first event time:  Tue Apr 03 2018 19:37:14 GMT+0800
  4 oplog last event time:   Tue Apr 10 2018 15:29:05 GMT+0800
  5 now:                     Tue Apr 10 2018 15:30:18 GMT+0800
 
主節點使用db.printSlaveReplicationInfo()可輸出備節點的同步資訊
  1 source: 135.177.126.24:10001
  2     syncedTo: Tue Apr 10 2018 15:32:45 GMT+0800
  3     0 secs (0 hrs) behind the primary
 

三 motop監控工具

3.1 motop安裝

motop是mongodb實時監控工具,可以同時對多個MongoDB伺服器進行監控,同時顯示當前操作。
語法格式:
motop [-h] [-u USERNAME] [-p PASSWORD] [-c CONF] [-V] [-K AUTOKILLSECONDS] [host [host ...]]
開源專案地址:專案地址:https://github.com/tart/motop
  1 [root@client ~]# yum -y install pymongo				#安裝以來
  2 [root@client ~]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  3 [root@client ~]# python get-pip.py
  4 [root@client ~]# yum -y install git
  5 [root@client ~]# pip install git+https://github.com/tart/motop.git
 

3.2 motop操作

q:退出
p:暫停
e:解釋查詢
k:使用“mongo”執行殺死操作
K:使用“mongo”執行殺死比給定秒數更早的操作
r:嘗試重新連線到已斷開連線的伺服器
R:嘗試重新連線到所有伺服器

3.3 配置

配置檔案:/etc/motop.conf,可以有多個配置段,每一節都可以包含以下引數。
  1 address:伺服器的地址(必需)
  2 username:登陸使用者名稱
  3 password:登陸使用者密碼
  4 status:顯示狀態(預設開啟)
  5 replicationInfo:顯示覆制狀態(預設值:開啟)
  6 replicaSet:顯示副本集的狀態(預設值:開啟)
  7 operations:顯示操作(預設值:開啟)
  8 replicationOperations:不斷展現主和從的複製操作(預設值:開啟)
  9 “DEFAULT”:是特殊的部分,引數可以在本節中設定為預設值。
 

3.4 監控

  1 [root@client ~]# motop -h				#檢視幫助
  2 [root@client ~]# vi /etc/motop.conf
  3 [MongoDB01]
  4 address=172.24.8.71
  5 username=admin
  6 password=admin
  7 replicationInfo=off
  8 
  9 [MongoDB02]
 10 address=172.24.8.72
 11 username=admin
 12 password=admin
 13 replicationInfo=off
 

四 影響效能相關因素

4.1 鎖

MongoDB用一個鎖確保資料的一致性。但如果某種操作時間執行,其他請求和操作將不得不等待這個鎖,導致系統效能降低。為了驗證是否由於鎖降低了效能,可以堅持serverStatus輸出的globalLock部分的資料。如果引數globalLock.currentQueue.total的值一直較大,說明系統中有許多請求在等待鎖,同時表明併發問題影響了系統的效能。

4.2 記憶體

MongoDB通過記憶體對映資料檔案,如果資料集很大,MongoDB將佔用所有可用的系統記憶體。正式由於記憶體對映機制將記憶體的管理交給作業系統來完成,簡化了MongoDB的記憶體管理,提高了資料庫系統的效能,但是由於不能確定資料集的大小,需要多少記憶體也是個未知數。
通過serverStatus輸出的關於記憶體使用狀態方面的資料,我們能夠深入地瞭解記憶體使用情況。檢查引數mem.resident的值,如果超過了系統記憶體量並且還有大量的資料檔案在磁碟上,表明記憶體過小。檢查mem.mapped的值,如果這個值大於系統記憶體量,那麼針對資料庫的一些讀操作將會引起作業系統的缺頁操作,記憶體的換入換出將會降低系統的效能。

4.3 連線數

有時候,客戶端的連線數超過了MongoDB資料庫伺服器處理請求的能力,這也會降低系統的效能。可以通過serverStatus輸出的關於連線數方面的引數進一步分析。引數globalLock.activeClients表示當前正在進行讀寫操作客戶端的連線數,current表示當前客戶端到資料庫例項的連線數,available表示可用連線數。對於讀操作大的應用程式,我們可以增加複製整合員數,將讀操作分發到secondary節點上,對於寫操作大的應用程式,可以通過部署分片叢集來分發寫操作。

五 Web圖形介面

5.1 開啟Web

從3.6版本後廢棄了web介面,基於安全性考慮官方不推薦開啟http。3.6之前的版本可參考官方方法開啟:
https://docs.mongodb.com/v3.2/reference/configuration-options/
 
參考連結:
https://www.cnblogs.com/littleatp/p/8419647.html
https://blog.csdn.net/Chen_Victor/article/details/74855050

相關文章