WebLogic 性能调优 1——管理篇 Mingzi Wang BEA SE BSG
WebLogic Server性能及调整 硬件,操作系统,网络调整 JVM调整WebLogic Server调整
WebLogic Server application调整 WebLogic Server EJB调整
调优流程及典型故障点
--孤立"危险区域"
1.硬件,操作系统,网络调整
支持平台及性能评价
调整
网络调整
1)支持平台及性能评价
使用BEA声明支持的系统平台.
参照:
dev2dev Home > dev2dev WebLogic Platform. > WebLogic Platform. Supported Configurations > Supported Configurations > Supported Configurations
SPEC(Standard Performance Evaluation Corporation)的最新结果.
Fourth Quarter 2003 SPECjAppServer2002 Results
几条经验
为设置交换区
多机或多CPU能提高性能
多硬盘并行操作,提高读写磁盘效率
SPEC的最新测试结果
2)操作系统调整1
process and threads (HP-UX Platform)
max_thread_proc 64 1024
maxfiles 60 256
…
File Descriptor
set =4096
set rlim_fd_cur = 4096
TCP parameters
ndd -set /dev/tcp tcp_conn_request_max 1024
2)操作系统调整2
交换区(swap area)的大小.
交换区的大小一般在内存小于512M时,取内存的两倍,如果内存大于1G取与实际内存相等. 也可根据以下的公式来估算:
用户数*最大进程长度(512K)+大应用程序数*512KB
在系统持续出现某个错误时,需要重新分配系统资源.
首先,设法少量地增加资源.如问题仍存在,则以它初始值的50%至100%增加资源,问题或许能够得到解决.如,出现这些信息时:"I-node Table Overflow","no file"或"no more process"应增加NINDOE,NFILE,NPROC等参数的值.NINDOE定义Ⅰ节点活动表的大小,一般为100—400,最大为16000,NFILE定义系统文件活动表的大小,一般为100—600,最大为16000,NPROC定义系统允许的最大进程数,一般取值为50—3000.
磁盘的I/O操作可能是系统性能的一个瓶颈.
解决方法有:1选择适当的缓冲区数目(NBUF和NHBUF),NBUF定义系统中全部缓冲区的数量,一般为100—600,最大为65536,NHBUF定义系统的混合队列,最小为32,默认为256,最大为131072,一般与NBUF配套调整;2组织文件系统以减少磁盘访问次数等.增加NBUF和NHBUF的值到某一点,便可提高系统的性能.一般系统内存为4MB的系统大约可提供600K的空间给缓冲区.NHBUF的值为2的n次方,大约为NBUF的四分之一.
3)网络调整
网络硬件及软件
当若干网络组件存在问题时,协同网管来隔离及消除问题.
LAN架构的带宽和处理能力
保证Weblogic Server有足够的带宽来和架构中客户端或数据库等层次进行通讯,因此本地网必须有足够的处理应用高峰的能力.
网络性能的影响
2. JVM调整
JVM版本
堆大小和分代式垃圾收集机制
修改堆大小值
自动记载低内存状态
手动进行垃圾收集
设置JVM参数
1) JVM版本
JVM的认证版本:
dev2dev Home > dev2dev WebLogic Platform. > WebLogic Platform. Supported Configurations > Supported Configurations > Supported Configurations
不同JVM之间的性能差异
All SPEC JBB2000 Results Published by SPEC
2) 堆大小和分代垃圾收集机制1
调整堆大小的目的:提高客户的并发访问量同时减小垃圾收集的时间
分代式垃圾收集机制的目的:确定何时开始进行垃圾收集
从1.3 HotSpot JVM中使用该机制(调整参考).
使用详细垃圾收集来决定堆大小的步骤:
在最大负载情况下监控WebLogic Server的性能
使用-verbosegc 选项运行详细垃圾收集,并将输出结果重定向到文件中:
对和Solaris:
% java -ms32m -mx200m -verbosegc …>> logfile.txt 2>&1
对HPUX:
-Xverbosegc:file=/tmp/gc$$.out
其中$$表示Java进程的进程ID.
2) 堆大小和分代垃圾收集机制2
分析以下数据点:
多长时间进行一次垃圾收集
一次垃圾收集花费多长时间.一次全面垃圾收集不应长于3~5秒.
每次垃圾收集后堆的效果如何.如果堆通常是85%为空,则应减小堆大小.
保证堆大小比实际系统剩余物理内存空间小.否则会发生换页延迟.
如果发现垃圾收集的时间太长,则应考虑减小堆大小.典型情况是应该分配给JVM80%的内存资源.
如果发现还有许多剩余内存资源,则在这台机器上可以起多个实例.
参考资料:
《The Java HotSpot Virtual Machine》
《Tuning Garbage Collection with the 1.3.1 Java TM Virtual Machine》
3) 修改堆大小值
配置堆大小的例子:
$ java -XX:NewSize=128m//设置新分代式堆大小.此值应是比1MB大的1024的倍数,并且是-XX:MaxNewSize的四分之一.如果存在大量短寿命对象,应增大此值,并同时增加CPU数目.
-XX:MaxNewSize=128m //设置最大新分代式堆大小.此值应是比1MB大的1024的倍数.
-XX:SurvivorRatio=8 //设置新堆大小的比率.通常设为8,然后监控系统.
-Xms512m //设置最小堆大小.此值应是比1MB大的1024的倍数.通常将此值与-Xmx设置相同.
-Xmx512m//设置最大堆大小.此值应是比1MB大的1024的倍数.通常将此值与-Xms设置相同.
-Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:\bea"-Dweblogic.management.username=%WLS_USER%-Dweblogic.management.password=%WLS_PW%-Dweblogic.management.server=%ADMIN_URL%-Dweblogic.ProductionModeEnabled=%STARTMODE%-Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server
4) 自动记载低内存状态
如果平均可用内存小于最初可用内存的5% , weblogic server会把此情况写入日至.
设置方法:
在WebLogic Server中设置方法:
/console/中mydomain->Servers->myserver->Configuration->Tuning->Advanced Options->Memory Options
5) 手动进行垃圾收集
确保在手动垃圾收集之前进行了完全的自动垃圾收集
在WebLogic Server中设置方法:
/console/中mydomain->Servers->myserver->Monitoring —> Performance->Force garbage collection
实际这是调用了JVM的 System.gc() 方法.
6) 设置JVM参数1
JVM的命令行选项有助于提高JVM的性能.所有的JVM参数是跨平台的,但在不同平台上结果不同.因此对特定系统,应同时测试客户/服务器端的JVM.
Windows/UNIX平台上标准JVM参数
Windows平台:
-hotspot / -classic
UNIX平台:
-client or –hotspot / -client or -hotspot
Windows/UNIX平台上非标准JVM参数
Windows平台:
-Xnoclassgc//对特定类取消垃圾收集.这需要增大堆大小.
-Xrs//减少JVM对系统信号量的使用率.
UNIX平台:
-Xnoclassgc//对特定类取消垃圾收集.这需要增大堆大小.
-ss//设置本地线程栈大小.
6) 设置JVM参数2
Single CPU machines
Application characteristics:
Small heap sizes
Short-lived
Single user with few threads
Typically not I/O bound
VM spends most time translating and executing byte codes
Garbage collection pauses not a problem
Typical Client VMs
Typical Server VMs
Multi-processor servers
Application characteristics:
Large heap sizes
Long uptimes
Many threads doing short activities
High network & file I/O
VM needs to spend more time managing I/O, threads, & memory
Garbage collection pauses create a huge problem
CG = Code Generation
MM = Memory Management
TM = Thread Management
I/O
R = Reflection
3. webLogic server
使用性能包与性能监视
设置线程计数
将某些线程专用为Socket Readers
为溢出条件设执行队列
检测停滞队列
连接后备缓冲
设置weblogic server启动参数
设置java编译器
使用weblogic server集群
1) 使用性能包与性能监视
使用性能包
config.xml文件中表示该Server使用本地I/O.
Console:mydomain->Servers->myserver->Configuration->Tuning->"Enable Native IO" 中将此值设为True(默认为True).
如果选中,但本地操作系统没有可用的性能包,则WLS会自动使用非本地I/O
参考:特定平台的性能包说明
进行性能监视
2) 设置线程计数
原理:
每个新的server实例默认有一个队列weblogic.kernel.default用于存储对应用及RMI对象的请求.该队列默认被分配了15个线程.
设置原则:
增大机器的最大并发线程数使处理器利用率达到最大.对于服务器端操作比较多的线程,应该减少线程计数;对于客户端操作比较多的,应该增加线程计数.并发线程数理论上等于"本地主机CPU个数+Stuck线程数",够用即可,过大会降低系统性能.
观察方法:
console:mydomain->Servers->myserver->Monitoring->General->Monitor all Active Queues... ->weblogic.kernel.Default
修改方法:
console:mydomain->Servers->myserver ->Monitoring->Monitor all Active Queues... ->Configuration->default
config.xml:…
3) 将某些线程专用为Socket Readers
原理:
如果必须使用纯java的socket reader,可为每个Server实例和客户机配置一定数量socket reader线程.可设置执行线程中一部分专用于读取Socket.ThreadPoolPercentSocketReaders 属性用于设置在执行线程中专用做Socket Readers的百分比.因此对各种应用此值不同.
设置方法:
在WebLogic Server中设置方法:
console:mydomain->Servers->myserver->Configuration->Tuning->Socket Readers
在客户机中设置方法:
-Dweblogic.ThreadPoolSize=value
-Dweblogic.ThreadPoolPercentSocketReaders=value
4) 为溢出条件设执行队列
修改方法:
/console/中mydomain->Servers->myserver->Monitoring->General
5) 检测停滞队列
当执行队列中的线程停滞时会被weblogic自动检测.server会根据当前停滞线程的数目来诊断当前系统的健康状况.
如果默认队列中所有线程都停滞,服务器健康状况变为"危急".
如果weblogic.admin.HTTP, weblogic.admin.RMI或用户定义执行队列中线程都处于停滞,服务器状况变为"警告".
配置线程检测条件(这是以server为单位的配置,而非以执行队列为单位):
/console/中mydomain->Servers->myserver->Configuration->Tuning->Stuck Thread Max Time
线程连续多长时间,会被认为该线程被阻塞住.
/console/中mydomain->Servers->myserver->Configuration->Tuning->Stuck Thread Timer Interval
weblogic server周期性扫描所有执行队列线程的时间间隔.
6) 连接后备缓冲
config.xml文件中server元素的AcceptBacklog属性设定weblogic server实例能接受的最大连接数.
AcceptBacklog决定了在等待队列中最多可以有多少TCP连接等待处理.
设置方法:
/console/中mydomain->Servers->myserver->Configuration->Tuning->Accept Backlog
如果在许多客户端连接被拒绝,而在服务器端没有错误显示,说明该值设得过低.
如果连接时收到connection refused消息,说明应提高该值,每次增加25%
7) 设置WebLegic Server启动参数
设置WL_HOME\server\bin 中的startWLS.sh (UNIX) and startWLS.cmd (Windows)
将最大堆大小和最小堆大小设为一样:
"%JAVA_HOME%\bin\java" -hotspot -Xms512m -Xmx512m -classpath %CLASSPATH% -
8) 设置java编译器
设置方法:
/console/中mydomain->Servers->myserver->Configuration->General->Java Compiler:
填写java编译器的全路径.如c:\visualcafe31\bin\sj.exe
/console/中mydomain->Servers->myserver->Configuration->General->Advanced Options->Append to classpath
填写jre的全路径.如BEA_HOME\jdk131_03\jre\lib\rt.jar
weblogic.xml的元素jsp-descriptor的参数compileCommand定义了编译JSP和Servlet的编译器.
weblogic.xml的元素jsp-descriptor的参数precompile定义了weblogic启动时候预编译jsp的编译器.
启动weblogic server时可以用jvm的参数-compiler来指定不同的生成容器EJB类的编译器.
在UNIX上可以手动设置文件描述符的大小,例如:
set rlim_fd_max = 4096
set rlim_fd_cur = 1024
在UNIX上可以使用本地线程:jvm添加参数-native .
9) 使用WebLogic Server集群
用途:提高WeblogicServer的负载处理能力.包括规模化和可靠性.
特点:对应用开发者透明;使用IP多址广播方式;动态增加集群能力;冗余容错能力
使用集群的考虑:
网络需求:如果应用系统主要受网络瓶颈的约束,应首先考虑增加网络吞吐量,如更换为更快的网卡
磁盘的IO需要:如果应用系统主要受磁盘IO的约束,则应首先考虑提高磁盘转数或更换磁盘控制器
CPU需要:如果应用系统主要受CPU的约束,则使用多CPU的节点.BEA推荐每个实例使用2个CPU
4. WebLogic Server application调整
1)使用性能分析工具
2)JDBC应用调整
3)管理SESSION
4)使用执行队列来控制线程使用
1)使用性能分析工具
使用Jprobe
Sitraka公司
提供瓶颈,执行代码覆盖及其他测试.包括以下工具:
JProbe 3.0.x Integration Portal for J2EE
JProbe 4.0 Integration Portal for J2EE
使用OptimizeIt
Borland公司
在Solaris和Windows平台上的性能测试工具
Introscope
2)JDBC应用调整
应用设计决定了性能的损益
客户的数量和位置,DBMS中表和索引的大小和架构,队列的数量和类型.
为TYPE 4 MS Driver的JDBC优化工具
当使用TYPE 4 MS SQL驱动,创建及执行SQL语句会更快
调整方法:
services->JDBC->Connection Pools->OraclePool->Maximum Capacity=50.对数据库的最大物理连接数.
services->JDBC->Connection Pools->OraclePool->Statement Cache Size=200.缓存保留的可被调用的表达式数.
3)管理SESSION
管理Bean持久
内存内复制比基于JDBC的Session状态持久快10倍.当使用基于JDBC持久,通过优化代码来提高Session状态的粒度.每次Session执行Put操作会导致向数据库的写入.增大每次Put的数据量而减小Put执行次数.
减小Session
调整性能的关键是配置Weblogic Server如何管理Session.
使用可测度的Session调用
节约Session使用
将频繁使用的值保存在本地变量中
在Session中尽量使用聚类对象,而非多个单独对象
4)使用执行队列来控制线程使用
优化重要应用的性能
可以将单独的重要应用使用单独的执行队列,保证有一定数量的执行线程.在服务器的峰值负载时,非重要的应用之间将竞争默认队列的线程,而重要应用会保证有一定数量的线程.
降低非重要应用的性能
对于潜在消耗大内存量的应用,将它分配到限制使用内存资源的执行队列,影响其他应用的队列.
修改死锁线程的使用
当所有执行线程被频繁执行时会发生死锁.例如Servlet从指定JMS消息队列读取消息时如果所有线程用于处理Servlet的请求,则会没有向队列传递消息的线程.恰当的方法是使用单独的执行队列来处理Servlet.避免Servlet和JMS间竞争线程资源.
5. WebLogic Server EJB调整
1)EJB的运行过程
1)设置weblogic-ejb-jar.xml中与性能相关测的参数
2)设置weblogic-cmp-rdbms-jar.xml中与性能相关测的参数
3)调整监控统计的响应
4)其他性能改善策略
1)EJB的运行过程
Bean设为只读.
bean只需在第一次被访问时从数据库获得数据,此后按照weblogic-ejb-jar.xml中参数read-timeout-seconds的设置(默认600S),bean将再次从数据库获得数据.
Bean 设为用于事务.
caching-between-transactions设为Ture来启用数据的长期缓冲,避免在同一个Client依次执行多个访问该Bean的事务时,每启动一个事务就对该Bean执行ejbLoad().
Bean不作优化.
此时,即使在交易中未被修改过,容器也会将存储操作优化掉.
2)设置weblogic-ejb-jar.xml中与性能相关测的参数
weblogic-ejb-jar.xml用于定义EJB的环境,缓冲,集群及行为.同是将可用的Weblogic Server资源映射到EJB上.包括JDBC联接池,JMS联接工厂,及所部署的EJB.
设置事务隔离级别
isolation-level
定义数据库锁
concurrency-strategy
为Stateful Session 和 Entity Beans设置缓冲大小
max-beans-in-cache
为Stateless Sessions Beans的起始状态调整池大小
为Session和Message-Driven Beans设置EJB池大小
max-beans-in-free-pool
相关信息
元素
3)设置weblogic-cmp-rdbms-jar.xml中与性能相关测的参数
关联缓冲支持
通过将相关Bean载入缓冲及向相关Bean发出联接查询来避免多重查询,使关联缓冲支持提高了Entity Bean的性能.
Entity Beans的关联缓冲支持
relationship-caching
更多信息
元素
4)调整监控统计的响应1
缓冲缺失率
容器对缓冲中Bean访问缺失次数 / 总访问次数.如果被访问的Bean相对集中,则增大缓冲;如果不相对集中,则应测试出一个使该值相对小的缓冲值.
锁等待率
等待获得锁的对Bean访问的线程个数 / 对锁需求的总数.此值高说明对Bean访问.减少事务的持续时间并尽快释放资源,避免将大量工作合并到单一事务中.对于Bean来说一个高的锁定等待级别所表现的并发性不理想.如果应用允许的话,通过减少在EJB容器层的锁定,非最优的数据库访问策略能提供更好的资源并发访问性.
锁超时率
锁管理者超时的个数 / 所访问的锁管理者个数.对锁的超时设置过短会增大此值.但设置过长会导致事务失败时消耗时间过长.
池缺失率
访问池中Bean,而又不能获得的请求次数 / 对池中Bean的总访问次数.方法:检查Bean的损坏率以确定Bean没有被破坏.检查对Bean的需求量.如果破坏率不高应增大池大小.
4)调整监控统计的响应2
Bean损坏率
Bean的损坏个数 / 对Bean的请求数.BEA推荐不要在Bean代码中抛出非自定义异常.通过调查导致Bean损坏的异常来修改性能.
池超时率
等待池中Bean超时的请求个数 / 全部请求数.通过增大池大小来增加提供服务响应的Bean实例.事务超时值也会影响该值.
事务回滚率
回滚的事务个数 / 调用EJB的总事务数.通过事务超时率可以观察此值高低.如果此值高,应先检查事务超时问题.
事务超时率
超时的事务个数 / 总事务个数.事务超时值设置错误会导致此值高.服务器等瓶颈会导致此值高.可以通过跟踪事务来观察超时原因.
5)其他性能改善策略
组合缓冲支持
用于配置将多个Entity Bean使用一个缓冲.有助于可用性和性能问题.
批处理操作
对于在CMP Bean的一条SQL语句中执行多数据库操作,通过批处理进行增,删,改有助于提高CMP Bean的性能,减小网络负荷.
在Weblogic Server集群中分配访问EJB的事务
当一个事务使用多个EJB时,Weblogic Server尽量从一个Weblogic Server实例中获取EJB实例.这有助于为事务减小网络流量.
一个事务也可以在异构集群中使用多个Weblogic Server实例中的EJB.这时Weblogic Server使用多层连接来访问数据,而非对数据的多个直接连接.这种方法减少资源,提高事务性能.当然,最好使用同构集群.
6. 调优流程及典型故障点
JVM(虚拟机)数据
是否内存太少从而导致虚拟内存频繁交换
有多少任务处于挂起状态,系统的平均负荷是多少
Web服务器数据
在测试期间产生了多少http错误
有没有子线程被挂起
数据库
剩余多大空间
缓存命中率是多少
网络
什么IP在产生最多的请求
网络上是否有任何报警事件
Q
A
&
联系方式:
mingzi.wang@bea.com
The E-Commerce Transactions Company
www.bea.com
LAN架构
本地网必须有足够的处理应用高峰的能力.如果网络流量常常大于网络资源的承载能力,则:
重新设计网络
减少客户端数量
提高系统对网络负载的处理能力
网络性能的影响
对于普通JAVA客户端,每个客户端JVM都要和服务器建立SOCKET联接.因此Weblogic Server要比Web请求提高125~150%的处理能力.
检测Web服务器性能方法:大约每56kbps可以处理7-10个并发访问
使用网络性能检测工具来观察网络系统的负载,消除网络瓶颈.
以下参数均在Weblogic Console中设置.
Protocols->HTTP->Post Timeout=60.Server用于接收某个HTTP POST数据的等待超时值.
Protocols->HTTP->Duration=60.对非活动HTTP连接,Server在Duration秒后将其关闭.
右键点myserver,选"View Excute Queues"->Configuration->weblogic.kernel.Default->Thread Count=50.为对列weblogic.kernel.Default分配的线程数.