j2ee性能调优之最小化资源压力测试法则
来源:中国IT实验室$@9E"W+s4h*n;Y)U+s
8V;y(S;Y/R5G8q
摘要:我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题。最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作。0d/a.\.v4H5U5n4['V
tech.techweb.com.cn3A"w)],A5a,k8d;x$`
前面看到有人讲j2ee的性能调优,虽然这块不是自己的专长,但是猪养多了,也忍不住跳出来说几句。TechWeb-技术社区*o K1\'Q1t,\ l6D1~&d*[
!W!f;i7n8W ~&l L6`#^TechWeb-技术社区 虽然几乎每本讲性能调优的书籍开篇都会提,没必要的情况下就不要做调优,但是我个人还是认为,所有系统在上线前,都应该做一次基本的压力测试并对相关的性能问题进行检测, 但是迫于资源压力,很多项目都无法做正规的压力测试,一直到系统上线出现问题,才倒回来找原因。 而正规的压力测试,往往因为需要严格模拟生产环境,需要耗费大量的资源,各类专家配合解决问题,并不是那么轻松的可以做下来的。
,V5k2}5`.~+o6Z$S"j#H0C0~.O-B
而j2ee应用的特点就是以复杂性来回避传统问题,所以任意一个j2ee的部署,相对于php那样的结构都是比较复杂的。系统一旦发生性能问题,必须在程序、数据库、应用服务器、jvm、操作系统几大块中交叉进行考虑,根据实际情况问题,问题的原因可能异常复杂。我们可以想象一个项目,从来不做UT不做IT ,只做一次UAT,然后直接提交给用户上线以后,修补错误的困难度和成本。
&P-P.e"E.E程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛0?/B6d'U1j9u%|.],E!v
经常看到一些调优的最后解决方案,可以肯定,几乎80%以上都是一些低级的程序错误导致的,剩下的20%虽然可能是用硬件,os参数调整等等问题解决了,但是其中很大一块,归根到底也是程序的问题。 而在我们回顾这些错误的时候可以很惊人的发现,大部分都是一些低级错误。
(l Y#m'O(D3m
#s:k2v*O9@3rtech.techweb.com.cn 我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题。最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作。这种做法的优点如下。:_2V.]#|%A
,@,z0N1s-R%L 1. 环境容易搭建, 特别是不需要考虑大型硬件和网络条件等等,也回避了开发人员可能不熟悉unix和特定应用服务器等问题tech.techweb.com.cn#Q5n/J+R)d8J,E
7^!r+Y"@*f)~5J
2. 不需要特别的数据库,操作系统和应用服务器专家配合,开发人员自身即可完成。
)l9C7p'\0P$p6P;N1G.FTechWeb-技术社区
C,s8u'F8N/~1g 3. 不需要特别的依赖os和应用服务器,jvm的监测工具。选择自己最熟悉的即可。tech.techweb.com.cn-r&s2g%x(n a#d#q/C
8u9A'@-{8n;Y)jtech.techweb.com.cn 4. 开发人员在熟悉这种过程以后,再转到正式的生产环境工作时也更有经验,更容易解决问题。
J0P6N,k;I!h&j&H a程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛%h!{*v({9Z(K8t/s+N
对测试过程做一点简单介绍。({6V:f3R0B/?$R$z+T
*W4r;m"G&i
工具准备:
'j'O-F:L0h/[;e l![程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
#o)| u+`5U8h4c(I,L.z 得益于开源技术的发展,大部分工具都可以免费获得,使用也比较简单。TechWeb-技术社区4h%G"r6J!k:`+C
!^'R i&L5h#C)R 1. jvm 监控: 对jvm的运行状态进行分析, 可以使用jvm自身带的特性输出日志,结合hp的jmeter profile进行分析。也可以使用jrockit自带的图形化工具mession control。tech.techweb.com.cn)S'z/y$|0Z*`&E*K
;A9c0\6i-P!V!k1dtech.techweb.com.cn 熟悉什么用什么,越简单越好,目的主要是观察内存堆的变化,线程资源变化,gc情况等。;R*q8e$W+]&c#^#G'?
TechWeb-技术社区/K)f;u3F!Q7J(p"{
2. 数据库监控工具: 熟悉数据库的使用数据库自身的特性,不熟悉的可以使用第三方工具,主要目的是观察数据库的锁,连接数信息, 对于db2我比较喜欢使用quest central。 oracle使用OEM或者自身的数据字典已经可以。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛%t G(y!U/?)R2Y:r)y
-b2_5Z;h.C5yTechWeb-技术社区 3. 应用服务器监控: 主要目的是记录方法的调用情况和执行时间 ,找出频繁调用的方法和执行时间过长的方法。使用jprobe和jprofile都可以很轻松的做到。 如果使用的应用服务器比较偏门,那么可以换一个支持这种检测工具的应用服务器。反正主要目的只是在找问题。4R,r3o d$c3N8O*]4b
4g/L+f#v1s!xTechWeb-技术社区 4. sql执行监控:跟踪找出执行时间过长的sql。 我喜欢使用p6spy。)P$?&I/u)N7Q!}
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛%R5F2p2S;m/H$Y5u:f0{
5. 压力工具: jmeter+badboy , 有条件的可以用loadrunner, 和loadrunner近似的还有一个免费的开源产品。 另外web 应用的话, 也可以使用selenium这样的ff扩展来做。微软vs自带的也不错,反正是什么简单用什么。
-p;e(x-?2A)R)G.P!nTechWeb-技术社区
"g;i,E-q6S/a+?%y*@TechWeb-技术社区 6. 记录表格: 对问题和资源配置的变更进行记录和对比。
+K!Q!X,E0{:f$[:n(q!O N+v/U+G+Q'W#b
我发现有些人做压力测试,只用压力工具来跑,不肯用各类proile工具来跟踪应用和数据库使用情况,加上经验又不足,结果测来测去都是瞎猜。
$F(D%B$b#R8o8m2\
!v.?!M$n;`&e 设置:TechWeb-技术社区,m*x:Q"F4h/{%Y;?
5r/E3K/l2\'aTechWeb-技术社区 1. 数据库: 如果未使用连接池, 则尽可能的将数据库允许连接设置成最小数字,推荐是从1开始。如果使用连接池,则设置为1.4F"t)j!k"G&u:R(c
9[4L!m%`-Q5_/@1q G
随着并发模拟数的增加也可以适当上调,但是一定要低于压力工具模拟的并发用户数。数据库环境尽可能接近生产环境,至少要有足够的测试数据。)D;s8Z4?&P
TechWeb-技术社区6W!l+t1a)F:A-I;H8D
2. 应用服务器: 对jvm启动堆做最小化设置。比应用服务器要求的最低内存略高,保证应用可以正常启动即可。根据模拟用户数增加可以小步适当上调,但是以保证应用基本运行即可。千万别来大内存。/[1B$J"A1U/]5A
5j,o%Y i,d*t 3. 压力模拟并发数,从1开始逐步往上加。一次加1,2个,上限不要太高,5-10个足以。
4x(j%_$x-b#T M,g;}$B#J:~$l9F#J%z w1f ~#a
步骤
({-N9@7E(Y!k,U0_"Otech.techweb.com.cntech.techweb.com.cn'K3H6O4s4S*A
1. 按1用户1连接的方式进行检测
7{&d'o*@:Z'Y7{.I)X/k6N;stech.techweb.com.cnTechWeb-技术社区7Z:@:k"h*b:z-]+K+o0V
* 找出系统是否存在明显的资源泄露,比如数据库连接,如果存在泄露此种情况下服务器很容易就hold。TechWeb-技术社区!?2x5K:B/v1|:X2B3X
7w'd"A*},e * 找出执行时间过长的java方法和sql。进行分析修改。tech.techweb.com.cn B1`+m"S+K4v.T(A$I
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛,_$]3|,c!\1~0_
* 找出那些调用过多的方法和sql,对程序进行分析,看是否做了不必要的调用。 这个问题尤其在使用了第三方包的情况下要小心,我曾经监测出某人写的东西一个方法间接的调用了数据库操作近200次。
%M3k+[*m6G!}tech.techweb.com.cn D'G"d"p5^ H:[5r%J
有些人做测试喜欢从5以上的数字开始,实在不是什么好习惯,比较明显的问题都容易回避了。
,d.W+j'Q7\,G
&k,C)c&V t,^9t#A:Z 2. 适当增加并发用户,尽可能不调整应用内存,对系统进行长时间的压力测试,比如2-4个小时。 重点观察是否存在内存泄露问题。 内存泄露的问题比较复杂,有时候还依赖于jvm和os,另外有些内存泄露只能在大并发的多线程环境下才会出现。 但是这种测试可以排除掉一些明显的问题,主要是缓存和队列之类的东西。内存泄露一般jvm会有报错和相关的日志dump文件。
-q)P:\ W7n!^0btech.techweb.com.cn2J5e;?%A4v,W4G
3. 逐步增加并发用户和连接数,观察是否存在sql锁 和线程锁的问题。另外并发情况下也可能存在其他一些资源冲突,比如读写文件的情况等等。
(J;C+u7f:n)u)o%c2U0L+@5b*O.X:^&M0s$g,^ \
线程情况可以使用监控工具观察,比如jrockit带的mc, 也可以直接dump jvm 内存快照找工具分析。
:^2F6I(`1T"B4C!n#Z3F+L4@9|&t
4. 尽可能增加并发用户数,以当前应用能承担的上线进行长时间测试,比如半天到1天,观察是否会存在内存泄露,是否会存在线程资源消耗的问题。也需要检查一下数据库的连接数情况,看是否会一直持续增加,这说明连接池实现有问题,或者设置过大,也可能是jdbc的问题。
&i(G&x+a#o&z程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9o4A!Z:H7x%n!i$B
5. 其他: 对jvm 可以使用sun和bea的都对比跑一下, 两个实现情况大不同。 jr大并发支持好,所以可能jr上没问题,但是sun的就有问题了。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 w&`*I%o%q.T$D
1X1U5X#D)C/C-`2Q
大部分的问题应该都可以在步骤1,2能得到暴露。在完成了这样的初步测试以后,正式的测试就省心不少了,如果客户有钱,性能不好也可以直接更新硬件了,省事又创造GDP。
|