當(dāng)前位置:首頁(yè) > IT技術(shù) > 數(shù)據(jù)庫(kù) > 正文

MongoDB數(shù)據(jù)庫(kù)分析器(Database Profiler)
2021-09-05 09:11:43

數(shù)據(jù)庫(kù)分析器:

? ? ? ? ?數(shù)據(jù)庫(kù)分析器(Database Profiler)收集有關(guān)針對(duì)的mongod實(shí)例運(yùn)行操作命令的詳細(xì)信息。探查器的輸出可幫助識(shí)別效率低下的查詢(xún)和操作,這包括CRUD操作以及配置和管理命令。

? ? ? ? 分析器(Profiler)將收集到的所有信息寫(xiě)入system.profile集合,Profile集合是個(gè)有固定大小的集合(默認(rèn)1M),支持基于插入順序的插入和檢索文檔的高吞吐量操作。Profile集合的工作方式類(lèi)似于循環(huán)緩沖區(qū):一旦集合填滿(mǎn)了它所分配的空間,它就會(huì)重寫(xiě)集合中最舊的文檔,從而為新文檔騰出空間。

慢查詢(xún):

? ? ? ? 我們將超過(guò)指定時(shí)間的查詢(xún)稱(chēng)為“慢查詢(xún)”。 在MongoDB中你可以設(shè)置一個(gè)查詢(xún)時(shí)長(zhǎng)的限額值來(lái)確定是否是慢查詢(xún),默認(rèn)是100毫秒。通過(guò)這些慢查詢(xún)你可以方便的監(jiān)測(cè)這些查詢(xún)是否使用了全集合掃描或者索引掃描。

? ? ? ?MongoDB的數(shù)據(jù)庫(kù)分析器默認(rèn)是關(guān)閉的。長(zhǎng)時(shí)間開(kāi)啟會(huì)對(duì)數(shù)據(jù)庫(kù)有性能方面的影響,所以最好是使用完性能分析后,將此功能關(guān)閉,以避免以數(shù)據(jù)庫(kù)性能造成影響。

分析器開(kāi)啟:

語(yǔ)法:

db.setProfilingLevel(<level>, <options>)

參數(shù):

參數(shù) 類(lèi)型 描述
level
integer

配置分析器級(jí)別。提供以級(jí)別:

級(jí)別 描述
0 分析器已關(guān)閉,并且不收集任何數(shù)據(jù)。這是默認(rèn)的分析器級(jí)別。
1 分析器收集的數(shù)據(jù)花費(fèi)的時(shí)間超過(guò)的值slowms。
2 分析器收集所有操作的數(shù)據(jù)。

?

options document or integer

可選的。接受整數(shù)或配置文檔。如果將整數(shù)值作為options參數(shù)而不是配置文檔作為參數(shù)傳遞,則該值將分配給slowms。提供以下選項(xiàng):

slowms
默認(rèn)值:100
類(lèi)型:integer
?
慢操作的時(shí)間閾值,單位為毫秒。運(yùn)行時(shí)間超過(guò)此閾值的操作被認(rèn)為是慢查詢(xún)。

當(dāng)logLevel設(shè)置為0,MongoDB以由slowOpSampleRate確定的速率將慢速操作記錄到診斷日志中。

sampleRate
默認(rèn)值:1.0
類(lèi)型:double

慢查詢(xún)分析的百分比率。 sampleRate接受0到1之間的值(包括0和1)。

sampleRate 值默認(rèn)為1,表示都采集,0.35 表示采集35%的內(nèi)容

filter
類(lèi)型: object
過(guò)濾器表達(dá)式,控制哪些操作分析和記錄。
New?in version?4.4.2.

?

返回

該方法返回一個(gè)包含先前設(shè)置值的文檔。

  • 單機(jī)版
  • 副本集成員
  • mongos實(shí)例
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
{
   "was" : 0,
   "slowms" : 100,
   "sampleRate" : 1,
   "ok" : 1,
   "$clusterTime" : {
      "clusterTime" : Timestamp(1572991238, 1),
      "signature" : {
         "hash" : BinData(0,"hg6GnlrVhV9MAhwWdeHmHQ4T4qU="),
         "keyId" : NumberLong("6755945537557495811")
      }
   },
   "operationTime" : Timestamp(1572991238, 1)
}
{
   "was" : 0,
   "slowms" : 100,
   "sampleRate" : 1,
   "ok" : 1,
   "operationTime" : Timestamp(1572991499, 2),
   "$clusterTime" : {
      "clusterTime" : Timestamp(1572991499, 2),
      "signature" : {
         "hash" : BinData(0,"nhCquIxUw7thlrBudXe3PnsnvP0="),
         "keyId" : NumberLong("6755946491040235540")
      }
   }
}

說(shuō)明:

  • was是上一個(gè) level?設(shè)置。
  • slowms先前的 slowms 設(shè)置。
  • sampleRate先前的?sampleRate設(shè)置。
  • filter?是先前的?filter?設(shè)置. (New in MongoDB 4.4.2)
  • note 是解釋 filter 行為的字符串。此字段僅在filter也出現(xiàn)時(shí)出現(xiàn)在輸出中. (New in MongoDB 4.4.2)

?

要查看當(dāng)前配置級(jí)別,請(qǐng)參閱db.getProfilingStatus()。

使用示例:


#  為所有數(shù)據(jù)庫(kù)開(kāi)啟慢查詢(xún)記錄
db.setProfilingLevel(2)
#  指定數(shù)據(jù)庫(kù),并指定閾值慢查詢(xún) ,超過(guò)20毫秒的查詢(xún)被記錄
use test
db.setProfilingLevel(1, { slowms: 20 })
#  隨機(jī)采集慢查詢(xún)的百分比值,sampleRate 值默認(rèn)為1,表示都采集,0.42 表示采集42%的內(nèi)容。
db.setProfilingLevel(1, { sampleRate: 0.42 }) 

#記錄所有操作日志,過(guò)濾查詢(xún)操作超過(guò)2秒的
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )

# 查詢(xún)慢查詢(xún)級(jí)別和其它信息
db.getProfilingStatus()
# 僅返回慢查詢(xún)級(jí)別
db.getProfilingLevel()

?

分析日志查詢(xún):

# 查詢(xún)最近的10個(gè)慢查詢(xún)?nèi)罩?db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()

# 查詢(xún)除命令類(lèi)型為 ‘command’ 的日志
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

# 查詢(xún)數(shù)據(jù)庫(kù)為 mydb 集合為 test 的 日志
db.system.profile.find( { ns : 'mydb.test' } ).pretty()

# 查詢(xún) 低于 5毫秒的日志
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

# 查詢(xún)時(shí)間從 2012-12-09 3點(diǎn)整到 2012-12-09 3點(diǎn)40分之間的日志
db.system.profile.find({
  ts : {
    $gt: new ISODate("2012-12-09T03:00:00Z"),
    $lt: new ISODate("2012-12-09T03:40:00Z")
  }
}).pretty()

# 下面的示例查看時(shí)間范圍,將用戶(hù)字段從輸出中刪除以使其更容易閱讀,并根據(jù)每個(gè)操作運(yùn)行的時(shí)間對(duì)結(jié)果進(jìn)行排序
db.system.profile.find({
  ts : {
    $gt: new ISODate("2011-07-12T03:00:00Z"),
    $lt: new ISODate("2011-07-12T03:40:00Z")
  }
}, { user: 0 }).sort( { millis: -1 } )

system.profile集合字段解析:

{
   "op" : "query",   # 操作類(lèi)型,值可為command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update
   "ns" : "test.report", # 操作的數(shù)據(jù)庫(kù)和集合
   "command" : {     # 命令
      "find" : "report",  # 操作的集合
      "filter" : { "a" : { "$lte" : 500 } }, # 查詢(xún)條件
      "lsid" : {    
         "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") #用戶(hù)的會(huì)話(huà)id
      },
      "$db" : "test"  # 操作的數(shù)據(jù)庫(kù)
   },
   "cursorid" : 33629063128,  # query和getmore 的游標(biāo)id
   "keysExamined" : 101, # MongoDB為執(zhí)行操作而掃描的索引鍵的數(shù)量
   "docsExamined" : 101, # MongoDB為了執(zhí)行操作而掃描的集合中的文檔數(shù)。
   "numYield" : 2, # 讓步次數(shù),操作時(shí)讓其他的操作完成的次數(shù)。
   "nreturned" : 101, # 操作返回的文檔數(shù)
   "queryHash" : "811451DD", # 查詢(xún)的hash值
   "planCacheKey" : "759981BA", 
   "locks" : {  # 操作期間的鎖和所的類(lèi)型
      "Global" : {  #表示全局鎖定
         "acquireCount" : { #鎖定的次數(shù)
            "r" : NumberLong(3)  # 表示共享鎖 
         }
      },
      "Database" : {   # 數(shù)據(jù)庫(kù)鎖
         "acquireCount" : { "r" : NumberLong(1) },
         "acquireWaitCount" : { "r" : NumberLong(1) },
         "timeAcquiringMicros" : { "r" : NumberLong(69130694) }
      },
      "Collection" : {  # 集合鎖
         "acquireCount" : { "r" : NumberLong(1) }
      }
   },
   "storage" : { # 儲(chǔ)存
      "data" : {
         "bytesRead" : NumberLong(14736), #操作 從磁盤(pán)放到緩存的數(shù)據(jù)的字節(jié)數(shù)
         "timeReadingMicros" : NumberLong(17) # 操作 花費(fèi)在磁盤(pán)讀取的時(shí)間,以微妙為單位
      }
   },
   "responseLength" : 1305014, # 操作返回結(jié)果的文檔長(zhǎng)度,單位為字節(jié)
   "protocol" : "op_msg", # 消息的協(xié)議
   "millis" : 69132, # 從 MongoDB 操作開(kāi)始到結(jié)束耗費(fèi)的時(shí)間
   "planSummary" : "IXSCAN { a: 1, _id: -1 }",  # 摘要
   "execStats" : {  # 操作執(zhí)行過(guò)程中的詳細(xì)信息
      "stage" : "FETCH", # 操作形式 ,COLLSCAN 用于集合掃描,IXSCAN 用于掃描索引鍵,F(xiàn)ETCH 用于檢索文檔
      "nReturned" : 101, # 返回的文檔數(shù)量
      "executionTimeMillisEstimate" : 0,
      "works" : 101,
      "advanced" : 101,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 3,
      "restoreState" : 2,
      "isEOF" : 0,
      "invalidates" : 0,
      "docsExamined" : 101,
      "alreadyHasObj" : 0,
      "inputStage" : {
         ...
      }
   },
   "ts" : ISODate("2019-01-14T16:57:33.450Z"), #操作的時(shí)間戳
   "client" : "127.0.0.1",  # 客戶(hù)端的ip
   "appName" : "MongoDB Shell", #客戶(hù)端應(yīng)用標(biāo)識(shí)符
   "allUsers" : [
      {
         "user" : "someuser", # 用戶(hù)
         "db" : "admin"  # 驗(yàn)證的數(shù)據(jù)庫(kù)
      }
   ],
   "user" : "someuser@admin"  # 經(jīng)過(guò)驗(yàn)證的用戶(hù)
}

分析器關(guān)閉:

use test
db.setProfilingLevel(0)

?

改變分析器集合的大小:

db.setProfilingLevel(0)
db.system.profile.drop()
# 創(chuàng)建4M大小的集合
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)

?

參考文獻(xiàn):

https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/

https://www.cnblogs.com/operationhome/p/10728654.html

本文摘自 :https://blog.51cto.com/h

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >