MongoDB性能監控工具

mongostat

mongostat是MongoDB自帶的監控工具,其可以提供數據庫節點或者整個集群當前的狀態視圖。該功能的設計非常類似于Linux系統中的vmstat命令,可以呈現出實時的狀態變化。不同的是,mongostat所監視的對象是數據庫進程。mongostat常用于查看當前的QPS/內存使用/連接數,以及多個分片的壓力分布。mongostat采用Go語言實現,其內部使用了db.serverStatus()命令,要求執行用戶需具備clusterMonitor角色權限。

mongostat -h 192.168.65.174 --port 28017 -ufox -pfox --authenticationDatabase=admin --discover -n 300 2

參數說明:

  • -h:指定監聽的主機,分片集群模式下指定到一個mongos實例,也可以指定單個mongod,或者復制集的多個節點。
  • --port:接入的端口,如果不提供則默認為27017。
  • -u:接入用戶名,等同于-user。
  • -p:接入密碼,等同于-password。
  • --authenticationDatabase:鑒權數據庫。
  • --discover:啟用自動發現,可展示集群中所有分片節點的狀態。
  • -n 300 2:表示輸出300次,每次間隔2s。也可以不指定“-n 300”,此時會一直保持輸出。

指標說明

指標名

說明

inserts

每秒插入數

query

每秒查詢數

update

每秒更新數

delete

每秒刪除數

getmore

每秒getmore數

command

每秒命令數,涵蓋了內部的一些操作

%dirty

WiredTiger緩存中臟數據百分比

%used

WiredTiger 正在使用的緩存百分比

flushes

WiredTiger執行CheckPoint的次數

vsize

虛擬內存使用量

res

物理內存使用量

qrw

客戶端讀寫等待隊列數量,高并發時,一般隊列值會升高

arw

客戶端讀寫活躍個數

netIn

網絡接收數據量

netOut

網絡發送數據量

conn

當前連接數

set

所屬復制集名稱

repl

復制節點狀態(主節點/二級節點……)

time

時間戳

mongostat需要關注的指標主要有如下幾個:

  • 插入、刪除、修改、查詢的速率是否產生較大波動,是否超出預期。
  • qrw、arw:隊列是否較高,若長時間大于0則說明此時讀寫速度較慢。
  • conn:連接數是否太多。
  • dirty:百分比是否較高,若持續高于10%則說明磁盤I/O存在瓶頸。
  • netIn、netOut:是否超過網絡帶寬閾值。
  • repl:狀態是否異常,如PRI、SEC、RTR為正常,若出現REC等異常值則需要修復。

使用交互模式

mongostat一般采用滾動式輸出,即每一個間隔后的狀態數據會被追加到控制臺中。從MongoDB 3.4開始增加了--interactive選項,用來實現非滾動式的監視,非常方便。

mongostat -h 192.168.65.174 --port 28017 -ufox -pfox --authenticationDatabase=admin --discover --interactive -n 2

mongotop

mongotop命令可用于查看數據庫的熱點表,通過觀察mongotop的輸出,可以判定是哪些集合占用了大部分讀寫時間。mongotop與mongostat的實現原理類似,同樣需要clusterMonitor角色權限。

mongotop -h 192.168.65.174 --port=28017 -ufox -pfox --authenticationDatabase=admin

默認情況下,mongotop會持續地每秒輸出當前的熱點表

指標說明

指標名

說明

ns

集合名稱空間

total

花費在該集合上的時長

read

花費在該集合上的讀操作時長

write

花費在該集合上的寫操作時長

mongotop通常需要關注的因素主要包括:

  • 熱點表操作耗費時長是否過高。這里的時長是在一定的時間間隔內的統計值,它代表某個集合讀寫操作所耗費的時間總量。在業務高峰期時,核心表的讀寫操作一般比平時高一些,通過mongotop的輸出可以對業務尖峰做出一些判斷。
  • 是否存在非預期的熱點表。一些慢操作導致的性能問題可以從mongotop的結果中體現出來

mongotop的統計周期、輸出總量都是可以設定的

#最多輸出100次,每次間隔時間為2smongotop -h 192.168.65.174 --port=28017 -ufox -pfox --authenticationDatabase=admin -n 100 2

Profiler模塊

Profiler模塊可以用來記錄、分析MongoDB的詳細操作日志。默認情況下該功能是關閉的,對某個業務庫開啟Profiler模塊之后,符合條件的慢操作日志會被寫入該庫的system.profile集合中。Profiler的設計很像代碼的日志功能,其提供了幾種調試級別:

級別

說明

0

日志關閉,無任何輸出

1

部分開啟,僅符合條件(時長大于slowms)的操作日志會被記錄

2

日志全開,所有的操作日志都被記錄

對當前的數據庫開啟Profiler模塊:

# 將level設置為2,此時所有的操作會被記錄下來。db.setProfilingLevel(2)#檢查是否生效db.getProfilingStatus()

  • slowms是慢操作的閾值,單位是毫秒;
  • sampleRate表示日志隨機采樣的比例,1.0則表示滿足條件的全部輸出。

如果希望只記錄時長超過500ms的操作,則可以將level設置為1

db.setProfilingLevel(1,500)

還可以進一步設置隨機采樣的比例

db.setProfilingLevel(1,{slowms:500,sampleRate:0.5})

查看操作日志

開啟Profiler模塊之后,可以通過system.profile集合查看最近發生的操作日志

db.system.profile.find().limit(5).sort({ts:-1}).pretty()

這里需要關注的一些字段主要如下所示:

  • op:操作類型,描述增加、刪除、修改、查詢。
  • ns:名稱空間,格式為{db}.{collection}。
  • Command:原始的命令文檔。
  • Cursorid:游標ID。
  • numYield:操作數,大于0表示等待鎖或者是磁盤I/O操作。
  • nreturned:返回條目數。
  • keysExamined:掃描索引條目數,如果比nreturned大出很多,則說明查詢效率不高。docsExamined:掃描文檔條目數,如果比nreturned大出很多,則說明查詢效率不高。
  • locks:鎖占用的情況。
  • storage:存儲引擎層的執行信息。
  • responseLength:響應數據大小(字節數),一次性查詢太多的數據會影響性能,可以使用limit、batchSize進行一些限制。
  • millis:命令執行的時長,單位是毫秒。
  • planSummary:查詢計劃的概要,如IXSCAN表示使用了索引掃描。
  • execStats:執行過程統計信息。
  • ts:命令執行的時間點。

根據這些字段,可以執行一些不同維度的查詢。比如查看執行時長最大的10條操作記錄

查看某個集合中的update操作日志

db.system.profile.find().limit(10).sort({millis:-1}).pretty()

查看某個集合中的update操作日志

db.system.profile.find({op:"update",ns:"shop.user"})

注意事項

  • system.profile是一個1MB的固定大小的集合,隨著記錄日志的增多,一些舊的記錄會被滾動刪除。
  • 在線上開啟Profiler模塊需要非常謹慎,這是因為其對MongoDB的性能影響比較大。建議按需部分開啟,同時slowms的值不要設置太低。
  • sampleRate的默認值是1.0,該字段可以控制記錄日志的命令數比例,但只有在MongoDB 4.0版本之后才支持。
  • Profiler模塊的設置是內存級的,重啟服務器后會自動恢復默認狀態。

db.currentOp()

Profiler模塊所記錄的日志都是已經發生的事情,db.currentOp()命令則與此相反,它可以用來查看數據庫當前正在執行的一些操作。想象一下,當數據庫系統的CPU發生驟增時,我們最想做的無非是快速找到問題的根源,這時db.currentOp就派上用場了。

db.currentOp()讀取的是當前數據庫的命令快照,該命令可以返回許多有用的信息,比如:

  • 操作的運行時長,快速發現耗時漫長的低效掃描操作。
  • 執行計劃信息,用于判斷是否命中了索引,或者存在鎖沖突的情況。
  • 操作ID、時間、客戶端等信息,方便定位出產生慢操作的源頭。

對示例操作的解讀如下:

(1)從ns、op字段獲知,當前進行的操作正在對test.items集合執行update命令。

(2)command字段顯示了其原始信息。其中,command.q和command.u分別展示了update的查詢條件和更新操作。

(3)"planSummary":"COLLSCAN" 說明情況并不樂觀,update沒有利用索引而是正在全表掃描。(4)microsecs_running:NumberLong(186070)表示操作運行了186ms,注意這里的單位是微秒。

優化方向:

  • value字段加上索引
  • 如果更新的數據集非常大,要避免大范圍update操作,切分成小批量的操作

opid表示當前操作在數據庫進程中的唯一編號。如果已經發現該操作正在導致數據庫系統響應緩慢,則可以考慮將其“殺”死

db.killOp(4001)

db.currentOp默認輸出當前系統中全部活躍的操作,由于返回的結果較多,我們可以指定一些過濾條件:

  • 查看等待鎖的增加、刪除、修改、查詢操作
db.currentOp({waitingForLock:true,$or:[{op:{$in:["insert","update","remove"]}},{"query.findandmodify":{$exists:true}}]})
  • 查看執行時間超過1s的操作
db.currentOp({secs_running:{$gt:1}})查看test數據庫中的操作
db.currentOp({ns:/test/})

currentOp命令輸出說明

  • currentOp.type:操作類型,可以是op、idleSession、idleCursor的一種,一般的操作信息以op表示。其為MongoDB 4.2版本新增功能。
  • currentOp.host:主機的名稱。currentOp.desc:連接描述,包含connectionId。currentOp.connectionId:客戶端連接的標識符。currentOp.client:客戶端主機和端口。currentOp.appName:應用名稱,一般是描述客戶端類型。
  • currentOp.clientMetadata:關于客戶端的附加信息,可以包含驅動的版本。currentOp.currentOpTime:操作的開始時間。MongoDB 3.6版本新增功能。
  • currentOp.lsid:會話標識符。MongoDB 3.6版本新增功能。
  • currentOp.opid:操作的標志編號。
  • currentOp.active:操作是否活躍。如果是空閑狀態則為false。
  • currentOp.secs_running:操作持續時間(以秒為單位)。
  • currentOp.microsecs_running:操作持續時間(以微秒為單位)。
  • currentOp.op:標識操作類型的字符串。可能的值是:"none" "update" "insert""query""command" "getmore" "remove" "killcursors"。其中,command操作包括大多數命令,如createIndexes和findAndModify。
  • currentOp.ns:操作目標的集合命名空間。
  • currentOp.command:操作的完整命令對象的文檔。如果文檔大小超過1KB,則會使用一種$truncate形式表示。
  • currentOp.planSummary:查詢計劃的概要信息。
  • currentOp.locks:當前操作持有鎖的類型和模式。
  • currentOp.waitingForLock:是否正在等待鎖。
  • currentOp.numYields:當前操作執行yield(讓步)的次數。一些鎖互斥或者磁盤I/O讀取都會導致該值大于0。
  • currentOp.lockStats:當前操作持有鎖的統計。
  • currentOp.lockStats.acquireCount:操作以指定模式獲取鎖的次數。
  • currentOp.lockStats.acquireWaitCount:操作獲取鎖等待的次數,等待是因為鎖處于沖突模式。acquireWaitCount小于或等于acquireCount。
  • currentOp.lockStats.timeAcquiringMicros:操作為了獲取鎖所花費的累積時間(以微秒為單位)。timeAcquiringMicros除以acquireWaitCount可估算出平均鎖等待時間。
  • currentOp.lockStats.deadlockCount:在等待鎖獲取時,操作遇到死鎖的次數。

注意事項

  • db.currentOp返回的是數據庫命令的瞬時狀態,因此,如果數據庫壓力不大,則通常只會返回極少的結果。
  • 如果啟用了復制集,那么currentOp還會返回一些復制的內部操作(針對local.oplog.rs),需要做一些篩選。
  • db.currentOp的結果是一個BSON文檔,如果大小超過16MB,則會被壓縮。可以使用聚合操作$currentOp獲得完整的結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62133.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62133.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux下的python打包

linux下的python打包 一、pyinstaller 優點:打包簡單,將整個運行環境進行打包 缺點:打包文件大、臃腫、啟動慢 安裝pyinstaller包 pip install pyinstaller 打包一個文件 pyinstaller -D app.py會在當前路徑中生成build、dist文件夾還有…

Python模塊之random、hashlib、json、time等內置模塊語法學習

Python內置模塊語法學習 random、hashlib、json、time、datetime、os等內置模塊語法學習 模塊 簡單理解為就是一個.py后綴的一個文件 分為三種: 內置模塊:python自帶,可調用第三方模塊:別人設計的,可調用自定義模塊…

從ctfwiki開始的pwn之旅 5.ret2csu

ret2csu 原理 在 64 位程序中,函數的前 6 個參數是通過寄存器傳遞的,但是大多數時候,我們很難找到每一個寄存器對應的 gadgets。 這時候,我們可以利用 x64 下的 __libc_csu_init 中的 gadgets。這個函數是用來對 libc 進行初始…

Ceph對象存儲

Ceph對象存儲1.概念對象存儲(Object Storage)是一種用于存儲大量非結構化數據的架構模型它使用簡單的HTTP或HTTPS協議進行文件訪問,而不是傳統的文件系統API與傳統的文件系統存儲方式不同,對象存儲不是將數據存儲在目錄或文件夾中…

嵌入式藍橋杯學習拓展 LCD翻轉顯示

通過配置SS和GS兩個標志位,實現掃描方向的切換。 將lcd.c的REG_932X_Init函數進行部分修改。 將LCD_WriteReg(R1, 0x0000);修改為LCD_WriteReg(R1,0x0100); 將LCD_WriteReg(R96, 0x2700); 修改為LCD_WriteReg(R96, 0xA700); void REG_932X_Init1(void) {LCD_Wr…

小程序 —— Day1

組件 — view和scroll-view view 類似于HTML中的div,是一個塊級元素 案例:通過view組件實現頁面的基礎布局 scroll-view 可滾動的視圖區域,用來實現滾動列表效果 案例:實現縱向滾動效果 scroll-x屬性:允許橫向滾動…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服務端和本地的關聯關系即可

pubmed關鍵詞搜索技能1:待更新

1,白話變為領域內學術詞: 例如,我想要做蛋白質糖基化修飾以功能,這個領域課題,則 第一性原理,首先是拆分詞匯:糖基化(一般比蛋白質、修飾、功能要在title中更常見,或者是…

iPhone手機清理軟件:相冊清理大師推薦

隨著智能手機成為我們日常生活的必需品,手機中的數據日益膨脹,尤其是照片和視頻這類容易積累的文件。對于iPhone用戶來說,管理這些文件,特別是清理相冊變得尤為重要。本文將介紹一款備受推崇的iPhone手機清理軟件——CleanMyPhone…

SpringBoot 開源停車場管理收費系統

一、下載項目文件 下載源碼項目文件口令: 【前端小程序地址】(3.0):伏脂火器白澤知洞座/~6f8d356LNL~:/【后臺管理地址】(3.0):伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【崗亭端地址】(3.0):動作火器智匯堂多好/~dd69356K6r~:/復制口令…

網絡原理之 TCP 協議

目錄 1. TCP 協議格式 2. TCP 原理 (1) 確認應答 (2) 超時重傳 (3) 連接管理 a) 三次握手 b) 四次揮手 (4) 滑動窗口 (5) 流量控制 (6) 擁塞控制 (7) 延時應答 (8) 捎帶應答 3. TCP 特性 4. 異常情況的處理 1) 進程崩潰 2) 主機關機 (正常流程) 3) 主機掉電 (…

STM32使用RCC(Reset Clock Contorl,復位時鐘控制器)配置時鐘以及時鐘樹

RCC主要作用 設置系統時鐘SYSCLK(System Clock)頻率;設置AHB、APB2、APB1以及各個外設分頻因子,從而設置HCLK、PCLK2、PCLK1以及各個外設的時鐘頻率;控制AHB、APB2、APB1這三條總線時鐘以及每個外設的時鐘開啟&#xf…

安防視頻監控平臺Liveweb視頻匯聚管理系統管理方案

智慧安防監控Liveweb視頻管理平臺能在復雜的網絡環境中,將前端設備統一集中接入與匯聚管理。國標GB28181協議視頻監控/視頻匯聚Liveweb平臺可以提供實時遠程視頻監控、視頻錄像、錄像回放與存儲、告警、語音對講、云臺控制、平臺級聯、磁盤陣列存儲、視頻集中存儲、…

PostGIS的歷史發展

自從 GIS 軟件開發以來,ShapeFile等格式被廣泛用于存儲空間數據,但這些文件格式文件需要特殊的軟件才能讀取和寫入,并發用戶可能會導致數據損壞和速度變慢,并且復雜的問題需要復雜的軟件來處理。 因此,對多用戶的支持、…

【目標跟蹤】AntiUAV600數據集詳細介紹

AntiUAV600數據集的提出是為了適應真實場景,即無人機可能會隨時隨地出現和消失。目前提出的Anti-UAV任務都只是將其看做與跟蹤其他目標一樣的任務,沒有結合現實情況考慮。 論文鏈接:https://arxiv.org/pdf/2306.15767https://arxiv.org/pdf/…

“原批教育家”原批之星魯健的杰作——原批俱樂部

偉大的原批教育家——原批之星,名為魯健,是一位在南京郵電大學智能科學與技術專業中嶄露頭角的杰出人物。他不僅以其卓越的黑客技術和對網絡正義的執著而聞名,更是“遠古四神”之一,以其對原批之力的深刻理解和不同見解&#xff0…

IS-IS三

目錄 點到點鄰接關系建立 ISIS修改鏈路類型 isis ppp-negotiation 3-way only 僅才用三次握手建立鄰居 不向下兼容兩次握手 兩次握手 自身發送的(Hello報文)IIH 不攜帶 p2p adj TLV 不處理點到點鄰接狀態TLV 三次握手 …

Hadoop生態圈框架部署 偽集群版(四)- Zookeeper單機部署

文章目錄 前言一、Zookeeper單機部署(手動部署)1. 下載Zookeeper安裝包到Linux2. 解壓zookeeper安裝包3. 配置zookeeper配置文件4. 配置Zookeeper系統環境變量5. 啟動Zookeeper6. 停止Zookeeper在這里插入圖片描述 注意 前言 本文將詳細介紹Zookeeper的…

Spring的三層架構實現原理

Spring三層架構實現 三層架構 controller: 控制層,接受前端發送的請求,對請求進行處理并相應數據;service: 業務邏輯層,處理具體的業務邏輯;dao: 數據訪問層(Data Access Object) 持久層,負責數據訪問操作,包括數據的增、刪、改、查。controller 層: @RestContro…

《Java核心技術I》volatile字段

volatile字段 有多處理器的計算機能夠暫時在寄存器或本地內存緩存中保存內存值,其結果是,運行在不同處理器上的線程可能看到同一個內存位置上有不同的值。編譯器可以改變指令執行的順序以使吞吐量更大化,編譯器不會選擇可能改變代碼語義的順…