如何實現MQ佇列訊息監控

jaymarco發表於2020-09-23

1. 前言

   訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。透過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。那我們又如何去監控應用程式給MQ傳送的訊息量了,又如何去實時掌握佇列訊息的處理能力和佇列深度是否有積壓情況,MQ佇列訊息監控一直是運維人員和開發人員頭痛的一件事情,無法實時去了解MQ佇列深度情況和訊息處理的交易量。筆者針對MQ V7.0版本如何去監控某個佇列的訊息量,做了一些研究。

為了能監控MQ某個佇列的訊息量,翻閱了很多官方文件沒明確的監控方案,官方文件只提供透過修改MQ管理器的qmgr值和本地佇列的STATQ的屬性啟用能做到訊息監控。然後可以對其某個本地佇列訊息進行跟蹤監控。透過監測佇列訊息結果的Getout的值可以計算出每秒處理的訊息量。


2. 開啟qmgr和queue訊息監控屬性

監控訊息佇列時需要提前開啟以下三個屬性才能進實時監控訊息。否則訊息佇列是無法進行實時監控。

ALTER QMGR STATQ(ON)

ALTER QLOCAL(GD_JF_RT_01.LQ) STATQ(ON)

ALTER QMGR STATINT(120) ==》設定訊息生成的時間引數,此引數在監控的時候會有時延2分鐘


3. MQ狀態檢查

檢查訊息佇列引數是否正常開啟監控

dis qmgr STATQ

dis ql(GD_JF_RT_01.LQ) STATQ

Dis  QMGR STATINT


4. 模擬收發訊息指令

如把GD_JF_RT_01.LQ這個佇列當作是應用程式的本地接收佇列,現在我們用amqsput指令來模擬傳送訊息給應用程式。用amqsget指令模擬從應用程式本地佇列提取訊息。

/opt/mqm/bin/amqsput   GD_JF_RT_01.LQ QM.TEST

Hello mq!

/opt/mqm/bin/amqsget   GD_JF_RT_01.LQ QM.TEST

Hello mq!


5.  訊息監控場景測試

接下來我們針對訊息佇列監控做以下4個場景測試,測試時間在11.19.33-11.25.33之間透過amqsmon命令輸出這6分鐘內,應用程式向本地佇列GD_JF_RT_01.LQ傳送訊息,模擬應用程式正常從本地佇列GD_JF_RT_01.LQ成功提取訊息。

場景1:測試時間11:20:30 傳送3條訊息

2014年 07月 15日 星期二  11:20:30 CST

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

1

Sample AMQSPUT0 end

 

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

Sample AMQSPUT0 end

 

dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH

   105 : dis QUEUE(GD_JF_RT_01.LQ)  CURDEPTH

AMQ8409: 顯示佇列細節。

   QUEUE(GD_JF_RT_01.LQ)                   TYPE(QLOCAL)

    CURDEPTH(3)      《==== 看到當前深度為3,存在3條訊息

 

-------------------------------------------------------------------------------  

2014年 07月 15日 星期二  11:21:50 CST

場景2:測試時間:11:21:50 提取3訊息

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsget GD_JF_RT_01.LQ QM.TEST

Sample AMQSGET0 start

message <1>

message <1>

message <1>

no more messages

Sample AMQSGET0 end

 

dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH

   108 : dis QUEUE(GD_JF_RT_01.LQ)  CURDEPTH

AMQ8409: 顯示佇列細節。

   QUEUE(GD_JF_RT_01.LQ)                   TYPE(QLOCAL)

    CURDEPTH(0)       《==== 看到當前深度為0,說明訊息已經被取走

 

-----------------------------------------------------------------------------

場景3:測試時間:11:23:00   再次傳送3條訊息

2014年 07月 15日 星期二  11:23:00 CST

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

Sample AMQSPUT0 end  

 

dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH

   109 : dis QUEUE(GD_JF_RT_01.LQ)  CURDEPTH

AMQ8409: 顯示佇列細節。

   QUEUE(GD_JF_RT_01.LQ)                   TYPE(QLOCAL)

    CURDEPTH(3)    《==== 看到當前深度為3,存在3條訊息

 

-------------------------------------------------------------------------------  

2014年 07月 15日 星期二  11:24:24 CST

場景4:測試時間:11:24:24 再次傳送5條訊息

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

`

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

1

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

2

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

3

Sample AMQSPUT0 end

mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput  GD_JF_RT_01.LQ QM.TEST

Sample AMQSPUT0 start

target queue is GD_JF_RT_01.LQ

4

Sample AMQSPUT0 end 

dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH

   110 : dis QUEUE(GD_JF_RT_01.LQ)  CURDEPTH

AMQ8409: 顯示佇列細節。

   QUEUE(GD_JF_RT_01.LQ)                   TYPE(QLOCAL)

    CURDEPTH(8)       《====  此時看到當前深度為8,場景3傳送了3條,場景4發了5條                     

總共4個場景傳送了共 11 條訊息,訊息被取走了3條,接下來用監控指令碼檢視是否跟以上場景吻合。

1 、總髮送訊息統計

mqm@weblogic232:~>  /opt/mqm/samp/bin/amqsmon  -m QM.TEST -t statistics -q  GD_JF_RT_01.LQ -b -s "2014-07-15  11.19.00" -e "2014-07-15 11.26.00" |grep 'PutCount'|awk  '{print $3}'|awk -F ']' '{print $1}'| xargs | tr ' ' '+' | bc

11

 

統計結果也是11條

 

2 、取走佇列訊息統計

mqm@weblogic232:~>  /opt/mqm/samp/bin/amqsmon  -m QM.TEST -t statistics -q  GD_JF_RT_01.LQ -b -s "2014-07-15  11.19.00" -e "2014-07-15 11.26.00" |grep 'GetCount'|awk  '{print $3}'|awk -F ']' '{print $1}'| xargs | tr ' ' '+' | bc

3

 

統計結果也是3條


6.  結論

1、透過以上研究測試最終得出結論,透過開啟MQ管理器的qmgr值屬性和本地佇列的STATQ屬性,是可以實時監控mq本地佇列訊息的交易量,也能實時掌握訊息處理情況。 著重點關注這幾個引數值 PutCount、GetCount、QMaxDepth、QMinDepth。

 

2、諮詢過IBM原廠關於訊息量統計收集開啟qmgr和queue的STATQ屬性,會消耗一定的CPU和記憶體資源。具體消耗多少資源。需要根據業務量,MQ的佇列數量以及機器的負載情況有關。要想監控MQ佇列 訊息交易量還是需要發費一定的代價換取的

 

3、以下是統計6分鐘內的總訊息量。

MSGCOUNT=

 /opt/mqm/samp/bin/amqsmon  -m QM.TEST -t statistics -q  GD_JF_RT_01.LQ -b -s "2014-07-15 11.19.33"-e "2014-07-15 11.25.33" |grep 'GetCount'|awk '{print $3}'|awk -F ']''{print $1}'| xargs | tr ' ' '+' | bc

 

MQ 交易量演算法:

MQTPS (交易量)   MSGCOUNT (訊息總量)    

                 MQTIME (訊息收集時間)*60


7. 參考資料

1、開啟統計後的效能影響

www-01.ibm.com/support/docview.wss?uid=swg27022497&aid=1

2、MQ提供了一個statistics 統計的方法:

3、amqsmon examples:


有需要的朋友可以關注我的公眾號,文章每日一更


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723368/,如需轉載,請註明出處,否則將追究法律責任。

相關文章