关于WebLogicNative IO1

(一)  原理简单说明1

(二)  执行队列和执行线程的相关配置1

(三)  套接字复用器的相关配置2

WebLogic如何更换64位JDK2

 关于WebLogicNative IO

()  原理简单说明 

服务器启动,就会绑定到相应的端口,并为一个端口分配一个线程以接受连接请求,一旦服务器接受到连接请求并建立好连接以后,监听线程将处理权交给套接字复用器,套接字复用器进行一定的处理,并会负责选择利用那个执行队列并将请求置入其中。当有一个请求进入执行队列,就会有一个空闲的执行线程从该队列里面取走并向调用者返回结果。 

()  执行队列和执行线程的相关配置 

执行线程数量有一定的限制,在服务器启动的时候,就已经形成了一个含有一定数量执行线程的池,执行线程可能跨 servlet  ejb  jdbc 等,由于执行线程仅当程序成功结束或者出现异常才能被释放继续处理其他请求,所以如果执行线程执行的不够快,而请求又多的情况下,就会造成执行队列的阻塞。 

相关的配置信息有: 

server 菜单 —  configuration  --- 〉高级配置 ---  Config Execute Queues 中的配置项如下: 

1、 Queue Length 队列长度,执行队列的长度 

2、 Queue Length Threshold Percent 一个百分数,当 request 的数量达到队列长度的这个比例的时候, weblogic 会发出 overflow 的标志信息。 

3、 Thread Count 服务器初始创建的执行线程的数量 

4、 Thread Increase 如果 weblogic 发出 overflow 的标志信息, weblogic 会尝试增加这个数量的执行线程,以解决处理矛盾。 

5、 Threads Maximum 最大执行线程数 

6、 Threads Minimum 最小执行线程数 

7、 Thread Priority 线程优先级 

另外 server 菜单 —  configuration  ---  tuning 子页中还有一些相关的配置: 

1、  Stuck Thread Max Time 黏联线程时间,超过这个时间没有返回的执行线程,系统将认为是黏联线程。 

2、  Stuck Thread Timer Interval 系统检查黏联线程的时间间隔 

如果 weblogic 认为某个队列中的所有的线程全部黏联的话, weblogic 将会增加执行线程的数量。 

注意:执行线程的数量一旦增加,目前 weblogic 不会去减少他,如果增加了一些线程以后再次出现 overflow 的警告, weblogic 会继续增加执行线程的数量,一直到达到上限为止。 

()  套接字复用器的相关配置 

Weblogic 带有两个版本的套接字复用器,纯 java 版和本地接口版( jni ),一般来说在访问量小的情况下, java 版比 jni 版性能要好一些,因为 jni  API 调用会损失一部分性能,但是访问量大的情况,一般都是 jni 版的性能比较好,所以尽量保证 weblogic 实用本地接口版的套接字复用器  

相关的配置参数有两个,在 server 菜单 —  configuration  ---  tuning 子页中的第一个和第二个配置项。 

Enable Native IO :启用本地 IO ,勾选这个配置以后, weblogic 就会启用本地接口版的套接字复用器 

Socket Readers :如果不选上一个选项,则这个选项可用,也就是说 java 版的套接字复用器会被启用,并且, java 版的复用器会从执行线程中抽出这个比例的线程用于处理 socket 的请求。( java 客户端访问有关  

WebLogic如何更换64位JDK

 

使用32位JDK时,JVM一般设置最大设置为1.7G,而现在服务器普遍内存都很大,当然可以通过多个server建立垂直集群来更好的利用资源,但不妨使用64位JDK。虽然WebLogic可以直接在setDomainEnv里指定JAVA_HOME来更改JDK,但肯定会遇到BEA-000438的错,原因在于缺少对应64位JDK的native io libaray(位于weblogic/server/native)。一种方式是从别处拷贝一份过来,还有一种是下载wls_generic.jar形式的安装文件,而不是已经带有JDK的。然后下载64位JDK安装(Jrockit下载),用java –jar wls_generic.jar来安装就可以了。
————————————————————————————
附一个错误分析,和native libaray相关,但并不是由于64位的关系,而是没有执行权限。
启动过程中发现
<Apr 28, 2010 6:27:15 PM GMT+08:00> <Error> <Socket> <BEA-000438> <Unable to loa 
d performance pack. Using Java I/O instead. Please ensure that a native performa 
nce library is in: ‘/opt/java1.5/jre/lib/IA64N:/opt/java1.5/jre/lib/IA64N/server 
:/opt/java1.5/jre/../lib/IA64N::/opt/weblogic/bea/weblogic90/server/native/hpux1 
1/IPF64:/opt/weblogic/bea/weblogic90/server/native/hpux11/PA_RISC:/opt/weblogic/ 
bea/weblogic90/server/native/hpux11/PA_RISC/oci920_8:/usr/lib’
没有启动native io,导致系统性能低下(这里要注意HP-UX里IA64N下的是32位JDK,IA64W下的才是64位JDK),而且java io配置的值较小,产生如下报错
<Apr 28, 2010 6:15:03 PM GMT+08:00> <Warning> <Socket> <BEA-000402> <There are: 
5 active sockets, but the maximum number of socket reader threads allowed by the 
configuration is: 4. You may want to alter your configuration.>
在应用使用过程中从而出现
<Apr 28, 2010 6:14:10 PM GMT+08:00> <Error> <Console> <BEA-240003> <Console enco 
untered the following error javax.servlet.jsp.JspException: Broken pipe (errno:3 
2) 
         at com.bea.console.taglib.html.tree.TreeTag.print(TreeTag.java:231) 
         at com.bea.console.taglib.html.tree.TreeTag.doEndTag(TreeTag.java:192)
观察控制台的thread信息
Self-Tuning Thread Pool     
Active Execute Threads     Execute Thread Total Count     Execute Thread Idle Count     Queue Length     Pending User Request Count     Completed Request Count     Hogging Thread Count     Standby Thread Count     Throughput     Health 
16     58     15     6048     0     144840     4     38     4.577865205875421     OK
排队的请求数多达6000个,导致了OutOfMemory,在JAVA堆还很空的情况下
观察发现/opt/weblogic/bea/weblogic90/server/native/hpux11/IPF32下面和native io相关的libmuxer.so没有执行权限,chmod +x 后再次启动错误信息不再出现

WebLogic-BEA-000402

启动wls服务后的错误信息如下:
<BEA-000402> <There are: 5 active sockets, but the maximum number of socket reader threads allowed by the configuration is: 4. You may want to alter your configuratio

错误的原因
<BEA-000438> <Unable to load performance pack. Using Java I/O instead. Please ensure that 
libmuxer library is in :'/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java5_64/jre/bin/classic:
/usr/java5_64/jre/bin:/wls/weblogic/bea/patch_weblogic923/profiles/default/native:/wls/weblogic/bea/
weblogic92/server/native/aix/ppc:/usr/java5_64/jre/bin/j9vm:/usr/lib'> 


解决的方法

1.Weblogic Native IO 启用失败时,通常会在服务器启动日志中报如下错误:
<Error> <Socket> <BEA-000438> <Unable to load performance pack. Using Java I/O instead. 
Please ensure that libmuxer library is in :'/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java5_64/jre/bin/classic:/usr/java5_64/jre/bin
:/weblogic/bea/wlserver_10.0/server/native/aix/ppc:/usr/java5_64/jre/bin/j9vm:/usr/lib'

Weblogic Native IO 启用失败,通常是由于系统没有使用与Weblogic 相对应的的JDK版本所致。
2.如果是AIX OS,AIX Weblogic 支持32位和64位的JDK,如果使用64位版本的JDK,需在启动脚本中加指向64位对应的目录,
同时在commEnv.sh 配置文件中,/weblogic/bea/wlserver_10.0/common/bin|commEnv.sh
AIX)
  if [ -n "${LIBPATH}" ]; then
    LIBPATH=${LIBPATH}:${WL_HOME}/server/native/aix/ppc64
  else
    LIBPATH=${WL_HOME}/server/native/aix/ppc64
  fi
  LIBPATH=${PATCH_LIBPATH}:${LIBPATH}
  export LIBPATH

WEBLOGIC 默认的指向是ppc目录,不是ppc64目录,如果ppc64已经存在,则修改次配置即可,如果没有就要去下载或者去问工程师要libmuxer.so文件。

Oracle的官方网站下载此平台部署必须要打的那个补丁文件。更简单的解决方法是mailOracle支持工程师,将libmuxer.so文件mail给你替换(?/weblogic/bea/weblogic92/server/native/aix/ppc/)目录下的libmuxer.so文件,重新启动weblogic服务,应该就不会再报BEA-000402错误,你的异步I/O也将正常加载。 

3. 使用 Weblogic Native IO 对系统性能至少有30%的提升(这个BEA 工程师说的),在生产环境中,注意检查 Native IO 是否可用。同时在安装Weblogic时,注意使用与之相对于版本的JDK。注意OS版本,和位数一定要搞清楚,并对应上。

在网上有不少关于WebLogic Native IO问题的文章,我挑选了3个最典型的例子做一下总结说明:以下的3个案例,虽然都跟Native IO有关,但实际情况不太相同,有相应平台32位跟64位的问题,也有执行权限的问题,希望读者能仔细去辨别。

3.11 典型案例一

a) 平台信息:

OSAIX5308

JDKjava5_64

WLSBEA Weblogic Server 10.0

b) 故障现象:

1.启动Weblogic时,服务器启动日志中报如下错误:

<Error> <Socket> <BEA-000438> <Unable to load performance pack. Using Java I/O instead. 

Please ensure that libmuxer library is in :’

/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java5_64/jre/bin/classic:/usr

/java5_64/jre/bin

:/weblogic/bea/wlserver_10.0/server/native/aix/ppc:/usr/java5_64/jre/bin/j9vm

:/usr/lib’

2. 同时,在系统使用过程中,报如下错误:

<Warning> <Socket> <BEA-000402> <There are: 5 active sockets, but the maximum number of socket reader threads allowed by the configuration is: 4.

You may want to alter your configuration.> 

c) 故障分析:

根据经验,以上报错信息表明Weblogic Native IO启动失败。

d) 故障解决:

1. Weblogic Native IO 启用失败,通常是由于系统没有使用与Weblogic 相对应的的JDK版本所致。

2. AIX Weblogic 支持32位和64位的JDK,如果使用64位版本的JDK,需在启动脚本中加指向64位对应的目录,

同时在 commEnv.sh 配置文件中,/weblogic/bea/wlserver_10.0/common/bin|commEnv.sh

AIX)

  if [ -n "${LIBPATH}" ]; then

    LIBPATH=${LIBPATH}:${WL_HOME}/server/native/aix/ppc64

  else

    LIBPATH=${WL_HOME}/server/native/aix/ppc64

  fi

  LIBPATH=${PATCH_LIBPATH}:${LIBPATH}

  export LIBPATH

WEBLOGIC 默认的指向是ppc目录,不是ppc64目录,当时为了下载64位的libmuxer.so浪费了很长的时间,后来发现weblogic的目录下面已经存 在64位的。

3. 使用 Weblogic Native IO 对系统性能至少有30%的提升,在生产环境中,注意检查 Native IO 是否可用。同时在安装Weblogic时,注意使用与之相对于版本的JDK

3.12 典型案例二

a) 平台信息:

HP-UX

Weblogic923

b) 故障现象:

1.Weblogic Native IO 启用失败时,通常会在服务器启动日志中报如下错误:

####<Mar 31, 2009 9:09:29 PM GMT+08:00> <Debug> <RJVM> <odsapp1> <managered_server1> <[ACTIVE] ExecuteThread: ’0′ for queue: ‘weblogic.kernel.Default (self-tuning)’> <<WLS Kernel>> <> <> <1238504969950> <BEA-000571> <Network Configuration Detail for Channel "managered_server1"

Channel Weight   50

Accept Backlog   50

Login Timeout   5000ms

Max Message Size  10000000

Message Timeout  60s

Idle Timeout   65s

Tunneling Timeout  40s

Tunneling Ping   45s> 

####<Mar 31, 2009 9:09:29 PM GMT+08:00> <Info> <Server> <odsapp1> <managered_server1> <[ACTIVE] ExecuteThread: ’0′ for queue: ‘weblogic.kernel.Default (self-tuning)’> <<WLS Kernel>> <> <> <1238504969974> <BEA-002609> <Channel Service initialized.> 

####<Mar 31, 2009 9:09:29 PM GMT+08:00> <Error> <Socket> <odsapp1> <managered_server1> <[ACTIVE] ExecuteThread: ’0′ for queue: ‘weblogic.kernel.Default (self-tuning)’> <<WLS Kernel>> <> <> <1238504969989> <BEA-000438> <Unable to load performance pack. Using Java I/O instead. Please ensure that a native performance library is in: ‘/weblogic/opt/java1.5/jre/lib/IA64N:/weblogic/opt/java1.5/jre/lib/IA64N/server:

/weblogic/opt/java1.5/jre/../lib/IA64N:/weblogic/bea/patch_weblogic920/profiles

/default/native:

/weblogic/bea/weblogic92/server/native/hpux11/IPF32:/weblogic

/bea/weblogic92

/server/native/hpux11/IPF32/oci920_8:/usr/lib’

2. 同时,在系统使用过程中,常见报如下错误:

####<Apr 1, 2009 8:25:18 PM GMT+08:00> <Warning> <Socket> <odsapp1> <managered_server1> <DynamicListenThread[Default]> <<WLS Kernel>> <> <> <1238588718157> <BEA-000402> <There are: 5 active sockets, but the maximum number of socket reader threads allowed by the configuration is: 4. You may want to alter your configuration.>

####<2009-4-3 下午092555秒 GMT+08:00> <Error> <HTTP> <odsapp1> <managered_server1> <[ACTIVE] ExecuteThread: ’4′ for queue: ‘weblogic.kernel.Default (self-tuning)’> <<WLS Kernel>> <> <> <1238765155550> <BEA-101019> <[weblogic.servlet.internal.WebAppServletContext@1f5acd0 - appName: 'ODSWeb', name: 'ODSWeb', context-path: ''] Servlet failed with IOException

java.net.SocketException: 管道断开 (errno:32)

at java.net.SocketOutputStream.socketWrite0(Native Method)

at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:97)

at java.net.SocketOutputStream.write(SocketOutputStream.java:141)

at weblogic.utils.io.ChunkedOutputStream.writeTo(ChunkedOutputStream.java:185)

at weblogic.servlet.internal.ResponseHeaders.writeHeaders(ResponseHeaders.java:348)

at weblogic.servlet.internal.ServletResponseImpl.writeHeaders(ServletResponseImpl.

####<Apr 3, 2009 11:11:49 AM GMT+08:00> <Error> <HTTP> <odsapp1> <managered_server1> <[ACTIVE] ExecuteThread: ’10′ for queue: ‘weblogic.kernel.Default (self-tuning)’> <<WLS Kernel>> <> <> <1238728309518> <BEA-101017> <[weblogic.servlet.internal.WebAppServletContext@b9614d - appName: 'ODSWeb', name: 'ODSWeb', context-path: ''] Root cause of ServletException.

java.lang.OutOfMemoryError: unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Thread.java:574)

at javelin.client.ThreadPool.<init>(ThreadPool.java:49)

at javelin.client.ClientUtilsImpl.<init>(ClientUtilsImpl.java:92)

at javelin.client.ClientUtilsImpl.get(ClientUtilsImpl.java:106)

at com.bea.compiler.client.ClientUtils.get(ClientUtils.java:36)

c) 故障分析:

该故障很明显是在HP-UXWebLogic Native IO启动失败。

d) 故障解决:

1. Weblogic Native IO 启用失败,通常是由于系统没有使用与Weblogic 相对应的的JDK版本所致。

2. 应当值得注意的是,在HP-UX中,通常存在 PA-RISCItanium两个版本的Weblogic,如果在PA-RISC平台安装Itanium平台版本的Weblogic,或者在 Itanium平台安装PA-RISC平台版本的Weblogic,同样会导致 Native IO 不可用。

3. HP-UX Weblogic 9.2 支持32位和64位的JDK,如果使用64位版本的JDK,需在启动脚本中加 -d64 参数,同时在commEnv.sh 配置文件中,注意修改“/weblogic/bea /weblogic92/server/native/hpux11 /IPF32”,使其指向“/weblogic/bea/weblogic92/server/native/hpux11/IPF64”,否则会也会导致 Native IO 启用失败 。

4. 使用 Weblogic Native IO 对系统性能至少有30%的提升(这个BEA 工程师说的),在生产环境中,注意检查 Native IO 是否可用。同时在安装Weblogic时,注意使用与之相对于版本的JDK

3.13 典型案例三

a) 平台信息:

HP-UX

Weblogic90

b) 故障现象:

启动过程中发现

<Apr 28, 2010 6:27:15 PM GMT+08:00> <Error> <Socket> <BEA-000438> <Unable to loa 

d performance pack. Using Java I/O instead. Please ensure that a native performa 

nce library is in: ‘/opt/java1.5/jre/lib/IA64N:/opt/java1.5/jre/lib/IA64N/server 

:/opt/java1.5/jre/../lib/IA64N::/opt/weblogic/bea/weblogic90/server/native/hpux1 

1/IPF64:/opt/weblogic/bea/weblogic90/server/native/hpux11/PA_RISC:/opt/

weblogic/ bea/weblogic90/server/native/hpux11/PA_RISC/oci920_8:/usr/lib’

没有启动native io,导致系统性能低下(这里要注意HP-UXIA64N下的是32JDKIA64W下的才是64JDK),而且java io配置的值较小,产生如下报错

<Apr 28, 2010 6:15:03 PM GMT+08:00> <Warning> <Socket> <BEA-000402> <There are: 

5 active sockets, but the maximum number of socket reader threads allowed by the 

configuration is: 4. You may want to alter your configuration.>

在应用使用过程中从而出现

<Apr 28, 2010 6:14:10 PM GMT+08:00> <Error> <Console> <BEA-240003> <Console enco 

untered the following error javax.servlet.jsp.JspException: Broken pipe (errno:3 

2) 

        at com.bea.console.taglib.html.tree.TreeTag.print(TreeTag.java:231) 

        at com.bea.console.taglib.html.tree.TreeTag.doEndTag(TreeTag.java:192)

观察控制台的thread信息

Self-Tuning Thread Pool     

Active Execute Threads    Execute Thread Total Count    Execute Thread Idle Count    Queue Length    Pending User Request Count    Completed Request Count    Hogging Thread Count    Standby Thread Count    Throughput    Health 

16    58    15    6048    0    144840    4    38    4.577865205875421    OK

排队的请求数多达6000个,导致了OutOfMemory,在JAVA堆还很空的情况下

c) 故障解决:

观察发现/opt/weblogic/bea/weblogic90/server/native/hpux11/IPF32下面和native io相关的libmuxer.so没有执行权限,chmod +x 后再次启动错误信息不再出现

 

最近玩SOA时发现WEBLOGIC启动后控制台反应非常迟钝,打开日志后发现WEBLOGIC报告如下错误:

<BEA-000402> <There are: 5 active sockets, but the maximum number of socket reader threads allowed by the configuration is: 4. You may want to alter your configuration。

网上查阅资料后得知原因为

<BEA-000438> <Unable to load performance pack. Using Java I/O instead. Please ensure that
libmuxer library is in :'/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java5_64/jre/bin/classic:
/usr/java5_64/jre/bin:/wls/weblogic/bea/patch_weblogic923/profiles/default/native:/wls/weblogic/bea/
weblogic92/server/native/aix/ppc:/usr/java5_64/jre/bin/j9vm:/usr/lib'>

由于我的操作系统是SOLARIS 10(5.10) SPARC 64 位

解决的方法

1.当Weblogic Native IO 启用失败时,通常会在服务器启动日志中报如下错误:
<Error> <Socket> <BEA-000438> <Unable to load performance pack. Using Java I/O instead.
Please ensure that libmuxer library is in :'/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java5_64/jre/bin/classic:/usr/java5_64/jre/bin
:/weblogic/bea/wlserver_10.0/server/native/aix/ppc:/usr/java5_64/jre/bin/j9vm:/usr/lib'

Weblogic Native IO 启用失败,通常是由于系统没有使用与Weblogic 相对应的的JDK版本所致。
2.我用的64位系统,并且JDK使用的是64位的,因此做了如下修改:
commEnv.sh 配置文件中,/weblogic/bea/wlserver_10.3/common/bin|commEnv.sh

SUN_ARCH_DATA_MODEL="64"

将SUN_ARCH_DATA_MODEL改为64

JAVA_USE_64BIT改为true

JAVA_USE_64BIT=true

重启WEBLOGIC后,问题解决。

3.使用 Weblogic Native IO 对系统性能至少有30%的提升(这个BEA 工程师说的),在生产环境中,注意检查 Native IO 是否可用。同时在安装Weblogic时,注意使用与之相对于版本的JDK。注意OS版本,和位数一定要搞清楚,并对应上。