weblogic服务器中止,在AIX上的Socket Close() 和 Poll() 线程死锁
应用:
Oracle Weblogic Server - Version: 8.1 to 10.3
IBM PS/2 AIX
IBM IA64 AIX
IBM AIX on POWER Systems (64-bit)
IBM ES9000 AIX/ESA
Bull Escala AIX
IBM RT/PC AIX
IBM 370 AIX
IBM AIX on POWER Systems (32-bit)
AIX Based Systems
现象
在IBM AIX平台上,所有的服务器中止。这中止与加载不相关,它通常会在服务器启动10分钟左右发生。一个线程转储揭露两个死锁的线程,一个执行 socket close() 另一个执行 socket poll()。例如:
'[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'' (TID:0x438F2000, sys_thread_t:0x438F9EF8, state:R, native ID:0x0037F035) prio=5
at java/net/PlainSocketImpl.socketClose0(Native Method)
at java/net/PlainSocketImpl.socketPreClose(PlainSocketImpl.java:744(Compiled Code))
at java/net/PlainSocketImpl.close(PlainSocketImpl.java:568(Compiled Code))
at java/net/SocksSocketImpl.close(SocksSocketImpl.java:1049(Compiled Code))
at java/net/Socket.close(Socket.java:1341(Compiled Code))
at weblogic/socket/WeblogicSocket.close(WeblogicSocket.java:80(Compiled Code))
at weblogic/socket/SocketMuxer.closeSocket(SocketMuxer.java:449(Compiled Code))
at weblogic/socket/SocketMuxer.cancelIo(SocketMuxer.java:773)
at weblogic/socket/SocketMuxer$TimerListenerImpl.timerExpired(SocketMuxer.java:976(Compiled Code))
at weblogic/timers/internal/TimerImpl.run(TimerImpl.java:273(Compiled Code))
at weblogic/work/SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:464(Compiled Code))
at weblogic/work/ExecuteThread.execute(ExecuteThread.java:197(Compiled Code))
at weblogic/work/ExecuteThread.run(ExecuteThread.java:172(Compiled Code))
'ExecuteThread: '7' for queue: 'weblogic.socket.Muxer'' (TID:0x3511B500, sys_thread_t:0x34FAD6C8, state:R, native ID:0x003E80CB) prio=5
at weblogic/socket/PosixSocketMuxer.poll(Native Method)
at weblogic/socket/PosixSocketMuxer.processSockets(PosixSocketMuxer.java:102)
at weblogic/socket/SocketReaderRequest.run(SocketReaderRequest.java:29)
at weblogic/socket/SocketReaderRequest.execute(SocketReaderRequest.java:42)
at weblogic/kernel/ExecuteThread.execute(ExecuteThread.java:145)
at weblogic/kernel/ExecuteThread.run(ExecuteThread.java:117)
原因
weblogic服务器测试sockets,看是否有新的活动。麻烦就是在同一时间我们也要调用socket.close() 来清理客户端存在的socket
根据IBM设计:
1.在IBM JDK SR5 和SR7之间的基础TCP socket close()实现被更改了。部分改变的是现在使用的dup2
2.因为dup2改变了,在同一时间不能够调用poll() 和close() 方法,这会造成死锁
Bug 8173442 解决了这问题
解决方案
对于 bug 8173442补丁是可用的
WLS 8.x的补丁能够在我的oracle支持里找到。打开补丁&更新标签。对于WLS 8.1mp3, 8.1mp4, a和 8.1mp5搜索补丁8173442,对于 WLS 8.1mp6搜索补丁8179792
对于WLS 9.x 以及更高版本的补丁,使用补丁号和验证码从智能更新里下载
------------------------------------------
PATCH REPOSITORY INFORMATION
------------------------------------------
WLS Version | Patch ID | Passcode
------------+----------+----------------
9.2 | T4DV | 7C7PYV9B
9.2mp1 | HZHQ | PTUYCCSI
9.2mp2 | WJD2 | GU1CW2AB
9.2mp3 | GNLT | 8J9L6Q4Y
10.0 | PMAJ | 9UQ69LLT
10.0mp1 | ITVL | K8RBHQQ2
10.3 | 9YT5 | I1DB5QSV
Fixed in: 10.0.2, 10.3.1
补丁和一个特殊的发布以及WLS维护包相绑定。例如:WLS 9.2.2的补丁有可能在WLS 9.2.3上不起作用。少数情况下,补丁也会指定特殊的操作系统。如果你对注释里概述的问题有经验,但是你WLS版本不在提供的补丁列表里,请联系技术支持,请求适合你版本的补丁。请参考注释和bug号来加快我们为你服务