Sitemesh对于性能的影响实验报告
时间:2009-07-15 11:11    来源:未知    作者:YODA
核心提示:1. 目的 Sitemesh 是一个很好的页面渲染框架,基本上我现在所在项目都是适用sitemesh做页面框架和整合渲染的,给页面部分的工作带来了很大的便利性。 在sitemesh的文档中,对于sitemesh的工作原理给出了一个图示,根据这个图可以看出,sitemesh是通过组合适

1. 目的

Sitemesh 是一个很好的页面渲染框架,基本上我现在所在项目都是适用sitemesh做页面框架和整合渲染的,给页面部分的工作带来了很大的便利性。

在sitemesh的文档中,对于sitemesh的工作原理给出了一个图示,根据这个图可以看出,sitemesh是通过组合适用filter和 标签将被渲染页面的内容抽取出来,再整合到一个统一的框架页面中去。曾经有一段时间测试环境的Websphere服务器频繁出现内存溢出的问题,在跟踪内 存溢出问题时,发现sitemesh组件使用StringBuffer对象进行大量内存申请的动作。这就需要检测sitemesh具体是如何来分析页面 的,我的猜测就是将被渲染的页面中的最终HTML代码展出到一个大的字符串,然后根据关键标签来进行分析和内容抽取,然后再整合到框架页面中。先不管 sitemesh是用什么方式来分析、抽取和整合的,他对于内存的影响是比较明显的,所以,本实验的目的就是比较使用sitemesh和不使用 sitemesh时,运行期性能是否存在差异。

 

2. 环境

本实验使用到的环境如下:

· OS: Windows XP Professional SP2

· HW: Intel Core 2 Duo T7300 2.0GHz, 2GB RAM

· Web Server: Resin 3.2.1

· Sitemesh: 2.3

· Test Tool: Load Runner 8.0

· JDK: Java HotSpot(TM) Client VM 1.5.0_09-b03

· Analysis Tool: IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 2.5

 

 

3. 过程

1. 使用ant example创建sitemesh自带的example web应用

2. 在sitemesh example应用中加入一个JSP页面data.jsp,该页面中包含一个43行7列的静态表格,表格部分的HTML源码约17KB

3. 同样制作上述数据的非sitemesh处理页面data_nosm.jsp,在sitemesh的配置文件decorators.xml中将data_nosm.jsp添加到排除列表

4. 以展开包的方式部署sitemesh example应用到resin服务器

5. 设置resin的JVM参数为:-Xms64m -Xmx256m -XX:MaxPermSize=256m -Xss1m -verbose:gc -Xloggc:C:/apps/resin-3.2.1/gc.log -XX:+PrintGCDetails

6. 在Load Runner中制作2个压力测试脚本,一个用来请求data.jsp,一个用来请求data_nosm.jsp

7. 在Load Runner中设计压力测试场景:10个用户,持续请求5分钟,每个用户的每轮请求中包含10次对于页面的请求

8. 重新启动resin服务器,进行data.jsp的压力测试。测试完成之后,收集Load Runner的数据以及GC的数据

9. 重新启动resin服务器,进行data_nosm.jsp的压力测试。测试完成之后,收集Load Runner的数据以及GC的数据

10. 数据汇总及处理

 

 

4. 结果

根据测试的结果,整理GC部分和压力测试部分的数据如下:

 

 

使用sitemesh

未使用sitemesh

GC次数

6,746

74

Full GC次数

1

1

GC消耗

0.02

0.00

GC暂停(秒)

7.00

0.00

最大持久代(字节)

8,388,608.00

8,388,608.00

平均持久代(字节)

6,036,328.00

6,205,085.00

最大旧生代(字节)

61,983,744.00

59,024,384.00

平均旧生代(字节)

42,583,685.00

31,929,903.00

最大新生代(字节)

61,983,744.00

59,024,384.00

平均新生代(字节)

4,426,710.00

4,610,566.00

请求次数

137,344.00

198,188.00

平均每秒请求

454.78

658.43

页面平均响应时间(秒)

0.042

0.029

上表的数据制作成图表如下(为了便于图表显示,部分数据进行了放大):

 

sitemesh性能测试_sitemesh

在上表中,GC消耗和GC暂停考量指标中,未使用sitemesh的情况下显示为0,是因为所用的分析工具IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 2.5的显示精度不足导致,实际的并非是真正的0,而应该是一个很小的数值。

从数据上看,使用sitemesh和不使用sitemesh对于虚拟机堆内存的使用差异不太大,但是在GC次数上的差异很大。从GC日志的详细信息 可以看出,在使用sitemesh时,发生次要GC(Minor GC)的频率非常的高,可以推断在运行时期产生了大量的短生命周期的对象,然后又迅速的被释放,GC在新生代就已经完成了。主要GC(Major GC, Full GC)在使用sitemesh和不使用的情况下,均发生了1次,而且这1次主要GC也是在resin启动中发生的,不是应用在进行压力测试时发生的。由于 使用sitemesh时的GC次数远远大于不使用sitemesh,所以在整个测试过程中,GC上消耗的时间也是差异非常大的。

从压力测试的探测可以看出,不使用sitemesh时完成的请求数是使用sitemesh时的144.3%。同时页面响应时间也仅为使用sitemesh时的69.0%。

 

 

5. 结论

从上述测试数据来分析,使用sitemesh对于系统性能是有较大的影响的,主要表现在GC的次数会显著增多。建议在大压力、页面内容大的系统中,慎重选择sitemesh,并且使用之前对其带来的性能影响进行一个较为合理、全面的评估。