Sun Java logo     上一頁      目錄      索引      下一頁     

Sun logo
Sun Java System Message Queue 3 2005Q4 管理指南 

第 12 章
排解疑難問題

本章說明如何瞭解及解決下列問題:

發生問題時,檢查所安裝的 Message Queue 軟體的版本編號,通常很有幫助。版本編號可讓您確定所用文件的編號是否與軟體版本相符。此外,向 Sun 報告問題時,也需要版本編號。若要檢查版本編號,請發出以下指令:

imqcmd -v


用戶端無法建立連線

此問題有下列徵兆:

本節提供下列幾種可能原因:

用戶端應用程式未關閉連線,導致連線數目超過資源限制

確認此問題的原因

列出所有代理程式的連線:

imqcmd list cxn

輸出會列出所有連線和建立每個連線的主機,顯示特定用戶端異常多的開啟連線。

若要解決此問題

重新寫入違例用戶端,以關閉不使用的連線。

未執行代理程式或網路連結發生問題

確認此問題的原因

若要解決此問題

連線服務不在使用中或已暫停

確認此問題的原因

檢查所有連線服務的狀態:

imqcmd list svc

如果連線服務狀態顯示如下 unknown (未知) 或 paused (暫停中),用戶端無法使用服務建立連線。

若要解決此問題

可用於所需連線數目的可用執行緒太少

確認此問題的原因

檢查代理程式記錄中是否有以下項目:

警告 [B3004]:沒有可用於服務上處理新連線的執行緒...關閉新的連線。

再使用下列其中一種格式,檢查連線服務上的連線數目和目前使用中的執行緒數目:

imqcmd query svc -n serviceName

imqcmd metrics svc -n serviceName -m cxn

每個連線均需要兩個執行緒:一個用於內送訊息,另一個用於外寄訊息 (請參閱執行緒池管理)。

若要解決此問題

Solaris 或 Linux 作業系統上要求用於連線數目的檔案描述元太少

如需有關此問題的更多資訊,請參閱設定檔案描述元限制

確認此問題的原因

檢查代理程式記錄中是否有以下相似項目:開啟的檔案太多

若要解決此問題

增加檔案描述元限制,如 ulimit 線上援助頁所述。

TCP 儲存區會限制可同時新建連線請求的數目

TCP 儲存區會在連接埠對映器拒絕其他請求前,限制同時儲存在系統儲存區內的連線請求數目 (imq.portmapper.backlog)。(在 Windows 作業系統上有程序內定的儲存區限制:Windows Desktop 的數目為 5,Windows Server 的數目為 200。)

因為不會經常出現同時有大量的連線請求,所以因儲存區限制的請求拒絕通常為短暫現象。

確認此問題的原因

檢查代理程式記錄。首先,檢查代理程式在拒絕其他連線的同時是否有接受某些連線。接著,檢查拒絕連線的說明訊息。如果找到這類訊息,可能不是 TCP 儲存區的問題,因為代理程式不記錄 TCP 儲存區造成的拒絕連線。

如果有記錄連線成功但沒有記錄拒絕連線,則可能是 TCP 儲存區的問題。

若要解決此問題

可以用以下方法來解決 TCP 儲存區限制:

作業系統會限制運作中連線的數目

Windows 作業系統授權會限制支援的同時運作遠端連線的數目。

確認此問題的原因

檢查可用於連線的執行緒數目 (使用 imqcmd query svc),並檢查 Windows 授權合約的條款。如果您是從本地用戶端建立連線,而不是從遠端用戶端,作業系統限制可能是造成此問題的原因。

若要解決此問題

使用者的認證或授權失敗

驗證可能會因為錯誤密碼而失敗,因為沒有使用者進入使用者儲存庫的項目,或因為使用者沒有存取連線服務的權限。

確認此問題的原因

檢查代理程式記錄中是否有禁用錯誤訊息的項目。這表示有驗證錯誤,但不表示為問題發生的原因。

若要解決此問題


連線流量過慢

此問題有下列徵兆:

本節提供下列幾個可能原因:

網路連線或 WAN 太慢

確認此問題的原因

偵測網路,查看偵測到網路回應所需的時間,並洽詢網路管理員。您也可以使用本地用戶端傳送和接受訊息,並與遠端用戶端 (使用網路連結) 比較傳送時間。

若要解決此問題

如果連線過慢,請升級網路連結。

連線服務協定的速度原本就比 TCP 的速度慢

例如,SSL 型或 HTTP 型協定的速度會較 TCP 的速度慢 (請參閱圖 11-5)。

確認此問題的原因

如果您使用 SSL 型或 HTTP 型的協定,請嘗試使用 TCP 並比較傳送時間。

若要解決此問題

應用程式需求通常會表示要使用的協定,所以除了如調校傳輸協定所述嘗試調校協定外,還可以執行進行一些其他作業。

連線服務協定未調校到最佳化

確認此問題的原因

嘗試調整協定,並查看是否有何差異。

若要解決此問題

嘗試調整協定,如調校傳輸協定所述。

訊息過大導致使用過多的頻寬

確認此問題的原因

嘗試以較小訊息執行效能評定。

若要解決此問題

實際上,連線流量過慢的問題,是訊息傳送程序的某些步驟中會遇到的瓶頸

確認此問題的原因

如果上述原因都不是造成連線流量速度過慢的原因,則請查閱圖 11-1,找出其他可能的瓶頸,並檢查是否有與以下問題相關的徵兆:

若要解決此問題

依照以上問題排解各節提供的問題解決方案。


用戶端無法建立訊息產生者

此問題有下列徵兆:

本節提供下列幾個可能原因:

已將實體目標配置為僅允許一定數目的產生者

若要防止實體目標上訊息累積,其中一個方法是限制實體目標可支援的產生者數目 (maxNumProducers)。

確認此問題的原因

檢查實體目標 (請參閱顯示實體目標資訊):

imqcmd query dst

輸出會顯示目前的產生者數目和 maxNumProducers 的值。如果兩個值相同,表示產生者數目到達配置的限制。代理程式拒絕新的產生者時,代理程式會傳回 ResourceAllocationException [C4088]:到達 JMS 目標限制,且在代理程式記錄中產生以下項目:[B4183]:無法將產生者新增至目標

若要解決此問題

增加 maxNumProducers 屬性的值 (請參閱更新實體目標特性)。

由於存取控制特性檔案中,未設定授權使用者建立訊息產生者

確認此問題的原因

代理程式拒絕新的產生者時,代理程式會傳回下列訊息:

代理程式也會在代理程式記錄中記錄下列項目:

若要解決此問題

變更存取控制特性,以允許使用者產生訊息 (請參閱實體目標的存取控制)。


訊息產生延遲或過慢

此問題有下列徵兆:

本節提供下列幾個可能原因:

訊息伺服器進行儲存動作並且做出降低訊息產生者速度的回應

進行儲存動作的伺服器將訊息累積在代理程式記憶體中。

實體目標中的訊息數目或訊息容量到達配置限制時,代理程式會依指定的限制運作方式,嘗試節省記憶體資源。以下限制運作方式會降低訊息產生者的速度:

同樣地,整個代理程式記憶體 (用於所有實體目標) 中的訊息數目或訊息容量到達配置限制時,代理程式會藉由拒絕最新訊息,嘗試節省記憶體資源。

再者,到達系統記憶體限制時,因為實體目標或整個代理程式的限制未正確設定,所以代理程式會採取愈來愈重要的動作,以防記憶體超過負載。這些動作包括減低訊息產生者的速度。

確認此問題的原因

代理程式因配置的訊息限制拒絕訊息時,代理程式會傳回下列訊息:

代理程式也會在代理程式記錄中記錄此項目:

此訊息後面還有一則訊息指出已經到達限制。如果訊息限制位於實體目標上,則代理程式會產生類似以下的項目:

如果訊息限制為代理程式範圍,則代理程式會產生類似以下的項目:

一般而言,您可以在拒絕訊息前檢查訊息限制條件,方法為:

若要解決此問題

有數種方法可以解決訊息儲存時造成產生者速度變慢的問題。

代理程式無法將永久性訊息儲存到資料存放區

如果代理程式無法存取資料存放區或將永久性訊息寫入資料存放區,則表示生產型用戶端被封鎖。這種情況亦會在目標或整個代理程式訊息到達限制時發生,如上所述。

確認此問題的原因

如果代理程式無法寫入資料存放區,則會在代理程式記錄中產生以下其中一個項目:[B2011]:儲存來自 connectionID 的 JMS 訊息失敗... 或 [B4004]:無法存留訊息 messageID?

若要解決此問題

代理程式確認逾時過短

由於連線速度慢或訊息伺服器緩慢 (因高 CPU 使用率或記憶體資源不足所引起),代理程式可能需要更多時間來確認永久性訊息的接收,且時間超過連線工廠的 imqAckTimeout 屬性所允許的值。

確認此問題的原因

如果超過 imqAckTimeout 的值,代理程式會傳回下列訊息:

JMSException [C4000]:資料封包確認失敗

若要解決此問題

變更 imqAckTimeout 連線工廠屬性值 (請參閱可靠性和流量控制)。

生產型用戶端受到 JVM 限制

確認此問題的原因

若要解決此問題

調整 JVM (請參閱 Java 虛擬機器調校)。


儲存訊息

此問題有下列徵兆:

本節提供下列幾個可能原因:

主題目標上有非使用中的長期訂閱

如果長期訂閱為非使用中,訊息會儲存在目標中,直到對應的用戶變為使用中狀態,且可使用這些訊息為止。

確認此問題的原因

檢查每個主題目標上的長期訂閱狀態:

imqcmd list dur -d destName

若要解決此問題

您可以採取以下任何動作:

佇列中可使用訊息的用戶太少

如果可傳送訊息的使用中用戶太少,則可以在訊息累積時儲存佇列目標。此情況會因以下任何一種原因而發生:

確認此問題的原因

若要判斷無法使用用戶的原因,請檢查目標上使用中用戶的數目:

imqcmd metrics dst -n destName -t q -m con

若要解決此問題

您可以根據無法使用用戶的原因,採取以下任何一個動作:

訊息用戶處理速度過慢,無法跟上訊息產生者的速度

在此情況下,主題使用者或佇列接收者使用訊息的速度,會比產生者傳送訊息的速度慢。因為此不平衡現象,所以會儲存一個或多個包含訊息的目標。

確認此問題的原因

檢查傳入和傳出代理程式的訊息速率:

imqcmd metrics bkr -m rts

接著檢查每個個別目標的流量速率:

imqcmd metrics bkr -t destType -n destName -m rts

若要解決此問題

用戶端確認處理會降低訊息使用速度

兩個影響用戶端確認處理的因素:

確認此問題的原因

若要解決此問題

代理程式無法跟上產生訊息的速度

在此情況下,訊息傳入代理程式的速度,會比代理程式路由和派送訊息到用戶的速度快。代理程式運作遲緩可以是因為以下任何或所有限制造成:CPU、網路套接讀/寫作業、磁碟讀/寫作業、記憶體分頁、永久存放區或 JVM 記憶體限制。

確認此問題的原因

檢查是否有其他造成此問題的原因。

若要解決此問題

用戶端程式碼缺點:用戶不確認訊息

所有用戶確認傳送的訊息前,訊息會被保留在目標中。如果用戶端不確認使用的訊息,則訊息會累積在目標中且不被刪除。

舉例來說,用戶端程式碼可能會有以下缺點:

確認此問題的原因

首先,檢查本節中列出的所有其他可能原因。然後,使用下列指令,列出目標:

imqcmd list dst

請注意 [未確認] 標頭下列出的訊息數目,是否與目標中的訊息數目相同。[未確認] 標頭下的訊息是傳給用戶但尚未確認的訊息。如果這個數目與訊息總數相同,表示代理程式已經送出所有訊息,正在等待確認。

若要解決此問題

請應用程式開發者協助除錯此問題。


訊息伺服器的流量不穩定

此問題有下列徵兆:

本節提供下列幾個可能原因:

代理程式在記憶體資源上的速度非常緩慢

因為未正確設定目標與代理程式限制,代理程式會採取越來越重要的動作,以防記憶體超過負載。另外,在清除訊息儲存前,會導致代理程式運作緩慢。

確認此問題的原因

檢查記憶體不足情況下的代理程式記錄 ([B1089]:在記憶體不足的條件下,代理程式正嘗試釋放資源),並隨附一個項目,描述新的記憶體狀態和使用的記憶體總數。

還要檢查 JVM 堆疊中可用的記憶體:

imqcmd metrics bkr -m cxn

JVM 記憶體總數接近最大 JVM 記憶體值時,可用記憶體會不足。

若要解決此問題

執行 JVM 記憶體收回 (廢棄項目收集)

會定期透過系統清除記憶體收回,釋放記憶體。發生此情況時,會阻塞所有執行緒。被釋放的記憶體容量越多,JVM 堆疊的大小就越大,且因記憶體收回的延遲時間也越長。

確認此問題的原因

監視您電腦的 CPU 使用情況。執行記憶體收回時,會大幅降低 CPU 使用。

再者,請使用以下指令行選項啟動代理程式:

-vmargs -verbose:gc

標準輸出說明執行記憶體收回的時間。

若要解決此問題

在多重 CPU 的電腦中,設定同時執行的記憶體收回:

-XX:+UseParallelGC=true

JVM 使用 Just-In-Time 編譯器來提高效能

確認此問題的原因

檢查是否有其他造成此問題的原因。

若要解決此問題

讓系統執行一段時間,效能應會改善。


訊息未送達用戶

此問題有下列徵兆:

本節提供下列幾個可能原因:

限制運作方式導致訊息在代理程式上被刪除

目標記憶體中的訊息數目或訊息容量到達配置的限制時,代理程式嘗試節省記憶體資源。代理程式會配置三個可配置的運作方式,而到達這些限制時會使訊息遺失:

代理程式記憶體中的訊息數目或訊息容量到達配置限制時,代理程式藉由拒絕最新訊息,嘗試節省記憶體資源。

確認此問題的原因

停用的訊息佇列中包含訊息 中所描述,檢查停用的訊息佇列。尤其要遵照訊息數目或訊息容量超出目標限制中的指示。尋找 REMOVE_OLDESTREMOVE_LOW_PRIORITY 原因。

若要解決此問題

增加目標限制。例如:

imqcmd update dst -n MyDest -o maxNumMsgs=1000

訊息的逾時值過期

代理程式會刪除逾時值過期的訊息。如果目標儲存足夠的訊息,則可能會刪除存在時間值過短的訊息。

確認此問題的原因

檢查停用的訊息佇列有無訊息過期。

您可以使用 QBrowser 示範應用程式,查看 DMQ 內容。QBrowser 示範程式在作業系統的特定位置中,請參閱附錄 A「Message Queue 資料的平台特定位置」,查看「範例應用程式與位置」的表格。

這是 Windows 上的呼叫範例:

cd \MessageQueue3\demo\applications\qbrowser java QBrowser

QBrowser 主視窗出現時,請選取佇列名稱 mq.sys.dmq,然後按一下 [瀏覽]。會出現類似下面的清單。

圖 12-1 QBrowser 視窗

顯示 mq.sys.dmq 訊息的 QBrowser。每個訊息都有編號、時間戳記、類型、模式和優先順序。

在訊息上連按兩下,即可顯示此訊息的詳細資訊。

圖 12-2 QBrowser 訊息的詳細資訊

訊息的詳細資訊視窗。上方窗格顯示訊息,中間窗格顯示訊息特性,下方窗格中包含訊息。

請注意訊息的 JMS_SUN_DMQ_UNDELIVERED_REASON 特性值是否為 EXPIRED

若要解決此問題

連絡應用程式開發者並增加存在時間值。

時鐘不同步

如果時鐘不同步,代理程式計算訊息的存在時間會發生錯誤,如此會導致訊息逾時並被刪除。

確認此問題的原因

查看代理程式記錄檔中有無下列訊息:B2102、B2103、B2104。這些訊息都報告偵測到時鐘可能不準。

解決問題

準備系統資源中所述,檢查是否在執行時間同步化程式。

用戶用戶端無法啟動連線上的訊息傳送

用戶端程式碼建立連線並啟動連線上的訊息傳送前,將無法傳送訊息。

確認此問題的原因

檢查用戶端程式碼是否建立連線並啟動訊息傳送。

若要解決此問題

重新寫入用戶端程式碼,以建立連線並啟動訊息傳送。


停用的訊息佇列中包含訊息

此問題有下列徵兆:

本節提供下列幾個可能原因:

訊息數目或訊息容量超出目標限制

確認此問題的原因

您可以使用 QBrowser 示範應用程式,查看停用的訊息佇列的內容。QBrowser 示範程式在作業系統的特定位置中,請參閱附錄 A「Message Queue 資料的平台特定位置」,查看「範例應用程式與位置」的表格。

這是 Windows 上的呼叫範例:

cd \MessageQueue3\demo\applications\qbrowser java QBrowser

QBrowser 主視窗出現時,請選取佇列名稱 mq.sys.dmq,然後按一下 [瀏覽]。出現 圖 12-1 中顯示的清單。

在任何訊息上連按兩下,即可顯示此訊息的詳細資訊。出現圖 12-2 中顯示的視窗。

請注意下列訊息特性值:

請注意 JMS 標頭下的 JMSDestination 值,判斷訊息將要停用的目標。

解決問題

增加目標限制。例如:

imqcmd update dst -n MyDest -o maxNumMsgs=1000

代理程式時鐘和產生者時鐘不同步

若要確認此問題的原因:

您可以使用 QBrowser 應用程式,在停用的訊息佇列中檢視訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 值,尋找原因為 EXPIRED 的訊息。

查看代理程式記錄檔中有無下列訊息:B2102、B2103、B2104。這些訊息都報告偵測到時鐘可能不準。

解決問題

準備系統資源中所述,檢查有無執行時間同步化程式。

用戶在訊息逾時前一直未收到訊息

驗證此問題的原因

您可以使用 QBrowser 應用程式,在停用的訊息佇列中檢視訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 值,尋找原因為 EXPIRED 的訊息。

檢查目標上有無任何用戶。例如:

imqcmd query dst -t q -n MyDest

檢查列出的 [目前使用中的使用者數] 值。如果有使用中用戶,下列其中一項為 true:

若要解決此問題

請應用程式開發者增加訊息存在時間值。

產生者對用戶數目而言過多

確認此問題的原因

您可以使用 QBrowser 應用程式,在停用的訊息佇列中檢視訊息的詳細資訊。檢查 JMS_SUN_DMQ_UNDELIVERED_REASON 值。

如果原因是 REMOVE_OLDESTREMOVE_LOW_PRIORITY,請使用 imqcmd query dst 指令,檢查目標上的產生者數目和用戶數目。如果產生者數目超過用戶數目,產生率可能高於使用率。

若要解決此問題

新增更多的用戶用戶端或設定目標使用 FLOW_CONTROL 限制運作方式。FLOW_CONTROL 限制運作方式是以使用率來控制產生率。

如下列範例所示,使用指令來啟動流量控制運作方式:

imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL

產生者的速度比用戶快

確認此問題的原因

若要判斷用戶速度慢是否導致產生者的速度變慢,請將目標限制運作方式設定為 FLOW_CONTROLFLOW_CONTROL 限制運作方式是以使用率來控制產生率。

如下列範例所示,使用指令來啟動流量控制運作方式:

imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL

發出下列範例中的指令,使用度量來檢查目標的輸入與輸出:

imqcmd metrics dst -n myDst -t q -m rts

檢查度量輸出中的下列值:

流量控制會針對使用調整產生,注意產生速度是否變慢或停止。如果產生率變慢或停止,表示產生者和用戶的處理速度有差異。

您也可以使用 imqcmd list dst 指令,檢查已傳送的未確認訊息數目。如果未確認的訊息數目小於目標容量,表示目標還有其他容量被用戶端的流量控制所控制。

若要解決此問題

如果要產生率一直快於使用率,請考慮定期使用流量控制讓系統步調一致。

後續幾節介紹如何解決下面的可能因素:

用戶的速度太慢

確認此問題的原因

產生者的速度比用戶快中所描述,使用度量來判斷產生率和使用率。

若要解決此問題

嘗試下列一種或多種操作:

用戶端未確定訊息

確認此問題的原因

向應用程式開發者查詢應用程式是否使用作業事件。如果應用程式使用作業事件,請如下所示列出使用中作業事件:

imqcmd list txn

下面是指令的輸出範例:

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

作業事件 ID           狀態     使用者名稱   訊息數目/確認數目       建立時間

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

6800151593984248832  STARTED  guest       3/2         7/19/04 11:03:08 AM

請注意訊息和確認的數目。

如果訊息數目大於確認數目,表示產生者可能有傳送個別訊息,但卻無法確定作業事件。代理程式收到確定後,才能路由並傳送該項作業事件的訊息。

如果確認數目大於訊息數目,表示用戶可能有傳送個別訊息,但卻無法確定作業事件。代理程式收到確定後,才能移除該項作業事件的確認。

解決問題

請連絡應用程式開發者,修正程式碼錯誤。

用戶無法確認訊息

確認此問題的原因

連絡應用程式開發者,判斷應用程式使用系統型或用戶端型的確認。如果應用程式使用系統型的確認,請略過本節。

如果應用程式用戶用戶端型的確認 (CLIENT_ACKNOWLEDGE 類型),請先減少用戶端上儲存的訊息數目。您可以使用類似下面的指令:

imqcmd update dst -n myDst -t q -o consumerFlowLimit=1

接著判斷代理程式緩衝訊息是因為用戶的速度太慢,還是用戶處理訊息的速度很快,但確認的速度不快。

使用下列指令,列出目標:

imqcmd list dst

您提供使用者名稱和密碼後,會出現類似下面的輸出:

列出指定代理程式上的所有目標:

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

主機       主要連接埠

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

localhost 7676

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

名稱         類型    狀態   產生者     用戶      訊息   未確認      平均

                                              總數              大小

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

MyDest      Queue  執行中   0          0        5    200      1177.0

mq.sys.dmq  Queue  執行中   0          0       35      0      1422.0

成功地列示目標。

未確認數目代表代理程式傳送出去後等待確認的訊息數目。如果未確認數目變大或增加,表示代理程式正在傳送訊息,不等速度較慢的用戶。您也可以看出用戶未確認訊息。

若要解決此問題

請連絡應用程式開發者,修正程式碼錯誤。

長期用戶處於非使用中

確認此問題的原因

使用下面的指令格式,查看主題的長期用戶:

imqcmd list dur -d topicName

若要解決此問題

發生非預期的代理程式錯誤

確認此問題的原因

產生者的速度比用戶快中所描述,使用 QBrowser 檢查訊息。

如果 JMS_SUN_DMQ_UNDELIVERED_REASON 值是 ERROR,表示代理程式發生錯誤。

若要解決此問題



上一頁      目錄      索引      下一頁     


文件號碼:819-3562。  Copyright © 2005 Sun Microsystems, Inc. 版權所有。