1.故障表象描述 中间件服务器CPU异常100%,影响业务正常使用,重启中间件服务器后回复正常。一定时间以后,CPU又达到100%,影响业务正常使用。
2.分析过程登录linux系统,用top命令,查看cpu使用相关情况,找到占用cpu高的进程。其中server01,server03等的进程占用cpu非常高。针对server01,server03,继续分析。
获取server01,server03的日记文件server01.log、server03.log。并对server01、server03对应的进程,做线程快照,得到文件server01threaddump127.out、server03threddump127.out。
分析日记文件,及线程快照文件,锁定问题。从线程快照文件中,发现了大量的stuck线程,并且都有相似的堆栈,都是在调用HashMap.put方法时出现问题。导致线程超时挂起,进而导致cpu使用率异常高。
"[STUCK] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'" id=14 idx=0x70 tid=6582 prio=1 alive, daemon
at java/util/HashMap.put(HashMap.java:1681)[optimized]
at java/util/HashSet.add(HashSet.java:194)[inlined]
at weblogic/rmi/internal/dgc/DGCServerImpl.addPhantomRef(DGCServerImpl.java:136)[inlined]
at weblogic/rmi/internal/BasicServerRef.getLocalRef(BasicServerRef.java:729)[inlined]
at weblogic/rmi/internal/BasicServerRef.getStubReference(BasicServerRef.java:709)[optimized]
at weblogic/rmi/internal/OIDManager.getReplacement(OIDManager.java:180)[inlined]
at weblogic/rmi/extensions/StubFactory.getStub(StubFactory.java:62)[inlined]
at weblogic/jdbc/rmi/internal/PreparedStatementImpl.interopWriteReplace(PreparedStatementImpl.java:59)[optimized]
at weblogic/rmi/utils/io/InteropObjectReplacer.replaceObject(InteropObjectReplacer.java:43)[optimized]
at weblogic/utils/io/ChunkedObjectOutputStream.replaceObject(ChunkedObjectOutputStream.java:42)[inlined]
at weblogic/utils/io/ChunkedObjectOutputStream$NestedObjectOutputStream.replaceObject(ChunkedObjectOutputStream.java:151)[optimized]
at java/io/ObjectOutputStream.writeObject0(ObjectOutputStream.java:1045)[inlined]
at java/io/ObjectOutputStream.writeObject(ObjectOutputStream.java:302)[optimized]
at weblogic/rjvm/MsgAbbrevOutputStream.writeObject(MsgAbbrevOutputStream.java:614)
at weblogic/utils/io/ChunkedObjectOutputStream.writeObject(ChunkedObjectOutputStream.java:73)[optimized]
at weblogic/jdbc/rmi/internal/ConnectionImpl_weblogic_jdbc_wrapper_PoolConnection_oracle_jdbc_driver_T4CConnection_WLSkel.internalInvoke1(ILweblogic/rmi/spi/InboundRequest;Lweblogic/rmi/spi/OutboundResponse;Ljava/lang/Object;)Lweblogic/rmi/spi/OutboundResponse;(Unknown Source)
at weblogic/jdbc/rmi/internal/ConnectionImpl_weblogic_jdbc_wrapper_PoolConnection_oracle_jdbc_driver_T4CConnection_WLSkel.invoke(ILweblogic/rmi/spi/InboundRequest;Lweblogic/rmi/spi/OutboundResponse;Ljava/lang/Object;)Lweblogic/rmi/spi/OutboundResponse;(Unknown Source)
at weblogic/rmi/internal/BasicServerRef.invoke(BasicServerRef.java:553)[optimized]
at weblogic/rmi/internal/BasicServerRef$1.run(BasicServerRef.java:443)[inlined]
at weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)[inlined]
at weblogic/security/service/SecurityManager.runAs(SecurityManager.java:147)[inlined]
at weblogic/rmi/internal/BasicServerRef.handleRequest(BasicServerRef.java:439)[inlined]
at weblogic/rmi/internal/BasicServerRef.access$300(BasicServerRef.java:61)[inlined]
at weblogic/rmi/internal/BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:983)[optimized]
at weblogic/work/ExecuteThread.execute(ExecuteThread.java:209)[optimized]
at weblogic/work/ExecuteThread.run(ExecuteThread.java:181)
at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
-- end of trace
与Oracle原厂进行沟通,进一步锁定问题确实是HashMap方法的bug。HashMap方法是针对单线程的,在weblogic9.2.3 版本下的HashMap方法存在bug、兼容性不高,在多线程模式下容易出现stuck状态,HashMap本身在多个线程同步做get/put/remove等操作的时候,由于synchronize方面
的局限,会出现锁。
由于小版本的不同,所以bug的stackTrace与实际收集的threaddump中的stacktrace可能有一些小的差别,这是我们说‘类似’的原因。
Hashmap本身在多个线程同时做get/put/remove等操作的时候,由于synchronize方面的局限,会出现锁。实际上目前的版本中一般都已经用concurrentHashMap取代。
但是由于WLS923不会再出新的补丁,所以我们建议把与hashmap有关的类似补丁打上,以尽量避免问题。
3.故障原因
根据上述有关分析,造成本次故障的根本原因是hashmap方法是针对单线程的,在weblogic9.2.3 版本下的hashmap方法存在bug、兼容性不高,在多线程模式下容易出现stuck状态,Hashmap本身在多个线程同时做get/put/remove等操作的时候,由于synchronize方面的局限,会出现死��。
实际上目前的版本中一般都已经用concurrentHashMap取代。但是由于WLS923不会再出新的补丁,所以我们建议把与hashmap有关的类似补丁打上,以尽量避免问题。
在以往的运行环境中由于线程同步操作hashmap未达到触发条件,因此在原来的运行环境中出现故障的几率比较小,据应用厂家反馈133和135服务器在5月份时曾出现过cpu使用率100%的现象。在目前新增一台服务器的机群环境中,在遇到营销系统计划任务程序执行大量的线程数时,触发weblogic的hashmap的bug,产生大量的stuck状态的线程,引起大量线程阻塞在获取锁的过程中,从而导致cpu运行占用率非常高。
4.故障解决方案
oracle原厂建议给weblogic 9.2.3这个版本打上3个补丁p8178661_923_Generic.zip、p8311369_923_Generic.zip、p9322540_923_Generic.zip,将用concurrentHashMap替换HashMap使用。
安装补丁的步骤:
对WLS_HOME全备份、并停掉此WLS_HOME下的所有java进程。
查看此weblogic的版本
通过如下命令,进行查看:
$ . $WL_HOME/server/bin/setWLSEnv.sh
$ java weblogic.version
查看此weblogic所安装的补丁集。
通过如下命令,进行查看:
cd $WL_HOME/utils/bsu
./bsu.sh -prod_dir=<weblogic_home> -patch_download_dir=<download dir of patch> -status=applied -verbose -view
For example:
./bsu.sh -prod_dir=/opt/bea/weblogic92 -status=applied -verbose -view
安装补丁
执行如下命令,进行安装:
cd {MW_HOME}/utils/bsu directory.
./bsu.sh -install -patch_download_dir={MW_HOME}/utils/bsu/cache_dir -patchlist={PATCH_ID} -prod_dir={MW_HOME}/{WL_HOME}
2、hashMap本身的同题存在问���,因此在多线程操作时可能会被触发。建议在应用代码中尽量避免hashMap的使用。
该贴被zhang.chen编辑于2014-3-18 17:07:47