1、最近我在帮助一个客户对应用程序进行性能调优,该应用程序的CPU占用量高得不可思议。他们计划从另一种产品迁移到WebLogic Express上,但是令他们吃惊的是,WebLogic Express下的CPU占用量要远远高于他们原本使用的产品。
我们以优先级的顺序列出了各种性能调优参数,试图解决问题。列在上面的是我所认为的简单参数。对于这些参数,我们公认应该设一个特定的值为最大值, 而不会造成任何可能的负面影响。头两个参数是pageCheckSeconds和servlet-reload-check-secs。它们的默认值是 1,这表示WebLogic每一秒钟都针对每个JSP页面和servlet进行检查,看是否有新的版本。这在开发时是一个很好的设置,但是在生产中,如果 系统有大量的JSP页面和servlet,这将会造成巨大的开销。
如果您的生产系统从来不动态更新JSP页面和servlet的话,这两个参数应该设置为 -1,这表示WebLogic从不检查新页面。如果您需要更改JSP页面和servlet的话,可以将这两个参数设置为一个比较大的数,比如180,以减少检查新版本对系统的影响。
将客户机应用程序的这两个参数设为 -1可以使CPU占用量减少一半。只需更改一下参数,就可以获得巨大的好处,的确是一种非常简单的性能优化方法。
------------------------------------
优化WebLogic 服务器性能参数
WebLogic 配置文件(config.xml)包含了大量很直观的与性能有关的参数,能通过配置环境与应用程序得到很好的优化。基于系统的需要调整这些参数不仅能改善单个点的性能,而且能提高整个应用程序性能的可衡量性。
试着采用下列WebLogic配置方法,或许能使你的系统达到最佳状态:
一 修改运行队列线程数的值。在WebLogic 中队列元素的线程数等于同时占用运行队列的应用程序的数目。当任务加入一个WebLogic 实例,它就被放到执行队列中,然后分配给任务一个线程来运行。线程消耗资源,因此要小心处理这个属性——增加不需要的值,会降低性能。
二,如果可能,使用自带的性能包(NativeIOEnabled=true)。
三,使用特定的应用程序执行队列。
四,使用JDBC连接池时,修改下列属性:
n 驱动名称:使用小的驱动或者jDriver。
n 初始容量:设为与最大容量相同的值。
n 最大容量:其值至少应与线程数相同。
五,把连接池的大小设为与执行队列的线程数相同。
六,设置缓冲。
七,为Servlet和JSP使用多个执行队列。
八,改变JSP默认的Java编译器,javac 比jikes或sj要慢。
优化WebLogic
提要:
n 为WebLogic启动设置Java参数。
n 设置与性能有关的配置参数。
n 调整开发与产品模式默认值。
n 使用WebLogic“自有的IO”性能包。
n 优化默认执行队列线程。
n 优化连接缓存。
n 如何提高JDBC连接池的性能。
n 设置Java编译器。
n 使用WebLogic集群提高性能。
n 监视WebLogic域。
一、为WebLogic启动设置Java参数
只要启动WebLogic,就必须指定Java参数,简单来说,通过 WebLogic.Server域的命令行就可以完成,不过,由于这样启动的过程冗长并且易于出错,BEA 公司推荐你把这个命令写进脚本里。为了简化这个过程,你可以修改样例脚本里的默认值,样例脚本是提供WebLogic启动服务器的。
如果你用配置向导创建你的域,WebLogic启动脚本 (startWebLogic.cmd)放在domain-name目录里。默认情况下,这个目录是BEA_HOME\user_projects \domain\domain-name,BEA_HOME表示安装路径,domain-name是在配置模板中设置的域名称。
你需要在这个脚本中修改一些默认的Java参数值,使之适合你的应用环境和程序。在这个文件中主要的性能参数是JAVA_HOME和Java堆的大小。
n 设JAVA_HOME的值为JDK所在的位置,如:
set JAVA_HOME=C:\bea\jdk141_03
n 为得到高性能的吞吐量,把Java堆的最小值与最大值设为相等。如:
"%JAVA_HOME%\bin\java" -hotspot -Xms512m -Xmx512m -classpath %CLASSPATH% -
二、设置与性能有关的配置参数
在一个WebLogic域中,配置文件(config.xml)位于与管理服务器通信的机器 里,提供WebLogic MBean的长期存储。管理服务器作为连接的中心点,为服务实例与系统管理工具提供服务。域也可以包括其他的WebLogic实例,称之为从服务,主要为 应用程序提供服务。
当启动管理服务器是,首先读域配置文件,然后跳过建立在配置文件中管理MBean 默认的属性值,每一次用系统管理工具(不管是命令行界面还是管理控制台)改变一个属性值,它都会被存到相应的管理MBean,并且写进配置文件。
下表列出了config.xml文件中影响服务器性能的参数。
元素 | 属性 | 控制台标签 | 备注 |
Server | NativeIOEnabled | Native IO Enabled |
|
ExecuteQueue | ThreadCount | Thread Count |
|
ExecuteQueue | QueueLength QueueLengthThresholdPercent ThreadsIncrease ThreadsMaximum ThreadPriority | Queue Length Queue Length Threshold Percent (队列长限度百分比) Threads Increase Threads Maximum Thread Priority |
|
Server | StuckThreadMaxTime StuckThreadTimerInteral | Stuck Thread Max Time (堵塞线程的最长时间) Stuck Thread Timer Interval (堵塞线程的时间间隔) |
|
Server | ThreadPoolPercentSocketReaders | Socket Readers |
|
Server | AcceptBacklog | Accept Backlog (接受缓存数) |
|
JDBCConnectionPool | InitialCapacity MaxCapacity | Initial Capacity Max Capacity |
|
JDBCConnectionPool | StatementCacheSize | Statement Cache Size (声明高速缓冲大小) |
|
三、调整开发模式与产品模式默认值
你可以指定域为开发环境或为产品环境。WebLogic会根据你指定的环境类型使用不同的默认值提供不同的服务。
下表列出了两种模式下的默认值
优化参数 | 开发模式 | 产品模式 |
Execute Queue: ThreadCount | 15 threads | 25 threads |
JDBC Connection Pool: MaxCapacity | 15 connections | 25 connections |
3.1更改运行时模式
在创建了一个域后,按下列步骤可以更改域里所有服务的的运行时模式:
1.为更改运行在一个WebLogic主机上的所有域的运行时模式,用文本编辑器打开 WL_HOME\common\bin\commEnv.cmd(Windows) 或者WL_HOME\common\bin\commEnv.sh (UNIX),WL_HOME是安装WebLogic的路径。
为指定的域更改运行时模式,就用文本编辑器打开domain-name\StartWebLogic.cmd (Windows) or domain-name\StartWebLogic.sh (UNIX),domain-name为创建的域的目录。
2.在这个脚本中,更改PRODUCTION_MODE的值,如果你要服务器运行在产品模式,指定其值为TRUE。
3.重启所有的服务器。
3.2两种模式的不同
下表列出了开发模式与产品模式几种关键项的区别:
功用名称 | 开发模式 | 产品模式 |
SSL | 你可以使用WebLogic安全服务提供的验证数字证书。有这些证书,你开发的应用程序会在SSL保护的环境下运行。 | 如果你使用验证数字证书,会收到警告信息。 |
部署应用程序 | WEBLOGIC实例会自动部署和更新位于domain_name/applications目录下的应用程序(domain_name为域的名称)。 | 不能使用自动部署功能,必须使用WebLogic控制台或者WebLogiceblogic Deployer工具。 |
Log File Rotation | 启动服务器后,服务器自动重命名本地日志文件为server-name.log.n,为了滞留的session ,只要日志文件的达到500kb,日志文件就会滚转一次。 | 当日志文件达到500kb,就会滚转。 |
Execute Queues | 默认的执行线程为15。
| 默认的执行线程为25。 |
JDBC Connection Pool Capacity | 默认的容量为15。 | 默认的容量为25。 |
四、使用WebLogic“自有的IO”性能包
当你使用自有的性能包,测试基准就表明了主要性能的提高。性能包采用最优化的平台及多线程的Socket去提高服务器的性能。例如,本地Socket 读的多线程有自己的执行队列而不需要借用默认的执行队列线程,这样可以让默认执行线程很从容去处理应用程序。
不过,如果你一定要用纯Java socket读在主机上运行,你仍然可以通过配置每个服务器实例和客户机中适当的socket读的线程数量,来提高socket通信的性能。
设置性能包的操作方法:
默认情况下,装载在config.xml中的是自有的性能包。为了验证这个设置,在配置文件中检查NativeIOEnabled属性是否设为“true”(NativeIOEnabled=true)。
你也可以通过管理控制台来验证,步骤如下:
1, 启动管理服务器。
2, 访问管理控制台。
3, 展开左边面板的Servers 节点,显示域服务。
4, 点击你要配置的服务实例。
5, 选择Configuration->Tuning tab。
6, 如果 Enable Native IO复选框没有被选择,选中即可。
7, 点击Apply。
8, 重启服务器。
五、优化默认执行队列线程
默认情况下,一个新的WebLogic实例配置了一个开发模式执行队列,weblogic.kernel.default,它包含15个线程。另外,WebLogic提供了2个预配置队列:
n weblogic.admin.HTTP——只在管理服务器上才有,这个队列供与管理控制台的通信用,你不能再配置它。
n weblogic.admin.RMI——管理服务器和被管理服务器上都有这个队列,它是供管理的交通之用,也不能再配置它。
如果你不配置额外的执行队列,并且指定应用给这些队列,web 应用程序和RMI对象就使用默认的队列weblogic.kernel.default。
注意;如果自带的执行包没有在你的平台上使用,你可能需要调整默认的执行队列线程数和担任socket读的线程的百分比,去实现最佳性能。
5.1你应该更改默认的线程数吗?
增加更多的线程到默认的执行队列并不意味着你能处理更多的工作。即使增加更多的线程,仍然被处理器的能力限制。因为线程消耗内存,所以增加线程数属性的值不必要的降低了性能。一个高的执行线程数导致更多的内存被占用并且增加了上下文转换程序,它也会降低性能。
线程数属性的值与应用程序处理的工作的类型关系密切。例如,如果你的客户应用程序比较小,通过远程调用处理的工作较多,这样,客户端会花费更多的时间连接,因此,与能完成大量客户端任务的客户应用程序相比,会需要更多的线程数。
如果你的工作不需要使用超过15个线程(开发模式默认)或者25个线程(产品模式默认),就不 要改变这个属性的值。通常,如果你的应用程序访问数据库花很长时间才返回结果,与访问数据库很短时间就返回的应用程序比较,你会需要更多的执行线程。从后 者来看,用少点的线程数可能提高性能。
5.2需要修改默认线程数的情形
为了给执行队列决定一个理想的线程数,当队列中所有应用程序都运行在最大负荷的情况下,监视队列的吞吐量。增加线程数,重复负载测试,直到达到最佳的吞吐量。(在某些情况下,增加线程数将产生足够多的上下文转换程序,使得队列中的吞吐量开始减少。)
注意:WebLogic管理控制台显示的是所有服务器执行队列累积的吞吐量。为了得到这个值,后面将会介绍。
下表列出了在WebLogic 域中调整的线程及与CPU数量相关的情形,这些情况也假定WebLogic运行在最大负荷下,并且使用默认的执行队列满足所有的线程的请求。如果你配置了额外的执行队列并指派了应用程序到具体的队列,就需要依据一个个连接池得到结果。
如果… | 结果 | 应该: |
线程数<CPU的数量 | 线程数太少,如果: CPU正等着工作,但有工作被完成。 CPU利用率不能达到100%。 | 增加线程数。 |
线程数=CPU的数量 | 理论上理想,但是CPU仍然低利用。 | 增加线程数。 |
线程数(适当的)>CPU的数量 | 实际中理想,有个适当的上下文转换程序数量和高的CPU利用率。 | 调整适当的线程数并且比较性能结果。 |
线程数(较大的)>CPU的数量 | 过多的上下文转换程序,能导致重大的性能降级。 当你降低线程数时,性能可以增强。 | 减少线程数,使它等于CPU的数量,然后仅仅增加已经得出的“堵塞”线程的数量。 例如,如果你有4个处理器,它们都同时运行,并出现堵塞线程,于是,你想要的执行线程就是4+堵塞线程的数 |
5.3修改默认线程数的步骤
用管理控制台修改默认执行队列线程数如下:
1. 如果管理服务器没有运行,先启动。
2. 访问管理控制台。
3. 展开左边面板的Servers 节点,显示域服务。
4. 右击服务名称,在弹出菜单中选择View Execute Queues ,就会在右边面板显示有执行队列的表用来修改。
注意:你只能修改默认的执行队列或者用户定义的执行队列。
5. 在Name列,直接点击默认执行队列名称,显示配置标签用来修改执行队列数。
6. 填下适当的线程数。
7. 点击Apply,保存刚才的修改。
8. 重启服务器,使新的执行队列设置生效。
5.4指派应用程序到执行队列
虽然可以配置默认的执行队列,为所有的WebLogic应用程序提供最佳的线程数,但是为关键的应用程序配置多个执行队列可以提供更多的管理控制。通过使用多执行队列,你可以保证应用程序有权占用固定的线程数,而不管WebLogic服务器有多大的负荷。
5.5创建执行队列
一个执行队列代表执行线程的命名集,线程指向一个或多个Servlet、JSP、EJB、 RMI对象。执行队列在config.xml文件中描述,作为服务器元素的一部分。如,在config.xml文件中描述一个有4个线程的队列,命名为 CriticalAppQueue,如下:
...
<Server
Name="examplesServer"
ListenPort="7001"
NativeIOEnabled="true"/>
<ExecuteQueue Name="default"
ThreadCount="15"/>
<ExecuteQueue Name="CriticalAppQueue"
ThreadCount="4"/>
...
</Server>
另一种创建队列的方法是通过管理控制台,配置步骤如下:
1. 启动管理服务器,访问控制台。
2. 展开左边面板中Servers节点,显示域中要配置的服务。
3. 右击你要增加队列的服务实例,从弹出菜单中选择View Execute Queues。
4. 在队列配置标签中,点击配置新执行队列链接。
5. 在队列配置标签中,更改下列属性或接受系统的默认值:
n 线程名称(Name):你可以输入线程名称,如CriticalAppQueue。
n 队列长度(Queue Length):通常保留默认值65536,队列长度表明了同时发来请求的最大数,65536个请求是个很大的数,即使达到这个最大数,也是很少见的。
如果达到最大队列长度,WebLogic会自动成倍增长队列大小,以处理额外的工作。
注意:超过65536个请求预示队列中的线程有问题,不仅仅只是队列本身的长度问题,实践表明在队列中有堵塞线程或线程数不足的情况存在。
n 队列长限制百分比(Queue Length Threshold Percent):达到队列长度百分比(1-99)时,就构成了溢出条件的产生。实际队列大小在限制的百分比之下时才被认为是正常的;在限制百分比之上就 会产生溢出。当出现溢出,WebLogic日志就会产生一个错误消息,并且按线程数增量(Threads Increase)属性的值增加线程数,以帮助减少负载量。
默认的队列长限制百分比为90%。一般情况下,应保留90%或其左右,以应对一些潜在的情况,使得有额外的线程可以去处理一些请求中的异常。记住,队列长度限制百分比不是一定作为自动优化参数――因为正常运作情况下,这个限度从不会被触发。
n 线程数(Tread Count):指派到这个队列的线程数。如果你不需要使用超过15个线程(默认),就不必更改这个属性值。
n 线程数增量(Threads Increase):是指WebLogic探测到有溢出时,增加到执行队列的线程数。当你指定为0(默认),出现溢出时,WebLogic会把运行良好状态改为“警告”,而且也不会指派额外的线程去减少负荷量。
注意:如果WebLogic实例的线程数响应了溢出,那么这些额外的线程就会滞留在执行队列, 直到服务器重启。监视错误日志,以判断溢出产生的原因,以便根据需要重配置线程数,防止以后类似情况产生。不要同时使用线程数增量和队列长限制百分比作为 自动优化的手段。如此做通常结果会产生比正常需要还多的线程被指派到执行队列,这样上下文转化程序的增多会使服务器遭受很差的性能。
n 最大线程数:是指执行队列中能运行的,这个值保护WebLogic为了响应频繁溢出,创建过多的线程数。默认情况下,最大线程数为400。
n 线程优先级:线程优先级与此队列相关。默认值为5。
6. 点击Create,创建队列。
7. 重启服务器。
5.6指派Servlet和JSP到执行队列
你可以把servlet或JSP分配到指定的配置执行队列,只需在初始参数中标识执行队列的名 称。初始参数出现在Servert或JSP的部署描述文件web.xml中的init-param元素里。为了分配一个队列,可以把队列名作为wl- dispatch-policy参数的值。如:
<servlet>
<servlet-name>MainServlet</servlet-name>
<jsp-file>/myapplication/critical.jsp</jsp-file>
<init-param>
<param-name>wl-dispatch-policy</param-name>
<param-value>CriticalAppQueue</param-value>
</init-param>
</servlet>
5.7指派EJB和RMI对象到执行队列
为了把EJB分配到指定的队列,可以使用weblogic-ejb-jar.xml文件中dispatch-policy元素。
然而你也可以通过使用appc编译器-dispatchPolicy选项来设置派遣策略,BEA强烈推荐使用部署描述元素。因为用这种方式,如果EJB重编译,在部署用例期间,这个设置不会被丢失。
为了把RMI对象分配到指定的队列,可以使用rmic编译器的-dispatchPolicy选项,如:
java weblogic.rmic -dispatchPolicy CriticalAppQueue ...
5.8分配执行队列担任Socket读
为了获得更好的socket性能,BEA 推荐你使用自有的socket读执行工具,它更优于纯Java执行工具。然而,如果你一定要在主机上用纯Java 的socket读,你仍然可以通过配置恰当的执行线程数以提高socket通信性能,为每个服务器实例和客户机器担负socket读线程的任务。
Socket读占线程池百分比(ThreadPoolPercentSocketReader)属性可以设置用来从socket读消息的执行线程的最大百分比。这个属性的最优值是根据应用程序的需要指定的。默认值是33,有效范围在1-99之间。
分配执行线程担任socket读增加了服务器处理速度和接受客户请求的能力。有必要平衡执行线程数,使其专注于从socket读消息,也有必要平衡那些在服务器处理实际任务的执行线程。
5.9为服务器实例设置socket读的线程数的操作
1. 启动管理服务器,访问域控制台。
2. 展开左边面板Servers节点,显示域服务配置。
3. 点击你要配置的服务名称。
4. 选择配置(Configuration)――>调整(Tuning)标签。
5. 在Socket Reader中编辑Java读线程的百分比。Java socket读线程数是根据所有的执行线程数的百分比计算得到的。
6. 应用(Apply)这个调整。
5.10在客户机设置Socket读线程数
在客户机上,你可以配置运行在JVM(Java虚拟机)上的socket读线程数。指定Socket读,需要通过用java命令行定义下列参数:
-Dweblogic.ThreadPoolSize=value
-Dweblogic.ThreadPoolPercentSocketReaders=value
5.11优化溢出情况时的执行队列
你可以配置WEBLOGIC监测并且随时应对潜在的溢出,不管其发生在默认的执行队列还是用户定义的队列。一旦当前队列大小快达到用户定义的百分比,WebLogic认为队列中有一个可能的溢出产生。
当这个限度到达时,服务器改变它的良好状态为“警告”,随即分配额外的线程去处理超负荷的工作,从而还原它的大小。
为了自动监测和应对溢出,你可以配置以下项:
1. 队列长限制百分比,这个值是队列大小的百分比。
2. 当溢出发生时,增加到队列的线程数。这些额外的线程以还原队列到正常的运行的大小。
3. 线程的最大数,在特殊情况下,线程最大数用来保护服务器在响应过载情况下过度分配线程数。
5.12优化执行队列的监测行为
当一个线程在队列中变成堵塞状态时,WebLogic会自动监测到。因为堵塞线程不能完成它当前的工作或接受新的工作,服务器每次诊断一个堵塞线程,就记入一个消息到日志中。如果一个队列中所有的线程变成堵塞,服务器改变良好状态成“警告”或者“危机”,依赖于下列情况:
n 如果默认队列中所有的线程变成堵塞,服务器状态变成“危机”。(你可以设立节点管理器(Node Manager)应用去自动关闭及重启服务器。)
n 如果在weblogic.admin.HTTP, weblogic.admin.RMI或用户定义的队列中所有线程变成堵塞,服务器状态变成“警告”。
WebLogic诊断到一个堵塞线程,如果它是在指定的时间内连续不断的工作(没有空闲)。你可以调整服务器线程监测行为,它是通过改变堵塞线程被诊断前的时间长度和服务器核查堵塞线程的频率。
注意:尽管你能改变标准WebLogic去决定一个线程是否堵塞,但,你不能改变默认行为,就是出现堵塞时把服务器设置成“警告”或“危机”的行为。
配置WebLogic堵塞线程监测行为的步骤:
1. 启动WebLogic,访问管理控制台。
2. 点击你想为改善堵塞线监测而修改的服务器实例的名称。
3. 选择配置(Configuration)――>调整(Tuning)标签。
4. 修改下列参数:
n 堵塞线程最大时间(Stuck Thread Max Time):输入秒数,线程一定是不断的运行,服务器才会诊断这个线程作为堵塞。默认情况下,WebLogic认为线程连续不断运行600秒后置为堵塞。
n 堵塞线程时间间隔(Stuck Thread Timer Interval):输入秒数,这个时间是WebLogic周期性的扫描线程以察觉它们是否连续不断运行了某一线程的时间达到通过堵塞线程最大时间属性指 定的时间长度。默认时间间隔为600秒。
5. 应用(Apply)设置。
6. 重启服务器。
六、优化连接缓存
Config.xml文件中的元素接受缓存数(AcceptBacklog)属性是用来设定请 求WebLogic实例的连接数,在拒绝额外的请求之前,能接受设定的缓存数。AcceptBacklog属性指定有多少TCP连接缓存在等待队列,这个 固定的队列存放了TCP堆栈已经收到但应用程序还没有收到的连接请求。默认值是50,最大值由操作系统决定。
在控制台调整接受缓存数的步骤:
1. 启动WebLogic,访问控制台。
2. 展开左边面板Servers节点。
3. 点击你要配置的服务器实例的名称。
4. 选择配置(Configuration)――>调整(Tuning)标签。
5. 根据需要修改默认的接受缓存数(Accept Backlog):
n 在运行期间,如果许多客户端连接得不到响应或被拒绝,并且服务器端也没有错误消息,说明接受缓存的值可能太小。
n 在你访问WebLogic时,如果收到“拒绝连接(connection refused)”的提示,则应该增加接受缓存的默认值的25%。继续增加其值的25%,直到停止出现这样的提示。
6. 点击应用(Apply),保存设置。
七、如何提高JDBC连接池的性能
创建一个带DBMS的JDBC连接是非常慢的。如果应用程序需要数据库不断的连接和断开,这种创建方式会造成一个重大的性能问题。WebLogic连接池提供了一种高效的解决方案来解决这个问题。
当启动WebLogic,就打开连接池,以便于所有客户连接。当一个客户关闭一个连接,这个连接就返回到连接池,供其他的客户使用。连接本身不会关闭。如此就用极少的代价实现了连接和断开连接池。
在连接池里应该创建多少连接呢?连接池会根据配置参数中的最大数与最小数之间增加或减少连接。最好的性能应该是连接数与当前客户会话(Session)数相同。
7.1调整JDBC连接池的初始容量
在配置连接池时, JDBCConnectionPool元素中的InitialCapacity属性能设定连接数,创建物理的数据库连接。如果服务器不能创建这个连接数,连接池的创建就会失败。
在开发期间,为了使服务器启动更快,可以很方便的设置InitialCapacity属性的值 小一点。在产品系统中,就应该把InitialCapacity的值设为与MaxCapacity值相同,默认产品模式的值为25。这样,在服务器启动 时,所有的连接就会被创建。如果你调整了MaxCapacity值后,一定要确信InitialCapacity值设置与MaxCapacity值相同。
如果InitialCapacity比MaxCapacity值少,当负荷增加时,服务器需要创建额外的数据库连接。当服务器处于低负荷时,所有的资源应该是尽快的完成请求,而不是创建新的数据库连接。
7.2调整JDBC连接池的最大容量
JDBCConnectonPool元素中的MaxCapacity属性设置连接池包含的最大的物理数据库连接数。不同的JDBC驱动程序和数据库服务器可能限制物理连接数。
默认的最大容量数与默认的线程数相等:开发模式为15,产品模式为25。不过,在产品模式下,建议连接数与当前的客户会话(Session)数相等。在服务器端,连接池的容量与执行线程数是无关的,正在进行的用户会话比执行线程更多。
八、设置Java编译器
编译JSP Servlet的标准Java编译器是javac。你可以把java编译器设置为si或jikes代替javac,这样能极大的提高性能。下面讨论设置步骤及其要考虑的事项。
8.1通过控制台改变编译器
1. 启动服务器,访问控制台。
2. 展开左边面板Servers节点。
3. 点击要配置的服务器实例的名称。
4. 选择配置(Configuration)――>常规(General),在Java Compiler编辑框输入编译器的完全路径。如:c:\visualcafe31\bin\sj.exe
5. 点击高级选项(Advanced Option)――>Show,显示其他的属性。
6. 用添加(Append)把完全路径通过Classpath框输入到JRE rt.jar 库。如:BEA_HOME\jdk141_02\jre\lib\rt.jar
7. 点击应用。
8. 重启服务器。
8.2在Weblogic.xml文件中设置编译器
n 使用compileCommand参数指定Java编译器。
n 使用procompile参数配置WebLogic,在启动WebLogic时预编译JSP。
8.3编译EJB容器类
使用Weblogic.appc的功能去编译EJB2.0和1.1容器类。如果编译Jar文件 部署EJB容器,你必须使用weblogic.appc生成容器类。默认情况下,EJB使用javac编译器。为了得到跟好的性能,使用 -compiler标志指定不同的编译器(如Symantec公司的sj)
8.4在UNIX环境下编译
在UNIX机器上编译JSP文件,如果收到下列错误消息:
failed:java.io.IOException:Not enough space
试试下列一些或所有的解决方法:
n 如果你只有256MB的内存,增加更大的内存。
n 提高文件描述文件的限制,如:
set rlim_fd_max=4096
set rlim_fd_cur=1024
n 启动JVM时,用-native标志来使用自有的线程。
九、使用WebLogic集群提高性能
WebLogic集群是指一组WebLogic实例在一起提供具有防过载和自有复制的功能,以用一个域为所有客户支持可伸缩的高可用性运行。集群对于客户是一个单一的服务器,但实际上是一组服务器来提高可靠性和可伸缩性。
9.1可伸缩性和高的可用性
可伸缩性是系统增加一个或更多部件作为系统资源的能力。很典型的是,这些部件使并发用户得到支持,使并发事务能在特定的时间单位能被处理。
假定应用程序设计良好,它完全可以简单的增加更多的资源来提高性能。为了增加WebLogic处理的负荷量,只需增加一个WebLogic实例到你的集群――不需改变应用程序。集群提高两个关键的好处:可伸缩性和可用性,这是单一服务器无法比拟的。
WebLogic集群给J2EE带来了可伸缩性和高的可用性,而且对于应用程序的开发者是透明 的。可伸缩性扩展了中间层的能力,超过了单一的WebLogic服务器或单一的计算机能处理的。集群成员唯一的限制是所有WebLogic必须要用IP多 点传送通信。新的WebLogic能动态的增加到集群,以增加处理能力。
WebLogic集群保证高的可用性是通过多个服务器的冗余,减少客户的请求失败。集群中多个服务器能提供同一服务。如果一个服务器停止运行,另一个能接替运行。这种功能为客户增加了可用性。
警告:如果你要解决应用程序和环境的颈瓶问题,增加额外的服务器到集群,应该提供线性的可伸缩性。定基准和初始配置测试运行时,在移到集群环境之前,应把应用隔离在单独的服务器上测试。
9.2在多CPU机器上运行多服务器实例,应考虑的性能问题
多处理器的机器上,必须考虑群集WebLogic实例数应与CPU的数量成比例。因为WebLogic没有内置限制的服务器实例数位于集群里,规模大的、多处理器服务器,如Sun公司的Sun Enterprise 10000,有着当作非常大的集群或多集群主机的潜能。
在决定最佳的服务器与CPU比例前,彻底测试你的应用程序并确定如下:
n 网络要求 如果你发现Web 应用程序是主要受网络I/O限制,在增加CPU数前,考虑测试网络的吞吐量。如果实际是网络I/O限制,安装一个更快的网络接口卡(NIC)可以提供性 能,而不是增加额外的CPU,因为在等着读socket时,更多的CPU会处于闲置。
n 磁盘I/O要求 如果你发现Web应用程序主要受磁盘I/O限制。在配置额外的CPU前,就应该考虑增加磁盘转速或单个磁盘。
总之,在配置额外的CPU前,必须确定Web应用程序是受CUP限制,而不是受网络或磁盘I/O限制。
对于受CPU限制的应用,最初在每个CPU上对一个WebLogic实例进行性能测试。如果 CPU利用率是一致的或者接近100%,然后增加CPU比重(例如,为一个WebLogic实例配置两个CUP),记住在产品模式下,应该有一些空闲的 CPU周期存在去执行管理任务。
虽然Web应用程序的处理需求变化多端,但BEA公司发现WebLogic实例与CPU最理想的比例是1:2。
十、监视WebLogic域
监视WebLogic域的健康状况和性能的工具是管理控制台。通过控制台,你可以观察到WebLogic资源的状态和统计信息,如服务器,HTTP,JTA 子系统,JNDI,安全,CORBA连接池,EJB,JDBC以及JMS。
举个例子,在Server――>Monitoring――>Performance为当前服务器实例提供了与等待和运行状态的请求有关的性能参考。它包括下列信息:
n 队列中空闲线程数。
n 队列中等待时间最长的请求。
n 吞吐量,根据已经处理的请求数来衡量的。
n 队列长度,根据队列中等待请求数来衡量的。
n JVM堆还有的内存量。