Oracle Service Bus –線程阻塞案例研究

本案例研究描述了在AIX 6.1和IBM Java VM 1.6上運行的Oracle Service Bus 11g遇到的線程阻塞問題的完整根本原因分析過程。
本文也是您提高線程轉儲分析技能的絕佳機會,我強烈建議您學習并正確理解以下分析方法。 與過早的中間件(Weblogic)重新啟動相比,它還將證明正確收集數據的重要性。

環境規格

  • Java EE服務器:Oracle Service Bus 11g
  • 操作系統:AIX 6.1
  • JDK:IBM JRE 1.6.0 @ 64位
  • RDBMS:Oracle 10g
  • 平臺類型:企業服務總線

故障排除工具

  • Quest Software Foglight for Java(監視和警報)
  • Java VM線程轉儲(IBM JRE javacore格式)

問題概述
?
從我們的Oracle Service Bus Weblogic環境中觀察到主要性能下降。 Foglight代理還發送了警報,表明Weblogic線程使用率顯著增加。

事實的收集和驗證
?
像往常一樣,Java EE問題調查需要收集技術事實和非技術事實,因此我們可以得出其他事實和/或就根本原因進行結論。 在采取糾正措施之前,要對以下事實進行核實,以便得出根本原因:

  • 對客戶有什么影響? 高
  • 受影響平臺的最近更改? 是的,在中斷報告之前,OSB控制臺中的一些業務服務的日志記錄級別已更改
  • 受影響平臺最近的流量增加了嗎? 沒有
  • 自從多久以來觀察到此問題? 日志記錄級別更改后觀察到新問題
  • 重新啟動Weblogic服務器是否可以解決問題? 是

結論1 :先前在某些OSB商業服務上應用的日志記錄級別更改似乎觸發了此線程阻塞問題。 但是,此時的根本原因仍然未知。

Weblogic線程監視:Java的Foglight
?
Foglight for Java (來自Quest Software)是一款出色的監視工具,可讓您完全監視任何Java EE環境以及完整的警報功能。 在我們的生產環境中使用此工具來監視每個Oracle Service Bus受管服務器的中間件(Weblogic)數據,包括線程。 您可以在下面看到線程的持續增加以及未決的請求隊列。

供您參考,Weblogic運行緩慢的線程被標識為“正在運行的線程”,并且如果運行幾分鐘(根據您配置的閾值),最終可以提升為“ STUCK”狀態。

現在,您下一步應該采取什么行動? Weblogic重新啟動? 絕對不是……針對此類問題的第一個“反應”是捕獲JVM線程轉儲。 此類數據對于您執行正確的根本原因分析并了解潛在的懸掛狀況至關重要。 捕獲到此類數據后,您就可以繼續執行Weblogic服務器恢復操作,例如重新啟動完全托管服務器(JVM)。

卡住的線程:線程轉儲可以進行救援!
?
此中斷場景中的下一個操作步驟是,在嘗試恢復受影響的Weblogic實例之前,從IBM JVM快速生成一些線程轉儲快照。 線程轉儲是使用kill -3 <Java PID>生成的,它確實在Weblogic域的根目錄生成了一些javacore文件。

javacore.20120610.122028.15149052.0001.txt

一旦生產環境備份并開始運行,團隊將按照以下步驟Swift進行捕獲的線程轉儲文件的分析。

線程轉儲分析步驟1 –確定線程執行模式
?
第一步分析是快速遍歷所有Weblogic線程,并嘗試確定常見的問題模式,例如從遠程外部系統等待的線程,處于死鎖狀態的線程,從其他線程等待以完成其任務的線程等。

該分析確實Swift揭示出許多線程與以下相同的阻塞情況有關。 在此示例中,我們可以在TransactionManager Java類(OSB內核代碼)中看到處于阻塞狀態的Oracle Service Bus線程。

[ACTIVE] ExecuteThread: '292' for queue: 'weblogic.kernel.Default (self-tuning)'"J9VMThread:0x0000000139B76B00, j9thread_t:0x000000013971C9A0,java/lang/Thread:0x07000000F9D80630, state:B, prio=5(native thread ID:0x2C700D1, native priority:0x5, native policy:UNKNOWN)Java callstack:at com/bea/wli/config/transaction/TransactionManager._beginTransaction(TransactionManager.java:547(Compiled Code))at com/bea/wli/config/transaction/TransactionManager.beginTransaction(TransactionManager.java:409(Compiled Code))at com/bea/wli/config/derivedcache/DerivedResourceManager.getDerivedValueInfo(DerivedResourceManager.java:339(Compiled Code))at com/bea/wli/config/derivedcache/DerivedResourceManager.get(DerivedResourceManager.java:386(Compiled Code))at com/bea/wli/sb/resources/cache/DefaultDerivedTypeDef.getDerivedValue(DefaultDerivedTypeDef.java:106(Compiled Code))at com/bea/wli/sb/pipeline/RouterRuntimeCache.getRuntime(RouterRuntimeCache.java(Compiled Code))at com/bea/wli/sb/pipeline/RouterManager.getRouterRuntime(RouterManager.java:640(Compiled Code))at com/bea/wli/sb/pipeline/RouterContext.getInstance(RouterContext.java:172(Compiled Code))at com/bea/wli/sb/pipeline/RouterManager.processMessage(RouterManager.java:579(Compiled Code))at com/bea/wli/sb/transports/TransportManagerImpl.receiveMessage(TransportManagerImpl.java:375(Compiled Code))at com/bea/wli/sb/transports/local/LocalMessageContext$1.run(LocalMessageContext.java:179(Compiled Code))at weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:363(Compiled Code))at weblogic/security/service/SecurityManager.runAs(SecurityManager.java:146(Compiled Code))at weblogic/security/Security.runAs(Security.java:61(Compiled Code))at com/bea/wli/sb/transports/local/LocalMessageContext.send(LocalMessageContext.java:144(Compiled Code))at com/bea/wli/sb/transports/local/LocalTransportProvider.sendMessageAsync(LocalTransportProvider.java:322(Compiled Code))at sun/reflect/GeneratedMethodAccessor980.invoke(Bytecode PC:58(Compiled Code))at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37(Compiled Code))at java/lang/reflect/Method.invoke(Method.java:589(Compiled Code))at com/bea/wli/sb/transports/Util$1.invoke(Util.java:83(Compiled Code))at $Proxy111.sendMessageAsync(Bytecode PC:26(Compiled Code))
……………………………

線程轉儲分析步驟2 –檢查被阻塞的線程鏈
?
下一步是檢查涉及我們確定的模式的受影響和受阻的線程鏈。 正如我們在線程轉儲分析第4部分中看到的那樣,IBM JVM線程轉儲格式包含一個單獨的部分,該部分提供了所有線程阻塞鏈的完整細分,例如Java對象監視器池鎖。

快速分析確實揭示了以下線程元兇。 如您所見,Weblogic線程#16是實際的罪魁禍首,有300多個線程正在等待獲取共享庫監視器TransactionManager @ 0x0700000001A51610 / 0x0700000001A51628上的鎖。

2LKMONINUSE      sys_mon_t:0x000000012CCE2688 infl_mon_t: 0x000000012CCE26C8:
3LKMONOBJECT       com/bea/wli/config/transaction/TransactionManager@0x0700000001A51610/0x0700000001A51628: Flat locked by "[ACTIVE] ExecuteThread: '16' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000012CA3C800), entry count 1
3LKWAITERQ            Waiting to enter:
3LKWAITER                "[STUCK] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000011C785C00)
3LKWAITER                "[STUCK] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000011CA93200)
3LKWAITER                "[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000011B3F2B00)
3LKWAITER                "[STUCK] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000011619B300)
3LKWAITER                "[STUCK] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000012CBE8000)
3LKWAITER                "[STUCK] ExecuteThread: '21' for queue: 'weblogic.kernel.Default (self-tuning)'" (0x000000012BE91200)
..................

線程轉儲分析步驟#3 –線程元兇更深入的分析
?
一旦確定了罪魁禍首,下一步就是對該線程當前正在執行的計算任務進行更深入的審查。 只需返回原始線程轉儲數據,并從下至上開始分析罪魁禍首線程堆棧跟蹤。

正如您在下面看到的那樣,針對我們的問題案例的線程堆棧跟蹤非常清楚。 它確實顯示線程#16當前正在嘗試提交在Weblogic / Oracle Service Bus級別進行的更改。 問題在于,提交操作正在掛起并且花費了太多時間,導致線程#16將來自TransactionManager的共享對象監視器鎖定保留太長時間,并使其他Oracle Service Bus Weblogic線程“饑餓”。

"[ACTIVE] ExecuteThread: '16' for queue: 'weblogic.kernel.Default (self-tuning)'"
J9VMThread:0x000000012CA3C800, j9thread_t:0x000000012C9F0F40, java/lang/Thread:0x0700000026FCE120, state:P, prio=5
(native thread ID:0x35B0097, native priority:0x5, native policy:UNKNOWN)Java callstack:at sun/misc/Unsafe.park(Native Method)at java/util/concurrent/locks/LockSupport.park(LockSupport.java:184(Compiled Code))at java/util/concurrent/locks/AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:822)at java/util/concurrent/locks/AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:853(Compiled Code))at java/util/concurrent/locks/AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1189(Compiled Code))at java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:911(Compiled Code))at com/bea/wli/config/derivedcache/DerivedCache$Purger.changesCommitted(DerivedCache.java:80)at com/bea/wli/config/impl/ResourceListenerNotifier.afterEnd(ResourceListenerNotifier.java:120)at com/bea/wli/config/transaction/TransactionListenerWrapper.afterEnd(TransactionListenerWrapper.java:90)at com/bea/wli/config/transaction/TransactionManager.notifyAfterEnd(TransactionManager.java:1154(Compiled Code))at com/bea/wli/config/transaction/TransactionManager.commit(TransactionManager.java:1519(Compiled Code))at com/bea/wli/config/transaction/TransactionManager._endTransaction(TransactionManager.java:842(Compiled Code))at com/bea/wli/config/transaction/TransactionManager.endTransaction(TransactionManager.java:783(Compiled Code))at com/bea/wli/config/deployment/server/ServerDeploymentReceiver$2.run(ServerDeploymentReceiver.java:275)at weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:321(Compiled Code))at weblogic/security/service/SecurityManager.runAs(SecurityManager.java:120(Compiled Code))at com/bea/wli/config/deployment/server/ServerDeploymentReceiver.commit(ServerDeploymentReceiver.java:260)at weblogic/deploy/service/internal/targetserver/DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:195)at weblogic/deploy/service/internal/targetserver/DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:13)at weblogic/deploy/service/internal/targetserver/DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:68)at weblogic/work/SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:528(Compiled Code))at weblogic/work/ExecuteThread.execute(ExecuteThread.java:203(Compiled Code))at weblogic/work/ExecuteThread.run(ExecuteThread.java:171(Compiled Code))

根本原因:連接點
?
在這一點上,事實和線程轉儲分析的收集確實使我們能夠確定事件鏈如下:

  • 生產Oracle Service Bus管理員應用的日志記錄級別更改
  • Weblogic部署線程#16無法正確提交更改
  • 快速執行客戶端請求的Weblogic運行時線程開始排隊并等待共享對象監視器(TransactionManager)上的鎖定
  • Weblogic實例的線程不足,生成警報并迫使生產支持團隊關閉并重新啟動受影響的JVM進程

我們的團隊計劃不久后開放一個Oracle SR,以共享此OSB部署行為以及客戶端請求(線程)和OSB日志記錄層之間的硬依賴性。 在此期間,除非另行通知,否則不會在維護時段內嘗試更改OSB日志記錄級別。

結論
?
我希望本文能幫助您理解和理解強大的線程轉儲分析功能,以查明線程阻塞問題的根本原因,以及任何Java EE生產支持團隊捕獲此類重要數據以防止將來再次發生的重要性。 請不要猶豫,發表任何評論或問題。

參考: Oracle服務總線–我們JCG合作伙伴 Pierre-Hugues Charbonneau的“ 阻塞線程”案例研究 ,位于Java EE支持模式和Java教程博客。


翻譯自: https://www.javacodegeeks.com/2012/08/oracle-service-bus-stuck-thread-case.html

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

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

相關文章

java 可以重載等于號碼_Java面試之Java基礎4——重載與重寫的區別

目錄重載與重寫的概念重載與重寫的區別重載與重寫的總結構造器是否能被重寫override為什么函數不能根據返回類型來區分重載重載與重寫的概念重載&#xff1a;同樣一個方法可以根據輸入參數列表的不同&#xff0c;做出不同的處理。普通方法和構造器方法都能夠重載。方法重載&…

二維數組、多維數組

二維數組&#xff1a; 定義二維數組 int[,] myArray new int[幾個一維數組,數組中的個數]; 數組可以具有多個維度。例如&#xff0c;下列聲明創建一個四行兩列的二維數組(可以理解為4個1維數組&#xff0c;數組中包含2個元素)&#xff1a; int[,] myArray new int[4,2]; int[…

一張大圖片有多個小圖片

這個頁面也是我看到別人的寫的&#xff0c;感覺不錯&#xff0c;就自己留下了為了以后自己可以容易找到&#xff0c;也希望可以方便到別人。 寫這個頁面 需要注意的是&#xff1a; 1.寫每一個小圖片的位置時候&#xff0c;要用id,這樣等級就高了&#xff0c;不然不起作用。 2.因…

java中如何調用dal接口案例_關于Java:接口的目的

好吧&#xff0c;我認為接口是一種強制對象實現一定數量功能的方法&#xff0c;而不必使用繼承。有點像合同。我半明白他們的意思。但是&#xff0c;如果界面中的所有內容都是&#xff1a;public interface animal{void eat(object food);}它沒有這樣的實現&#xff0c;那么無論…

Android Studio混淆

這一篇說一下Android Studio的代碼混淆&#xff1a; 第一步&#xff1a;要想使混淆生效&#xff0c;要修改項目&#xff08;App&#xff09;下的build.gradle一處內容&#xff1a;minifyEnabled 的值 設置為true&#xff0c;當前項目就可以使用混淆了。 apply plugin: com.and…

內存訪問模式很重要

在高性能計算中&#xff0c;通常會說高速緩存未命中的代價是算法的最大性能損失。 多年來&#xff0c;處理器速度的提高大大超過了延遲到主內存的速度。 通過更寬的多通道總線&#xff0c;到主內存的帶寬已大大增加&#xff0c;但是延遲并未顯著減少。 為了掩蓋這種延遲&#x…

上傳頭像將光標去掉

οnfοcus"this.blur();" unselectable"on" οnfοcus"this.blur();"支持火狐&#xff0c;谷歌等主流瀏覽器 unselectable支持ie瀏覽器轉載于:https://www.cnblogs.com/jar-gon/p/6841239.html

java底層 文件操作_JAVA的文件操作【轉】

11.3 I/O類使用由于在IO操作中&#xff0c;需要使用的數據源有很多&#xff0c;作為一個IO技術的初學者&#xff0c;從讀寫文件開始學習IO技術是一個比較好的選擇。因為文件是一種常見的數據源&#xff0c;而且讀寫文件也是程序員進行IO編程的一個基本能力。本章IO類的使用就從…

JAVA多線程,真的能提高效率嗎

舉個栗子 比如挖一個隧道&#xff0c;有2種開工方法1、只在山的一頭挖&#xff0c;直至挖到山的另一頭&#xff0c;從而打通隧道&#xff0c;這可以看成是單線程 2、在山的兩頭挖&#xff0c;同時開工&#xff0c;最后在山的中間接通&#xff0c;從而打通隧道&#xff0c;這感覺…

Java 8:測試Lambda水

Java 8大約有一年的時間了&#xff0c;它具有我非常期待的語言功能&#xff1a; Lambda Expression 。 令人遺憾的是&#xff0c;另一個重要功能Java平臺模塊已延遲到Java9。但是&#xff0c;將lambda表達式&#xff08;或閉包&#xff09;添加到該語言中將使Java編程變得更好。…

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作&#xff0c;順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西&#xff0c;發現工作流引擎和神經網絡還是頗有一些相似之處&#xff0c;都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統&#xff0c;我們只要有了一個原始Git版本倉庫&#xff0c;就可以讓其他主機克隆走這個原始版本倉庫&#xff0c;從而使得一個Git版本倉庫可以被同時分布到不同的主機之上&#xff0c;并且每臺主機的版本庫都是一樣的&#xff0c;沒有主…

Java執行程序服務類型

ExecutorService功能是Java 5附帶的。它擴展了Executor接口&#xff0c;并提供了線程池功能來執行異步簡短任務。 使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。 ExecutorService execService Executors.newCachedThreadPool&#xff08;&#xff09;; 這…

MySQL的主動優化和被動優化_MySQL“被動”性能優化匯總!

年少不知優化苦&#xff0c;遇坑方知優化難。 ——村口王大爺本文內容導圖如下&#xff1a;我之前有很多文章都在講性能優化的問題&#xff0c;比如下面這些&#xff1a;當然&#xff0c;本篇也是關于性能優化的&#xff0c;那性能優化就應該一把梭子嗎&#xff1f;還是要符合一…

python2

一、管理庫的安裝 安裝pip 提示報錯&#xff1a;安裝pip提示No module named setuptools Windows環境下Python默認是沒有安裝setuptools這個模塊的&#xff0c;這也是一個第三方模塊。下載地址為http://pypi.python.org/pypi/setuptools。下載后直接運行ez_setup.py 參考地址&…

Java Mybatis

Mybatis轉載于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看錯誤消息java.lang.NoSuchMethodError&#xff0c;您可能會理解Java虛擬機正在嘗試向我們表明您調用的方法在類或接口中不可用。 您還可能在執行沒有公共static void main&#xff08;&#xff09;方法的類時拋出此錯誤。要了解其背后的原因&#xff0c;請閱讀本文。 …

【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述平面上有n個點(n<100)&#xff0c;每個點的坐標均在-10000&#xff5e;10000之間。其中的一些點之間有連線。若有連線&#xff0c;則表示可從一個點到達另一個點&#xff0c;即兩點間有通路&#xff0c;通路的距離為兩點間的…

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…