JAVA性能优化—IBM JDK JVM参数设置

2009年5月23日 hashei 4 条评论

前一篇JVM的恩恩怨怨中,说了对WebSphere优化的关键点——因不同JDK而异。本文将描述IBM JDK下常用参数的设置。

-Xms:最小堆大小

-Xmx:最大堆大小

-Xminf and -Xmaxf:GC(垃圾回收)之后可用空间的最小值最大值

-Xmine and -Xmaxe:堆增长的最小最大值

-Xmint and -Xmaxt:垃圾回收占时间整个运行时间的比例,默认是5%。如果回收时间小于5%,那么它就缩减堆,反之增大。

一般来说只要对Xms和Xmx设置合理,后面的三对不用特别设置。可以看看http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp上heap expasion和heap shrinkage两章的说明,除非有下文的情况:

如果使用大小可变的堆(比如,-Xms 和 -Xmx 不同),应用程序可能遇到这样的情况,不断出现分配失败而堆没有扩展。这就是堆失效,是由于堆的大小刚刚能够避免扩展但又不足以解决以后的分配失败而造成的。通常,垃圾收集周期释放的空间不仅可以满足当前的分配失败,而且还有很多可供以后的分配请求使用的空间。但是,如果堆处于失效状态,那么每个垃圾收集周期释放的空间刚刚能够满足当前的分配失败。结果,下一次分配请求时,又会进入垃圾收集周期,依此类推。大量生存时间很短的对象也可能造成这种现象。避免这种循环的一种办法是增加 -Xminf 和 -Xmaxf 的值。比方说,如果使用 -Xminf.5,堆将增长到至少有 50% 的自由空间。同样,增加 -Xmaxf 也是很合理。如果 -Xminf等于0.5,-Xmaxf 为默认值 0.6,因为 JVM 要把自由空间比例保持在 50% 和 60% 之间,所以就会出现太多的扩展和收缩。两者相差 0.3 是一个不错的选择,这样 -Xmaxf.8 可以很好地匹配 -Xminf.5。如果记录表明,需要多次扩展才能达到稳定的堆大小,但可以更改 -Xmine,根据应用程序的行为来设置扩展大小的最小值。目标是获得足够的可用空间,不仅能满足当前的请求,而且能满足以后的很多请求,从而避免过多的垃圾收集周期。-Xmine、-Xmaxf 和 -Xminf 为控制应用程序的内存使用特性提供了很大的灵活性。

摘自Java性能优化的策略和常见方法

所以在应用正式上线的头一段时间,最好把GC日志打开,观察一下堆(heap)的增长(expasion)和收缩(shrinkage)。最佳的情况就是,每次回收后可用的堆大小占整个堆的50%左右。如果回收后才腾出30%不到的可用空间,那就该再调整一下上述的参数了。下图看起来直观一点,使用-verbose:size参数可以查看当前的默认值。

IBM WAS Heap Sizes

那为何不把Xms和Xmx设置成一样大,就像SUN的JDK所推荐的那样?

Using the same values is not usually a good idea, because it delays the start of garbage collection until the heap is full. The first time that the Garbage Collector runs, therefore, becomes a very expensive operation. Also, the heap is more likely to be fragmented and require a heap compaction. Again this is a very expensive operation.……

If the Garbage Collector cannot find enough garbage, it runs compaction. If the Garbage Collector finds enough garbage, or any of the other conditions for heap expansion are met , the Garbage Collector expands the heap.

因为IBM JDK采用的是标记(mark)-扫描(sweep)-标记-……-扫描-紧凑排列(compact),如果还不能提供足够的空间,扩展堆(expasion)。依次循环,直到达到最大堆大小。每次扩展前,那些长存的对象就被调整到堆的底部,每次扩展后需要再动的量就很少。所以如果把Xms设置成和Xmx一样,那么扫描和紧凑排列这么一个充满内存碎片的大堆的开销将大大高于从小扩展堆的开销。

The overheads of expanding the heap are almost trivial compared to the cost of collecting and compacting a very large fragmented heap.

这是由于IBM的GC特点造成的,而SUN的JDK采用的是分代回收的策略,所以就没有这种情况,反而会受益于堆大小一致。不过这么说起来,用了-Xgcpolicy:gencon,就应该把最小堆最大堆设置成一样咯。

在Gencon回收策略下,可以通过-Xmn来设置婴儿区域(Nursery或者叫young)的大小,通过-Xmo来设置长存区(tenured或者old)的大小。注意-Xmn不能和-Xmns/-Xmnx参数一起使用,-Xmo不能和-Xmos/-Xmox一起使用,否则会报错。前者就是把年轻代和长存代的大小固定了,而后两者就是设定两个部分最大最小的范围,默认情况下:

-Xmns是-Xms的25%或者64M(在JDK 5.0中默认是25%)

-Xmnx是-Xmx的25%或者64M(同上)

-Xmos是-Xmx减去-Xmns的大小

-Xmox是和-Xmx一样大

可见默认的年轻代太小了,生产环境中有必要改大一点。因为年轻代使用的是复制策略,所以回收速度相当快(minor gc),而长存代使用的是和optavgpause 策略相似的方式进行并发标志、扫描策略,回收速度比较慢(major gc)。理想情况是minor gc和major gc的比值在1:1010:1左右。(可以通过GC日志查看回收的区域)

gencon中年老期限(Tenure age)和倾斜比率(Tilt ratio)这两个参数是JVM自己动态调整的。

针对固定对象问题(Pinned Objects),使用-Xk -Xp参数设定kCluster和pCluster,Avoiding Java heap fragmentation with Java SDK V1.4.2. 或者我这篇IBM JDK的Java堆空间的碎片问题

一些不常用的参数:

-Xloainitial<percentage> -Xloamaximum<percentage> :调整大对象区域(Large Object Area)的大小。分配总是先在SOA(Small Object Area)中分配,如果没有空间并且需要分配的大小大于64K,那么分配到LOA。默认情况下为-Xloainitial0.05 (5%),-Xloamaximum0.5 (50%),如果你的程序确实需要分配许多大对象的话(大于64K),那么可以调整LOA的初始百分比。

以上两点可以参考我这篇IBM JDK的Java堆空间的碎片问题,获得更详细的解释。

总结一下来说,对于optthruput和optavgpause,设置恰当的最大堆和最小堆,设置-Xk和-Xp避免碎片问题,如果程序需要分配大对象较多,那么调整一下LOA的大小;对于gencon,可以调大最小堆和最大堆接近,调整young区域的大小,LOA也可以视情况调整。subpool一般用不到,就不去研究了。

一些另外的信息

Default settings for the JVM

http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/defaults.html

JVM environment settings

http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/env_var/env_jvm.html

默认的Heapdumps是关闭的,调试的时候记得打开;默认的Javadumps on out of memory和Heapdumps on out of memory都是开启的,但是默认的dump位置是profile的所在目录,最好在管理控制台java进程中把IBM_HEAPDUMPDIR和IBM_JAVACOREDIR设置到别的目录,防止dump内容把WAS的文件系统撑爆,影响正常业务使用。

在Windows机器上,如果内存大于4G,记得开启/3GB参数,这样可以使JVM Heap可以设置的更大一些,接近2G-1,(其它的三部分可以扩展到另外的1G上去),但一般最大不超过1.7G。

Memory layout of a vm in the os

更详细内容,可见http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp

或者下载dig60 http://www.ibm.com/developerworks/java/jdk/diagnosis/查看JVM这一块

Sun的JDK配置,可以参考JAVA性能优化—Sun Hotspot JDK JVM参数设置

Business Objects Enterprise3.1、Metedate安装指南

2009年5月19日 hashei 5 条评论

安装主机

192.16.29.234

Weblogic domain目录

D:\bea\user_projects\domain\BO

Oracle 9.2.0.7,本地建立客户端并配置好

ip:1521 sid:

安装过程

clip_image001

1 运行安装程序,选择安装程序语言为中文。下一步同意安装信息,输入安装序列号。

clip_image002

2 选择语言包

clip_image003

3 选择新建安装BOE,数据库为使用现有Oracle数据库,修改安装目标文件夹为D:\Business Objects\

clip_image004

4 输入管理员账号密码,此处密码为以后登录BOE的administrator密码,因为要符合密码安全性,所以设置为Test1234(注意大小写)

clip_image005

5 按照默认信息,下一步

clip_image006

6 输入数据库信息,CMS数据库为保存BOE运行信息的数据库,输入已经在ORACLE建立好的用户名/密码 ——cms/******;audit为审计数据库,用户名/密码为audit/******。

7 接下来BOE会连接到oracle创建数据库

clip_image007

8 这一步是选择BOE安装的中间件环境,这里选择WEBLOGIC9。(借用一下DI的图)

clip_image008

9 Weblogic的配置信息,用户名密码为weblogic,Server Instance是登录weblogic后点击服务器看到的服务器名称,默认单机安装后的都是AdminServer。同时注意weblogic要选择listening在本地所有端口上(all local port),否则按下一步可能会报错。

10 接下来就是安装程序自己安装了,时间估计1个小时。

安装过程

Metadata安装需要BOE的支持,所以和BOE安装在同一台机器上,双击安装程序后会自动找到BOE的安装目录,同时连接相同的数据库,把安装信息添加进去。安装比较简单,这里就不再累述。

Start:

1. Weblogic BO Server

2. Server Intelligence Agent

3. WinHttp Web Proxy Auto-Discovery Service

登录入口

InfoView:

http://ip:7001/InfoViewApp/

CMS (Control Manegemet System):

http://ip:7001/CmcApp/

Matadata Menegement:

http://ip:7001/bomm/

登录系统用户名 Administrator 密码Test1234,注意大小写

Sql2005数据库复制操作方法

2009年5月19日 hashei 没有评论

本文根据微软的MSDN上教材进行整理

一、 准备阶段

此阶段是为了以最小的特权运行SQL Server2005的复制工作

A. clip_image001 在发布服务器上为复制代理创建本地 Windows 帐户

1. 在发布服务器上,从“控制面板”的管理工具中打开计算机管理

2. 在系统工具中,展开本地用户和组

3. 右键单击用户,再单击新建用户

4. 在用户名框中,输入 username,提供密码和其他相关信息,然后单击创建来创建 “username” 帐户。

5. 单击关闭

B. clip_image001[1] 在订阅服务器上为复制代理创建本地 Windows 帐户

1. 在订阅服务器上,从“控制面板”的管理工具中打开计算机管理

2. 在系统工具中,展开本地用户和组

3. 右键单击用户,再单击新建用户

4. 在用户名框中,输入 username,提供密码和其他相关信息,然后单击创建来创建”username” 帐户。

5. 单击关闭

C. 为快照文件夹创建共享并分配权限

1. 在 Windows 资源管理器中,导航到 SQL Server 2005 数据文件夹。默认位置为 C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.X\Data,可以根据自己需要创建目录所在地

2. 创建名为 sqlshare的新文件夹。

3. 右键单击该文件夹,然后单击共享和安全

4. 在“sqlshare 属性对话框的共享选项卡上,单击共享此文件夹。确保共享名的值为 sqlshare

5. 单击权限

6. 单击添加。在输入要选择的对象名称文本框中,键入第 1 课中创建的快照代理帐户的名称,格式为 <Machine_Name>\username,其中 <Machine_Name> 是发布服务器的名称。单击检查名称,然后单击确定

7. 验证是否允许以下权限:

· username – 完全控制

8. 单击确定关闭“username 的权限对话框。

D. 在发布服务器中设置数据库权限

1. 在 SQL Server Management Studio 中,展开安全性,右键单击登录名,然后选择新建登录名

2. 在常规页中单击搜索,在输入要选择的对象名称框中输入 <Machine_Name>\username (其中,<Machine_Name> 是本地发布服务器的名称),再单击检查名称,然后单击确定

3. 在用户映射页中,启用到 所要分发 数据库的用户映射,确保有数据库的db_owner 数据库角色和public角色

单击确定创建登录名。

二、 配置分发订阅

A. clip_image001[2] 在发布服务器中配置分发

1. 在 SQL Server Management Studio 中连接到发布服务器,然后展开服务器节点。

2. 右键单击复制文件夹,然后单击配置分发。此时分发配置向导启动。

3. 在分发服务器页中,选择“‘<服务器名称>将充当自己的分发服务器;SQL Server 将创建分发数据库和日志,然后单击下一步

4. 在快照文件夹文本框中,输入 之前建立的共享目录,然后单击下一步

5. 根据情况决定执行发布的间隔时间,时时执行还是确定某一时间运行。一般“事务性发布”选择“立即创建快照并保持可用状态”,而“快照发布”选择间隔某一段时间创建快照,比如4个小时

6. 快照代理安全性,在以下Windows账户下运行中输入运行的进程账户名<Machine_Name>\username (其中,<Machine_Name> 是本地发布服务器的名称)和密码,

7. 接受向导剩余页上的默认值。

8. 单击完成启用分发。

在发布服务器上配置订阅

1. 选择复制节点

2. 右键本地订阅

3. 选择发布服务器

4. 选择订阅方式(选择推送订阅))填加订阅服务器

5. 安全性——运行的进程选择<Machine_Name>\username,连接的订阅服务器选择数据库上的新建的username

6. 选择代理计划(一般选择连续运行)

7. 其余选择默认项。

注:http://msdn.microsoft.com/zh-cn/library/ms152531.aspx 上有关于使用复制分发后的备份建议。

JVM的恩恩怨怨-WebSphere性能优化(二)

2009年5月18日 hashei 没有评论

WebSphere优化中不得不提的是对JVM的优化,OutOfMemory、GC时间太长太频繁、内存碎片、大对象问题……虽说JVM运行效率如何很大程度是和代码有关,但是恰当的参数设置还是可以避免很多问题。因为在JAVA程序中,垃圾回收(Garbage Collection——GC)是内存发生瓶颈的主要因素(在程序没有问题的情况下)。

但是JVM的优化(也就是优化GC)是一个很令人头疼的活。调整JVM需要根据不同的平台分别对待,如果不了解直接Google一个参数加上无法生效事小,适得其反就不好了。在 Sun ™Solaris™ 和 HP-UX 平台上,WebSphere使用的是Sun和HP提供的JDK,而所有其他平台,WebSphere提供的是IBM JDK。所以优化参数主要区别在IBM JDK和非IBM JDK上,Sun和Hp环境下的优化方案基本能共享。

通用配置

          GC优化的关键是降低频率(frequency)和减少持续时间(duration)。但是两者此消彼长,所以平衡一个恰当的值十分关键。频率和堆的大小和分配增长速度有关,而持续时间则和堆大小和堆中对象的多少有关。由此可以看出最先要考虑的就是堆的大小。

          最大堆、最小堆设置:现在32位的堆,一般设置为256~512M或者512~1024M,但是

       对于不同的应用程序,最优化堆大小的设置都有可能不同。如果堆设置较大,可能导致 GC 的次数变少,但每次 GC 所花的时间很长,从而导致系统的处理能力抖动很大。此外如果堆设置过大,会占用过多的内存,使内存资源耗尽,从而会频繁的进行 IO 操作来使用虚拟内存。 如果堆设置较小,可能导致 GC 变的频繁,但每次 GC 所花的时间不会太长,每次 GC 对系统的性能影响相对也会小些。但是如果堆设置过小, 会使得对象可分配空间变小,从而会频繁的 GC 来释放内存空间,而每次 GC,都会耗用一定的系统资源。因此,要通过试验和监控数据,设法使的我们所设置的堆大小能够使得系统运行最优化。

          具体合适的值,可以启用-verbose:gc来观察。一般良好的堆大小,要让回收频率保持在10秒左右,而一次的full gc回收时间在1到2秒之内(一般的回收时间更短才好)。要注意的是,对于32位的JDK,在Windows环境下单个堆不要超过1.7G,AIX平台不要超过3.2G。下面摘自 出色的“清洁工具” ― 理解 IBM Java 垃圾收集器,第一部分:: 对象分配

 

问题 建议措施
在堆达到稳定状态以前,GC 的频率太高。 使用 verbosegc 确定处于稳定状态的堆大小并将 -Xms 设置成这个值。
堆被完全扩展并且占用率大于 70%。 增加 -Xmx 值使堆占用率不超过 70%。为了获取最佳性能,尝试确保堆从不换页。物理内存应该能容纳最大的堆大小(如果可能)。
占用率为 70% 时,GC 的频率过大。 更改 -Xminf 的设置。缺省值是 0.3,它将通过扩充堆来尝试维持 30% 可用空间。设置为 0.4 将可用空间目标增加到 40%,从而降低 GC 的频率。
暂停时间过长。 尝试使用 -Xgcpolicy:optavgpause (在 1.3.1 中引入),它在堆占用增加时减少暂停时间并且使它们更一致。在吞吐量方面要付出代价。代价是变化的,大约在 5% 左右。

确定了堆大小,接下来要考虑的是

GC的策略

IBM JDK(1.5)下WebSphere首先要了解的是4个Policy

IBM SDK 5.0 中的 GC 策略

针对吞吐量进行优化
-Xgcpolicy:optthruput(可选)
默认策略。对于吞吐量比短暂的 GC 停顿更重要的应用程序,通常使用这种策略。每当进行垃圾收集时,应用程序都会停顿。

针对停顿时间进行优化
-Xgcpolicy:optavgpause
通过并发地执行一部分垃圾收集,在高吞吐量和短 GC 停顿之间进行折中。应用程序停顿的时间更短。

分代并发
-Xgcpolicy:gencon
以不同方式处理短期存活的对象和长期存活的对象。采用这种策略时,具有许多短期存活对象的应用程序会表现出更短的停顿时间,同时仍然产生很好的吞吐量。

子池 (一般平台用不到)
-Xgcpolicy:subpool
采用与默认策略相似的算法,但是采用一种比较适合多处理器计算机的分配策略。建议对于有 16 个或更多处理器的 SMP 计算机使用这种策略。这种策略只能在 IBM pSeries® 和 zSeries® 平台上使用。需要扩展到大型计算机上的应用程序可以从这种策略中受益。

其中optthruput是默认的IBM JDK GC策略,我觉得不是很适合一般电子商务的情况。因为它的GC停顿时间是三种策略里最长的,而且对于频繁分配短生命周期、小对象的应用来说,很容易就产生了内存碎片,虽然标志-扫描-紧凑排列(mark-sweep-compact)的第三个阶段“紧凑排列”可以消除碎片,但是这种动作开销很大。一般需要设置P cluster、K cluster参数来减少碎片Avoiding Java heap fragmentation with Java SDK V1.4.2. (这个参数在1.5中也适用)

optavgpause是以一点吞吐量的牺牲(官方说是5%)换来响应时间的提高,用并发标记(JDK1.4)外加并发扫描(JDK1.5引入)的方式来减少GC “Stop the world”的时间。

但一般而言,我都是设置成-Xgcpolicy:gencon ,gencon就是我们常说的“分代回收”策略,在HP和SUN的JDK实现中是默认的回收策略。这篇文章Java 理论与实践: JVM 1.4.1 中的垃圾收集,介绍的就是分代回收策略,而且肯定是针对SUN的JDK,当然HP的也适用。可以关注下面这张图:

形象直观,文章里的文字总忘掉七零八落,但那些原理可以日后巩固,这幅图保存好了设置参数就没啥大问题。

注意下图显示的IBM JDK的分代回收参数设置和SUN/HP的不同

jvm

IBM没有设置MaxPermSize的地方,这点要注意了。

HP和SUN的JDK也有两种主要的回收策略,分别是对应高吞吐率的-XX:+UseParallelGC和快速响应时间的-XX:+UseConcMarkSweepGC。

本文主要是描述GC优化的纲领,指出不同的JDK优化对策的不同。详细的参数测试有待以后慢慢写。

相关阅读:

Java 技术,IBM 风格: IBM Developer Kit 简介

Java 理论与实践: 垃圾收集简史  可以了解为什么不同的回收策略,表现出的gc时间会如此迥异。虽然Java 技术,IBM 风格: 垃圾收集策略,第 1 部分一文也叙述的很详细,但是个人觉得《垃圾回收简史》一文写的更明了,毕竟这是最原始的设计,省略了实现过程中添加的许多特性。

应用服务器WAS CE21介绍

2009年5月15日 hashei 没有评论

为什么要介绍WAS CE

公司开发的产品几乎都是三层B/A/S结构,生产环境中使用WebSphere Application Server作为中间件的不少。但是限于个人开发机器的性能限制,开发过程中开发人员大部分是基于Tomcat环境实施项目开发,之后将应用程序发布到正式环境——WebSphere Application Server上,而Tomcat与WAS在规范细节上的标准差异,以及对第三方组件支持的区别,导致很多应用迁移到正式生产环境上遇到各种各样的问题。所以本文介绍IBM WebSphere Application Server家族的一款免费的轻量级中间件产品——WebSphere Application Server Community Edition,建议今后有新项目,且明确最终环境是WAS中间件时可以在开发时使用。

WAS CE简介

IBM WebSphere Application Server Community Edition 是在 Apache Geronimo(Apache Software Foundation 的开放源代码应用程序服务器)的基础上构建的 J2EE 应用服务器。

WAS的优点

支持全面

WAS CE21完整支持Java EE5.0,并向下支持j2ee1.4;支持各种数据库;Web2.0的各种特性

J2EE Version 5 编程模型采用 Apache Geronimo(Apache Software Foundation 的开放源代码应用程序服务器项目)技术。Apache Geronimo 将各个主要开放源代码社区的最佳技术组合起来,以支持 J2EE 规范,这些技术包括:

  • 用于支持 Servlet JavaServer Pages (JSP) Apache Tomcat
  • 用于支持 Enterprise JavaBeans (EJB) 的 OpenEJB
  • 用于支持 Java Message Service (JMS) 的 ActiveMQ
  • 用于支持 Java Management Extensions (JMX) 的 MX4J
  • 用于支持 Java Database Connectivity (JDBC) 的 TranQL
  • 用于 Web 服务的 Apache Axis
  • 用于 Java Transaction API (JTA) 的 HOWL (ObjectWeb)

WebSphere Application Server Community Edition 支持 IBM 和 Sun 的 Java 开发工具包 (JDK)。

可以看到WAS CE是Tomcat的超集,它使用 Apache Tomcat 作为缺省 Web 容器,还集成了诸多Tomcat所没有的特性。特别是比较常用的Apache Axis,省去了自行调用Axis发生的各种BUG。

clip_image002

安装方便 运行要求低

采用 InstallShield 按需安装,下载包占用空间小。从核心组件到完整下载,大小为85M~191M

下载地址 http://www.ibm.com/developerworks/cn/downloads/ws/wasce/

可以选用不同的JDK,可以根据今后部署的平台来选择。比如今后WebSphere安装在PC Server或者IBM小机上,那么就选用IBM JDK;安装在HP的小机上,那就选用HP JDK

开发工具的支持

Eclipse 插件
该插件使您可以利用基于 Eclipse 技术的 Web 工具平台来提供简单的开发环境,以便创建、部署和调试 WebSphere Application Server Community Edition 应用程序。

http://download.boulder.ibm.com/ibmdl/pub/software/websphere/wasce/updates/

简单而又全面的管理控制台

Tomcat一般不使用管理控制台,而是直接修改配置文件,需要对配置文件了解比较多,而WAS CE则有一个强大的管理和开发控制台,包含诸多工具用来配置和发布应用;配置数据库连接,修改web.xml等等,更重要的是这一切都可以通过向导来完成。

方便迁移

使用 Application Advancement Assistant工具,可以方便的把WAS CE上开发的应用程序迁移到WebSphere Application Server V6.1上去

工具下载地址http://alphaworks.ibm.com/tech/wasma/download

迁移示例

将 WebSphere Application Server Community Edition 应用程序方便地迁移到 WebSphere Application Server

WAS CE和WAS属于同一家族产品,迁移过程中的问题较之使用Tomcat,肯定会大大减少,最重要的是,使用这个工具,就算遇到问题也可以显示出问题出现在哪些地方,方便定位。

简单集群和故障转移的支持

现在很多项目正式运行都是用WAS ND版做了WAS的集群来提高可靠性,但是基本上程序开发时都是考虑单机环境。WAS CE支持web层的负载均衡和故障转移,可以在开发时就考虑到如何更好的利用集群环境。

clip_image004

丰富的文档支持

IBM产品的一大特点就是文档丰富,可以给开发人员极大帮助。

WAS CE的开发社区

http://www.ibm.com/developerworks/spaces/wasce?S_TACT=105AGX01&S_CMP=LP&pageid=710

里面有支持与文档、示例与工具、技术文章、迁移资源等子栏目,可以解决开发过程中遇到的疑难杂症。

WebSphere Application Server Community Edition V2.1 文档,如果纯属使用WASCE的问题,可以先到这里找到快速解决方案

http://publib.boulder.ibm.com/wasce/V2.1.0/zh_CN/index.html

WebSphere Application Server Community Edition 专栏 ,WAS CE在IBM developworks上的专栏,里面有翻译好的专栏文章。

IBM 800 Support

作为免费的Tomcat,缺少技术支持是它不能很好的作为商业运行平台的一个重要因素。JBoss虽然有支持服务,但是它需要每年花费16000美元来购买管理控制台,并且每4个CPU每年另加6750美元(For deployments of under 32 CPUs JBoss requires separate purchase of the admin console support for $16,000 / year in addition to the $6,750 / year for each 4 CPUs )。相比较而言购买WAS CE的支持则优惠很多。

结束语

上述是我对开发过程中中间件的选用的一个建议,如果今后项目是WAS平台,各位项目经理可以考虑使用WAS CE作为开发平台。至于WAS CE开发的应用程序能否无缝迁移到Weblogic,开未作研究。

WAS CE21的PPT,有兴趣的可以仔细阅读一下。http://docs.google.com/Presentation?docid=dgqfmsbr_1gvbmbjth

你需要多大的池?— WebSphere性能优化(一)

2009年5月8日 hashei 没有评论

前言

What is the Cause of the Performance Problem? 或者是How to Improve the Performance?

这是我们在系统开发、部署过程中都会面对的问题,但是却很难回答。从下面的这幅图就可以看到,一个系统的性能瓶颈(bottleneck),可能在网络、防火墙,也能在Http Server,Application Server,或者是数据库;系统中一个或者多个“短板”的存在,就能让系统无法达到设计时的目标,无法满足已经签在合同里的SLA……

虽然性能问题牵涉到方方面面,但是本系列关注点在于中间件这一层。希望能用合理的配置避免诸如OutOfMemory(某些情况下)、数据库连接不够的发生,同时能应用一些参数使系统在不优化代码的情况下有5%到100%的提升。

what is cause of the performance problem

言归正传

池(Pool)是WebSphere中最常涉及的概念之一。从网络、Web 服务器、Web 容器、EJB 容器,一直到数据源,每一个环节都线程池、连接池的影子。要想恰当配置这些池的大小,首先要了解漏斗模型

queuing network

通常,WebSphere应用中的一个请求到达服务器,到真正开始处理,要经过一系列的连接池。广域网上可能有大量的并发用户同时访问Web服务器,Web服务器上同时活动(Active)的连接可能高达10000个。但Web服务器到应用服务器(Web容器)的连接池大小可能只有200。Web容器到EJB容器的连接池更小,可能是80。然后,经过数据源(Data source)到数据库的连接最大可能只有25个。从Web服务器的连接池到数据库的连接池尺寸逐渐变小,像一个漏斗(funnel),所以称为漏斗模型

摘自《构建高性能WebSphere企业级应用》第二章

 

IBM 000-253中有这么一道题:

According to the Upstream Queuing model for performance tuning, what reflets the correct application of recommended settings for maximum concurrent clients?

A Web Server=75, Web container=75, Datasource =25

B Web Server=75, Web container=50, Datasource =25

C Web Server=50, Web container=50, Datasource =50

D Web Server=25, Web container=50, Datasource =75

根据漏斗模型,那么很显然应该选B。

那么实际生产环境中就如此依样画葫芦就可以了么?后面的池一定比前面的小么?如果当前性能不行,增大池的大小就能提高么?

绝没有那么简单。后面的池小于前者,比如数据库连接池小于web线程池,默认的假定是:并非每个JSP和Servlet都需要访问数据库。如果你的应用是数据库密集型的应用,基本上每个JSP和Servlet都需要访问一次或多次数据库,而且系统中还有一些不经过jsp或Servlet的后台进程。那么数据源的连接池就必须大于web容器线程池,否则会报无法得到连接的错。

下面按照我的经验讲述一下每层池大小设置值

对于Web服务器

IBM HTTP Server的优化就是对Apache的优化。一般需要调整httpd.conf中如下参数:

MaxClients用来定义Web服务器可以同时支持的最大并发连接数或并发用户数,默认值是600。这个值需要根据你所希望的同时支持的并发用户数来设置,一般是峰值的120%。当然这个值不能设的太大,毕竟Apache吃内存也是很厉害。我遇到的项目一般是不用调整的,大家可以根据实际负载动态的调整MaxClients。

将 IBM HTTP Server 配置为显示状态页面:

  • 编辑 IBM HTTP Server 的 httpd.conf 文件,从此文件的下列各行中注释注释字符(#):
    #LoadModule status_module, modules/ApacheModuleStatus.dll,
    #<Location/server-status>
    #SetHandler server-status
    #</Location>
  • 保存更改,然后重新启动 IBM HTTP Server。
  • 在 Web 浏览器中,转至 http://yourhost/server-status。并且,单击重新装入以更新状态。
  • (可选)如果浏览器支持刷新,那么转至 http://your_host/server-status?refresh=5 以便每 5 秒钟刷新一次。

webserver high performance

上图给出了一些其它参数的推荐值。注意Windows平台和其它平台的不同(ThreadsPerChild相当于Maxclients)。关于MinSpareServers, MaxSpareServers, 和StartServers 等的设置,以及MPM使用prefork或worker模块时的不同,可以阅读Apache Performance Tuning

如果你的应用访问量很大,那么也许你需要优化一下操作系统的tcp/ip相关参数。 http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tprf_tuneopsys.html

并修改“负载均衡”选项和“重试时间间隔”Web 服务器插件属性设置以提高性能http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tprf_tunewebserv.html

Web容器线程池

要点就是:“通常,对于每个服务器 CPU,5 至 10 个线程将会提供最佳吞吐量”(现在的一个cpu可以用核来代替)。比如你的Pc Server有2块CPU,每块CPU都是4核,那么你一个Application Server可以设置的最小值和最大值可以分别为40、80。但是一般考虑到能充分利用CPU和Memory,或者为不同的应用启用不同的application server,一台Pc Server上并不仅有这么一个appserver,而且还有别的进程在占用着CPU,所以默认的10到50(Linux 系统上 25 个)是一个比较合适的值,当然更准确的值需要通过性能测试来确定。

在进行性能测试的时候,如果吞吐率不是很满意,或者在TPV中看到线程池占用一直是最大值,不要立刻就调大线程池的设置——往往吞吐率会更一步下降。这时候要注意CPU占用率的情况、vmstat的r列值,特别是System状态占用率的情况,如果接近10%,甚至超过10%,那么可以肯定系统在进程切换上面消耗的资源太多了。下调线程池的大小反而会提升吞吐率,而且会由于吞吐率的提升降低页面平均响应时间。

这篇文章也许会使你对线程池大小对性能的影响有个感性的认识。

设置的地方大家应该都晓得,单击服务器 > 应用程序服务器 > server_name > 线程池。

数据库连接池

连接池的最小值,应该和性能测试时TPV观察到的jdbc平均大小一样,最大值根据实际需要设置,每次增长可以设置成大于1,增长一次到位。总之尽量避免连接池频繁的增长和收缩,减少wait的情况发生。

可以使用 Tivoli Performance Viewer 查找池中最优连接数。如果并发等待者的数目大于 0,但是 CPU 负载未接近 100%,那么考虑增加连接池大小。如果使用百分比值一直低于正常工作负载,那么考虑减少池中的连接数。

Application Server 将在使用该数据源的每个应用程序服务器中创建连接池的单独实例。例如:

  • 如果运行包含三个服务器的集群,这三个服务器都使用 myDataSource,并且 myDataSource 的“最大连接数”设置为 10,那么可生成多达 30 个连接(3 个服务器乘以 10 个连接)

这是需要考虑的,别数据库端的连接大小不够了。此外,inactive timeout和timeout的时间应该大于收集时间。

总结

这篇文章参考了IBM的inforcenter和developworks,给出了优化WebSphere池大小的一些经验值,但是真正合适的大小还要参考实际的情况,总之调优是个循序渐进的过程。

继续逛逛

调整完了各种池的大小,接下来你需要对内存参数做些优化,这篇是纲领性的。

JVM的恩恩怨怨-WebSphere性能优化(二)

针对不同的JDK,你可以参考:

JAVA性能优化—Sun Hotspot JDK JVM参数设置

JAVA性能优化—IBM JDK JVM参数设置