011.MongoDB性能監控

一 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
相關文章
相關標籤/搜索