Weblogic 性能调优基本方案

 

Weblogic 是用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器。由于部署在 weblogic 上的一般来说都是大数据量高并发量的应用, 所以性能调优就成了非常重要的一环, 本文整理了一些 Weblogic 性能调优的基本方案供参考。

注:下面的介绍是以 Weblogic8.1 为例的,其它版本的 Weblogic 可能会有些不同。

1) 设置 JAVA 参数:

a) 编辑 Weblogic Server 启动脚本文件;
BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix)
BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix) - 这个是做集群的时候用
b) 编辑 set JAVA_OPTIONS 命令,如:set JAVA_OPTIONS=-Xms256m -Xmx256m;
(在 UNIX 下把 MEM_ARGS=”-Xms1024m -Xmx1024m -Xmn128m”加到上述两个.sh 文件中即可)
c) 保存,重启即可。

注:在 WebLogic 中,为了获得更好的性能,BEA 公司推荐最小 Java 堆等于最大 Java 堆。

2) 开发模式 vs. 产品模式:

开发模式和产品模式的一些参数的默认值不同,可能会对性能造成影响。下面是对性能有影响的参数列表:
参数 开发模式默认值 产品模式默认值
Execute Queue: Thread Count 15 threads 25 threads
JDBC Connection Pool: MaxCapacity 15 connnections 25 connections

通过启动管理控制台,在域(如:mydomain)> 配置 > 常规选择产品模式。

(这个在创建 weblogic 的 domain 的时候是有选择的,选择”产品”模式就可以了,如果后期需要修改,可以按照上面的方法修改。)

3) 尽量开启本地 I/O:

通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> 配置 > 调整选择启用本地 I/O。

注:此值也可通过手动的修改 config.xml 配置文件。

4) 调优执行队列线程:

a) 修改默认执行线程数

在这里,执行队列的线程数表示执行队列能够同时执行的操作的数量。但此值不是设的越大越好。太小了,执行队列中将会积累很多待处理的任务;太大了,则会消耗大量的系统资源从而影响整体的性能。在产品模式下默认为 25 个执行线程。

(一般来说,其上限是每个 CPU 对应 50 个线程,其按照 CPU 个数线性增长。)

为了设置理想的执行队列的线程数,我们可以启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> 监视 > 性能中监控最大负载时执行队列的吞吐量和队列中的等待请求数,据此确定理想的数值。

理想的默认执行线程数是由多方面的因素决定的,比如机器 CPU 性能、总体体系架构、I/O、操作系统的进程调度机制、JVM 的线程调度机制。随着 CPU 个数的增加,WebLogic 可以近乎线性地提高线程数。线程数越多,花费在线程切换的时间也就越多;线程数越小,CPU 可能无法得到充分的利用。为获取一个理想的线程数,需要经过反复的测试。在测试中,可以以 25*CPU 个数为基准进行调整。当空闲线程较少,CPU 利用率较低时,可以适当增加线程数的大小(每五个递增)。对于 PC Server 和 Windows 2000,则最好每个 CPU 小于 50 个线程,以 CPU 利用率为 90% 左右为最佳。

通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置中修改线程计数。

b) 设定执行队列的溢出条件

Weblogic Server 提供给默认的执行队列或用户自定义的执行队列自定义溢出条件的功能,当满足此溢出条件时,服务器改变其状态为”警告”状态,并且额外的再分配一些线程去处理在队列中的请求,而达到降低队列长度的目的。

通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置下面几项:

●队列长度:此值表示执行队列中可容纳的最大请求数,默认值是 65536,最后不要手动改变此值。
●队列长度阈值百分比:此值表示溢出条件,在此服务器指出队列溢出之前可以达到的队列长度大小的百分比。
●线程数增加:当检测到溢出条件时,将增加到执行队列中的线程数量。如果 CPU 和内存不是足够的高,尽量不要改变默认值”0″。因为 Weblogic 一旦增加后不会自动缩减,虽然最终可能确实起到了降低请求的作用,但在将来的运行中将影响程序的性能。
●最大线程数:为了防止创建过多的线程数量,可以通过设定最大的线程数进行控制。

在实际的应用场景中,应根据具体情况适当的调整以上参数。

c) 设定执行队列监测行为

Weblogic Server 能够自动监测到当一个执行线程变为”阻塞”。变为”阻塞”状态的执行线程将无法完成当前的工作,也无法再执行新请求。如果执行队列中的所有执行线程都变为”阻塞”状态,Weblogic server 可能改变状态为”警告”或”严重”状态。如果 Weblogic server 变为”严重”状态,可以通过 Node Manager 来自动关闭此服务器并重新启动它。具体请参考:Node Manager Capabilities 文档。

通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> 配置 > 调整下可配置下面几项:

●阻塞线程最长时间:在此服务器将线程诊断为阻塞线程之前,线程必须连续工作的时间长度 (秒)。默认情况下,WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。
●阻塞线程计时器间隔:WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 “阻塞线程最长时间” 字段中指定的时间长度的间隔时间 (秒)。默认情况下,WebLogic Server 将此时间间隔设置为 600 秒。

5) 调优 TCP 连接缓存数:

WebLogic Server 用 Accept Backlog 参数规定服务器向操作系统请求的队列大小,默认值为 50。当系统重载负荷时, 这个值可能过小, 日志中报 Connection Refused, 导致有效连接请求遭到拒绝, 此时可以提高 Accept Backlog 25% 直到连接拒绝错误消失。对于 Portal 类型的应用, 默认值往往是不够的。

Login Timeout 和 SSL Login Timeout 参数表示普通连接和 SSL 连接的超时时间, 如果客户连接被服务器中断或者 SSL 容量大, 可以尝试增加该值。

通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> 配置 > 调整下可配置”接受预备连接”。

6) 改变 Java 编译器:

标准的 Java 编译器是 javac,但编译 JSP servlets 速度太慢,为了提高编译速度,可以使用 sj 或 jikes 编译器取代 javac 编译器。下面介绍更改 Java 编译器:
通过启动管理控制台,在域(如:mydomain)> 服务器 > server 实例(如:myserver)> 配置 > 常规下改变 Java 编译器,默认为 javac。输入完整路径,如:c:\visualcafe31\bin\sj.exe。然后打开高级选项,在预规划到类路径填写编译 Java 代码时为 Java 编译器类路径预规划的选项,如:BEA_HOME\jdk141_02\jre\lib\rt.jar。

7) JDBC 应用调优:

JDBC Connection Pool 的调优受制于 WebLogic Server 线程数的设置和数据库进程数、游标的大小。通常我们在一个线程中使用一个连接, 所以连接数并不是越多越好, 为避免两边的资源消耗,建议设置连接池的最大值等于或者略小于线程数。同时为了减少新建连接的开销, 将最小值和最大值设为一致。

增加 Statement Cache Size 对于大量使用 PreparedStatement 对象的应用程序很有帮助,WebLogic 能够为每一个连接缓存这些对象, 此值默认为 10。在保证数据库游标大小足够的前提下, 可以根据需要提高 Statement Cache Size。比如当设置连接数为 25,Cache Size 为 10 时, 数据库可能需要打开 25*10=250 个游标。但是, 当遇到与 PreparedStatement Cache 有关的应用程序错误时, 需要将 Cache Size 设置为 0。

尽管 JDBC Connection Pool 提供了很多高级参数, 在开发模式下比较有用, 但大部分在生产环境下不需调整。这里建议最好不要设置测试表, 同时 Test Reserved Connections 和 Test Released Connections 也无需勾上。 当然如果数据库不稳定, 时断时续, 可能需要按照上述的参数打开。

最后是驱动程序类型的选择, 以 Oracle 为例,Oracle 提供 thin 驱动和 oci 驱动, 从性能上来讲,oci 驱动强于 thin 驱动, 特别是大数据量的操作。但在简单的数据库操作中, 性能相差不大, 随着 thin 驱动的不断改进, 这一弱势将得到弥补。而 thin 驱动的移植性明显强于 oci 驱动。所以在通常情况下建议使用 thin 驱动。而最新驱动器由于 WebLogic server/bin 目录下的类包可能不是最新的, 请以 Oracle 网站为准: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

8)JSP 调优:

设置 jsp-param pageCheckSeconds=-1;
设置 serlet-reload-check=-1 或 ServletReloadCheckSecs=-1;
设置 jsp-param precompile=true,关闭 JSP 预编译选项。