websphere MQ調優淺談

ai3707發表於2016-03-18
    隨著企業發展應用系統越來越多,各種系統之間就會出現功能呼叫,透過傳統webservice固然方便省事,可也帶來兩個問題,1、系統強關聯(一個介面掛掉可能導致另外一個系統無法使用) 2、多個系統功能穿插錯綜複雜,系統靈活性下降,此種情況下訊息中件應運而生。Websphere MQ是IBM的一款優秀訊息中介軟體。
     本文不介紹MQ的具體使用方法和概念物件,網上有不少文件資料,推薦大家看《精通 WebSphere MQ(完整版)》,在此主要介紹幾種我日常運維使用到的一些調優方法。  
   官方給出的調優策略,大家可以參考:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0712_dunn/0712_dunn.html
   

一、 與API 呼叫有關的MQ效能考慮因素

  這裡,我們在討論各個API對效能的影響時,均以C語言提供的API為例,其他開發語言與此類似。

  1 關於MQCONN/MQDISC的使用

  在MQ13個函式中,MQCONN/MQDISC是最耗CPU的兩個函式,其次是MQOPENMQCLOSE這兩個函式,因此要儘量避免必要地重複使用這幾個函式。比如,當您需要從佇列中讀取多條訊息時,正確的程式設計方法應該如下:

MQCONN

MQOPEN

MQGET

.

.

.

MQGET

MQCLOSE

MQDISC

  即:連線/斷開佇列管理器一次,開啟/關閉佇列一次,讀取訊息多次。而不應該反覆建立與佇列管理器的連線和反覆進行佇列開啟/關閉操作。

  2 MQCONNX的使用

  通常,我們使用MQCONN這個函式建立與佇列管理器的連線,除此之外,MQ支援trusted application binding,即fastpath binding,用MQCONNX來實現。當從效能方面考慮時,我們可以使用MQCONNX來提高效能。

  在使用MQCONNX時,我們可以設定MQCNO(connect option)來指定連線方式。預設情況下,該選項為MQCNO_STANDARD_BINDING,如果設定為MQCNO_FASTPATH_BINDING,即表明採用fastpath binding方式連線佇列管理器,這種應用稱為trusted application。所謂的trusted application,是指該應用程式和本地佇列管理器代理組成同一個程式,從而提高效能。利用fastpath binding不僅能夠提高連線佇列管理器的效能,同時也能夠提高mqopen,mqclose的效能。

  3 訊息大小對mqput, mqget函式耗時的影響

  儘量減小訊息的大小,小訊息的讀取效率要高。對於mqget, mqput這兩個函式而言,8k以下的訊息的耗時差別不大,8k128k的訊息的耗時隨著訊息大小的增加而增加。大於128k的訊息耗時較大,因為當與佇列相關的記憶體滿了的時候,會有硬碟交換。

  同時要注意,從傳輸效率而言,如果在廣域網上進行訊息傳輸,訊息太小會影響傳輸效率,因為對於每一訊息,MQ都會有一個訊息頭,它會佔有一定的位元組數,如果把訊息拆分太小,每個訊息的傳輸頭都會佔據一定的開銷。

  4 對一個空佇列的open,close 操作比非空佇列的同樣操作耗時要多。

  第一次open佇列耗時比接下來的open 耗時要多,對本地佇列和遠端佇列的open,close耗時基本相同。

  5 使用MQCMIT對訊息進行批處理

  當處理一批訊息時,可以採用MQCMIT函式,將若干訊息作為一個完整的交易來處理,訊息將作為一個batch統一提交,而不是一個個地分別提交,因此,可以提高效能。尤其對於永久性的訊息效果更加明顯。

  6 使用Distribution List 方式來把相同的訊息發往不同的目的地

  大家知道,MQ適用於不同型別的應用。不僅可以實現"點對點"的通訊,還透過DistributionList支援"多點廣播"應用,即能夠將訊息傳送到多個目標站點。可以使用一個MQ函式呼叫將單一訊息傳送到多個目標站點,並確保為每一站點可靠地提供資訊,減少了函式呼叫的個數。同時,MQ不僅提供了多點廣播的功能,而且還擁有智慧訊息分發功能,在將一條訊息傳送到同一系統上的多個使用者或佇列時,MQ可以將訊息的一個複製版本和該系統上接收者的名單傳送到目標系統。目標系統在本地複製這些訊息,並將它們傳送到DistributionList上的佇列,從而減少了網路的傳輸量。

   7 當向佇列管理器僅傳送一條訊息時,使用MQPUT1函式。

  在MQ13個函式中,MQPUT1實現了這樣一種功能,即它合併了MQOPEN, MQPUT, MQCLOSE三個函式的功能,在開啟佇列並且只希望傳送一條訊息時,它的CPU消耗比上述三個函式相加要少。

8 match correlation ID的方法取訊息比不匹配效能要差。

  二、 與佇列屬性有關的MQ效能考慮因素

  1 訊息的永久性和非永久性

  大家知道,MQ的訊息分為永久性訊息和非永久性訊息兩種,永久性訊息是儲存在硬碟儲存介質上的,需要紀錄日誌的;相反,非永久性訊息是儲存在記憶體中的,不需要硬碟讀寫,因此使用非永久性訊息的效能比永久性訊息的效能要高很多,具體而言,最大可以提高近十倍。要注意的是,只有永久性訊息的可靠性是可以保證的,即在發生故障,如當系統重啟或佇列管理器重啟時,可以保證不丟失。因此,應根據您的業務需求和網路狀況來確定訊息的屬性。

  2 調整佇列的相關引數設定:

  對於佇列而言,除了可以透過MQSC"define queue"命令設定它的屬性之外,有另外兩個引數直接影響佇列的效能,而這兩個引數只有透過qm.ini檔案進行設定。它們分別是:佇列檔案的大小(Maximum amount of bytes in a queue)和為每一個佇列的非永久性訊息保留的記憶體大小(Maximum amount of memory reserved for non-persistent messages),它們的預設值分別對應於DefaultQFileSizeDefaultQBufferSize這兩個引數。

  佇列的定義儲存在硬碟上,並且在佇列被開啟時申請資源。我們可以設定佇列DafaultQFileSizeDafaultQBufferSize兩個引數來確定佇列的定義引數,這些引數在佇列管理器重啟時生效,下面分別給予描述。

  1) 佇列檔案大小

  預設情況下,佇列檔案在硬碟上的大小最大是320M, 它會被預先分配195kb記憶體,這195kb記憶體會在佇列開啟時獲得。佇列檔案的大小最大值可以達到1G bytes, 這可以透過設定DefaultQFileSize引數來設定,當其設為1G時,佇列開啟時會申請350kb記憶體。

  2)非永久性訊息對應的記憶體大小

  預設情況下,對每個佇列而言,用來儲存non-persistent訊息的共享記憶體是64kb, 我們可以透過修改DafaultQBufferSize引數將其增加至1MB。在開啟佇列的時候,要申請如此數量的記憶體,因此它直接影響到佇列管理器需要的記憶體資源的大小,包括實存和虛存。推薦值是把該值設製成64kb的兩倍,即128kb。永久性訊息是存在硬碟上的,而非永久性訊息是存在記憶體中的,當設定的buffer不夠時,要進行磁碟交換,速度就會減慢,把它擴大後,若不進行硬碟交換,讀取佇列的速度就會快。當然,對該引數的修改也取決於系統實際實體記憶體的大小。

  修改這兩個引數的方法是更改佇列管理器配置檔案qm.ini的相關引數,具體方法舉例如下:

  在qm.ini檔案中增加如下一節: TuningParameters:

  DefaultQBufferSize=128000

  DefaultQFileSize =1000000000

  3 佇列的深度和佇列上的訊息的長度的設定也會影響效能。

  對每一個佇列而言,都會被分配一個設定的buffer size,當磁碟I/O很高時,說明佇列的buffer size滿了,從而產生了硬碟交換。每個訊息的大小乘以佇列的深度決定了佇列上訊息佔記憶體的大小,可以增加佇列的個數或者增加佇列的buffer size來提高效能。

  4 設定多個佇列提高並行處理能力

  例如在總部,可以針對每一個分支機構設定一個佇列,採用多個應用程式讀取這些佇列;對於同一個佇列,也可以採用多個程式/執行緒同時進行讀取操作。

  三、與日誌有關的MQ效能考慮因素:

  1 MQlog queue files 放在不同的檔案系統上。即將/var/mqm/log, /var/mqm檔案系統分開。

  在安裝MQ的時候,我們經常推薦大家建立兩個檔案系統,即/var/mqm/log/var/mqm,為了提高MQ的效能,我們建議把這兩個檔案系統放在不同的物理磁碟上,以提高磁碟I/O的效率。這是由於,在記錄資料日誌時,MQ會同時更新位於/var/mqm下的佇列檔案以及位於/var/mqm/log下的資料日誌,因此建議把它們放在不同的物理盤上。

  2 擴大MQ的日誌檔案大小和個數

  在qm.ini配置檔案中,有一小節是專門控制MQ的系統日誌的,如下所示:

Log:
LogPrimaryFiles=3
LogSecondaryFiles=2
LogFilePages=1024
LogType=CIRCULAR
LogBufferPages=17
LogPath=/var/mqm/log/QM1

  其中,LogPrimaryFilesLogSecondaryFiles指定了日誌檔案的個數,LogFilePages指定了每個日誌檔案的大小,LogBufferPages指定了日誌緩衝區的大小,這些引數都可以影響MQ的效能。

MQ常用命令:

win下使用 dspmq.exe

uninx/linux 下 
#su - mqm
#dspmq

建立佇列管理器 
crtmqm –q QMgrName 
-q是指建立預設的佇列管理器 


刪除佇列管理器 
dltmqm QmgrName 


啟動佇列管理器 
strmqm QmgrName 
如果是啟動預設的佇列管理器,可以不帶其名字 


停止佇列管理器 
endmqm QmgrName 受控停止 


endmqm –i QmgrName 立即停止 


endmqm –p QmgrName 強制停止 


顯示佇列管理器 
dspmq –m QmgrName 


執行MQ命令 
runmqsc QmgrName 
如果是預設佇列管理器,可以不帶其名字 


您現在已經建立了將訊息從傳送佇列管理器 QM_ORANGE 傳送到接收佇列管理器 QM_APPLE 上的佇列 Q1 所需的全部 WebSphere MQ 物件。下一個任務是傳送測試訊息。在傳送機器(主管佇列管理器 QM_ORANGE 的機器)上執行此任務。 
使用 amqsput 樣本程式來將訊息放入您建立的佇列。 
在 Windows 上,預設情況下樣本程式隨 WebSphere MQ 伺服器或客戶機一起安裝。在 Linux 上,需要安裝樣本程式 RPM。 
開啟命令提示符,然後按照以下步驟操作: 
啟動 amqsput 樣本程式,如下所示: 
在 Linux 上,切換到 /opt/mqm/samp/bin 目錄,然後輸入命令:./amqsput Q1 
在 Windows 上,輸入命令:amqsput Q1 
此時會顯示以下訊息: 
樣本 amqsput0 啟動 
目標佇列為 Q1 
在一行或多行上輸入某些訊息文字,然後按 Enter 鍵兩次。此時會顯示以下訊息: 
樣本 amqsput0 結束 
您在接收機器(主管佇列管理器 QM_APPLE 的機器)上執行此任務。使用 amqsget 樣本程式來從佇列中取回訊息。 
開啟命令提示符,然後按照以下步驟操作: 
啟動 amqsget 樣本程式,如下所示: 
在 Linux 上,切換到 /opt/mqm/samp/bin 目錄,然後輸入命令:./amqsget Q1 
在 Windows 上,輸入命令:amqsget Q1 
此時會啟動該樣本程式,並顯示您的訊息以及此佇列上的任何其它訊息。在短暫停留後,樣本程式結束,並再次顯示命令提示符。 


往佇列中放訊息 
amqsput QName QmgrName 
如果佇列是預設佇列管理器中的佇列,可以不帶其佇列管理器的名字 


從佇列中取出訊息 
amqsget QName QmgrName 
如果佇列是預設佇列管理器中的佇列,可以不帶其佇列管理器的名字 


啟動通道 
runmqchl –c ChlName –m QmgrName 


啟動偵聽 
runmqlsr –t TYPE –p PORT –m QMgrName 


停止偵聽 
endmqlsr -m QmgrName 


下面是在MQ環境中可以執行的MQ命令(即在runmqsc環境下可以敲的命令) 


定義持久信佇列 
DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE 


設定佇列管理器的持久信佇列 
ALTER QMGR DEADQ(QNAME) 


定義本地佇列 
DEFINE QL(QNAME) REPLACE 


定義別名佇列 
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME) 


遠端佇列定義 
DEFINE QREMOTE(QRNAME) + 
RNAME(AAA) RQMNAME(QMGRNAME) + 
XMITQ(QTNAME) 


定義模型佇列 
DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN) 


定義本地傳輸佇列 
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) + 
INITQ(SYSTEM.CHANNEL.INITQ)+ 
PROCESS(PROCESSNAME) REPLACE 


建立程式定義 
DEFINE PROCESS(PRONAME) + 
DESCR(‘STRING’)+ 
APPLTYPE(WINDOWSNT)+ 
APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’) 
其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等 


建立傳送方通道 
DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+ 
CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE 
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。 


建立接收方通道 
DEFINE CHANNEL(SDR_ TEST) CHLTYPE(RCVR) REPLACE 


建立伺服器連線通道 
DEFINE CHANNEL(SVRCONNNAME) CHLTYPE(SVRCONN) REPLACE 


顯示佇列的所有屬性 
DISPLAY QUEUE(QNAME) [ALL] 


顯示佇列的所選屬性 
DISPLAY QUEUE(QNAME) DESCR GET PUT 
DISPLAY QUEUE(QNAME)MAXDEPTH CURDEPTH 


顯示佇列管理器的所有屬性 
DISPLAY QMGR [ALL] 


顯示程式定義 
DISPLAY PROCESS(PRONAME) 


更改屬性 
ALTER QMGR DESCR(‘NEW DESCRIPTION’) 
ALTER QLOCAL(QNAME) PUT(DISABLED) 
ALTER QALIAS(QNAME) TARGQ(TARGQNAME) 


刪除佇列 
DELETE QLOCAL(QNAME) 
DELETE QREMOTE(QRNAME) 


清除佇列中的所有訊息 
CLEAR QLOCAL(QNAME) 




以下是一些高階配置的命令:


amqmcert                  配置SSL證書


amqmdain                配置windows上的MQ服務


crtmqcvx                    轉換資料


dmpmqaut                轉儲物件許可權管理


dmpmqlog                轉儲日誌管理


dspmq                         顯示佇列管理器


dspmqaut                  顯示開啟物件的許可權


dmpmqcap               顯示處理程式容量和處理程式數


dspmqcsv                 顯示命令伺服器狀態


dspmqfls                   顯示檔名


dspmqtrc                   跟蹤MQ輸出(HP-UNIX LINUX Solaris)


dspmqrtn                   顯示事務的詳細資訊


endmqcsv                 停止佇列管理器上的命令伺服器


strmqcsv                    啟動佇列管理器上的命令伺服器


endmqtrc                   停止跟蹤


rcdmqimg                  向日志寫物件的映像


rcmqobj                      根據日誌中的映像重新建立一個物件


rsvmqtrn                     提交或逆序恢復事務


做MQ遷移的一個很好用的工具:

生產環境的QM由於某種需求,要更換伺服器,又要保證在很短的時間內切換完成,那麼怎麼將原有定義的mq資源匯出來,並形成ddl指令碼呢?IBM提供了這麼一個簡單有效的匯出工具(裡面又各種平臺的匯出指令碼),可以在ibm官方網站上搜尋ms03,將它下載下來使用;注意要啟動MQ的commandserver
a),解壓:uncompress ms03_unix.tar.Z


                      tar -xvf ms03.tar


         b),修改許可權:進入到ms03目錄,執行:chmod u+x saveqmgr.linux  chown -Rf mqm:mqm ms03


   c),匯出資料(需要用mqm組使用者):./saveqmgr.linux -m QM_860000 -f test.txt
 其實saveqmgr.linux --help會得到更多的幫助,其中一個引數為:


    --remoteQmgr | -r rqmgr : is the name of the remote qmgr (XMITQ name)


    表示可以備份遠端的佇列管理器的名稱,不過要在XMITQ裡取得到。


    --resetChannels | -R [flags] : create RESET CHANNEL commands


    flags can be any combination of the follow to create RESET for that channel type:


    s (SENDER) v (SERVER) r (RECEIVER) q (REQUESTER) c (CLUSSDR) d (CLUSRCVR)


    the default is to create RESET commands for all the above channel types


    可以重置通道,等等


   d)恢復:先建立一個佇列:crtmqm -q QM_860000


                                             strmqm QM_860000


               runmqsc QM_860000 < test.txt


   okay,到此已經完全克隆了一份佇列管理器,你可以放心使用了。通道可以runing。

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

相關文章