`
squall140
  • 浏览: 146139 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Struts2与Spring3 MVC 性能对比(一)

 
阅读更多

 

转载自 http://elf8848.iteye.com/blog/698217

 

 

 

你想建设一个能承受500万PV/每天的网站吗?
500万PV是什么概念?我的服务器每秒要处理多少个请求?

PV是什么?
PV是page view的简写。PV是指页面刷新的次数,每一次页面访问,就算做一次pv流量。

计算模型:
每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60秒*40%))/服务器数量
其中关键的参数是80%、40%。表示一天中有80%的请求发生在40%的时间内。24小时的40%是9.6小时,有80%的请求发生一天的9.6个小时当中(很适合互联网的应用)。

((80%*500万)/(24小时*60分*60秒*40%))/1 = 1157个请求/秒
((80%*100万)/(24小时*60分*60秒*40%))/1 = 231个请求/秒


结论:
现在我们在做压力测试时,就有了标准,如果你的服务器一秒能处理1157个请求,就可以承受500万PV/每天。这里不关心是请求的是静态的html,还是动态的jsp。
如果你的服务器一秒能处理231个请求,就可以承受100万PV/每天.

说明:这里说明每秒N个请求,更像是TPS。而不是请求一个html页面而附带请求的css,js,图片。因为我关心的是应用程序处理业务的能力。


---------------------------------------------------------------------------------------
基本概念:
Throughput(吞吐量):按照常规理解网络吞吐量表示在单位时间内通过网卡数据量之和,其中即包括本机网卡发送出去的数据量也包括本机网卡接收到的数据量。
并发用户数:是同时执行操作的用户
响应时间:对请求作出响应所需要的时间
---------------------------------------------------------------------------------------
JMeter测试参数说明:

Label:每一个测试单元的名字。

#Samples:表示一个测试单元一共发出了多少个请求。

Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间。,不重要。

Median:中位数,也就是 50% 用户的响应时间,如果把响应时间从小到大顺序排序,那么50%的请求的响应时间在这个范围之内。重要。

90% Line:90% 用户的响应时间,如果把响应时间从小到大顺序排序,那么90%的请求的响应时间在这个范围之内。重要。

Min:最小响应时间,不重要。

Max:最大响应时间,出现几率只不过是千分之一甚至万分之一,不重要。

Error%:本次测试中出现错误的请求的数量

Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
---------------------------------------------------------------------------------------
loadrunner测试参数说明:

响应时间: 取90%值,如果把响应时间从小到大顺序排序,那么90%的请求的响应时间在这个范围之内。重要。

每秒点击数 :hits per Second,每秒钟向服务器提交请求的数量。

TPS: Transaction per Second ,每秒事务数,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程

Throughput(吞吐量): Loadrunner记录的Throughput是接收到服务器返回的所有字节数之和,与本地发出的字节数无关。

Throughput/Sec: 每秒的吞吐量。


对于BS架构的一般分析 响应时间、点击率、吞吐量、TPS(每秒事务数)。
对于CS架构的一般分析 TPS(每秒事务数)

---------------------------------------------------------------------------------------

Apache ab测试参数说明:

RPS: Request per Second,每秒处理的请求数

详见:
http://blog.chinaunix.net/u3/108043/showart_2260477.html
---------------------------------------------------------------------------------------


测试配置如下图: 其实jmeter还是很弱的,我打开"集合点(synchronizing Timer)","察看结果树","用表格查看结果"中的任何一个都会导致性能下降和小部分请求的响应出错(可能是线程数太多了),所以禁用了。只启用了cookie管理器。


---------------------------------------------------------------------------------------
Tomcat6.0 配置文件的说明 ,做测试之前是要整清楚的。
默认的Server.xml中如下
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />


enableLookups
是否允许DNS查询,当web应用程序要通过域名服务器查找机器名转换为IP地址时。会使用DNS查询,需要占用网络,延长较长
maxThreads
Tomcat可创建的最大的线程数,每一个请求须要一个线程来处理,原来的150太小了,我们测试时并发会超过他的。
acceptCount
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。
connnectionTimeout
网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为20000毫秒。
minSpareThreads
Tomcat初始化时创建的线程数
maxSpareThreads
一旦创建的线程中空闲线程超过这个值,Tomcat就会关闭不再需要的socket线程。

注意:maxThreads 设置为500,也就是最多有500个线程,为下一步的压力测试做好准备。

---------------------------------------------------------------------------------------

测试环境说明:
服务器: 4G内存,至强3.0 (4核超线程)CPU,windows 2003
测试机:笔记本 2G内存,p8600 CPU,windows XP
网络:100Mb局域网
测试软件:
Jmeter 2.3.4    分配了512M内存
tomcat 6  默认内存大小
---------------------------------------------------------------------------------------
测试时服务器CPU使用率 10%
测试时测试机CPU使用率 100%(测试机不行啊)
每次测试CPU都这样,就统一写这里了。

测试1:2213个请求/秒
100并发,循环100次,共10000个请求,请求一个大小3.34KB的jsp页面。



测试2:1889个请求/秒
100并发,循环100次,共10000个请求,请求一个servlet总控制器,验证权限后,new一个Action,再转发到一个大小3.34KB的jsp页面。



测试3:2607个请求/秒
100并发,循环100次,共10000个请求,请求一个3.2KB的html页面。



测试4: 833个请求/秒
100并发,循环100次,共10000个请求,请求一个13.4KB的html页面。与上面比是只是文件大了一些,性能就降了不少!!



测试5: spring   2012个请求/秒
100并发,循环100次,共10000个请求,请求一个spring3 MVC的action,再转发到一个0.8K的JSP,其内容是简单的html



测试6: spring   1800-1924个请求/秒
100并发,循环100次,共10000个请求,请求一个spring3 MVC的action,两个参数类型转换为int、Date,再new 一个List,再转发到一个1.3K的JSP,用JSTL标签显示List中的内容。

JSTL标签内容是如下,看来JSTL标签性能还是不错的。
<c:if test="${empty list}">
<tr>
<td align="center">无记录!</td>
</tr>
</c:if>
<c:if test="${not empty list}">
<tr>
<th>从 1 开始的迭代计数</th>
<th>从 0 开始的迭代计数</th>
<th>产品名称</th>
</tr>
<c:forEach items="${list}" var="item" varStatus="s">
<tr bgcolor=${s.index%2==0?"#E2E2E2":""}>
<td align="center">${s.count}&nbsp;</td>
<td align="center">${s.index}&nbsp;</td>
<td align="center">${item}&nbsp;</td>
</tr>
</c:forEach>
</c:if>


测试7: 图片   1997个请求/秒
100并发,循环100次,共10000个请求. 因为我使用了spring3 MVC,拦截/,所以图片不能访问,所以添加了:
<servlet-mapping>     
    <servlet-name>default</servlet-name>     
    <url-pattern>*.jpg</url-pattern>     
</servlet-mapping>
走默认的servlet,来访问2.5K的图片



测试8: 图片   1967个请求/秒
100并发,循环100次,共10000个请求,因为我使用了spring3 MVC,拦截/,所以图片不能访问,所以添加了:
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
来访问2.5K的图片,会走spring的可匹配的一个拦截器。


测试9:Struts2的测试
100并发,循环1次,没有循环100次,因为strtus2在这次测试中响应太慢了,我等不起了,所以单个url的测试样本从10000降到了100.一共11个url,共1100个样本。
"spring" 使用的就是前面“测试5”的URL,放在这里是为了与strtus2对比的。
"html"   使用的就是前面“测试3”的URL,放在这里是为了与strtus2对比的。
"struts2-1" 使用的是官方自带的示例项目,名称是struts2-blank-2.1.8.1.war
"struts2-2" 使用的是官方自带的示例项目,名称是struts2-showcase-2.1.8.1.war,我在其中随便选了一个action来做测试
"struts2-3" 同上
"struts2-4" 同上
"struts2-5" 同上
"struts2-6" 同上
"struts2-7" 同上
"struts2-8" 同上
"struts2-9" 同上
太忙了,没有时间对Struts2做优化,使用的都是官方带的示例,Struts2的测试结果不理想,放在这里做一个参考。“struts2-1”是struts2中测试成绩最好的,但也不理想。



测试10:Struts2的测试。
上一个测试结果太离谱了,第二天,想了想又重新测试了下,使用的还是struts2官方提供的struts2-blank-2.1.8.1.war示例。访问下面的action,action内容简单就是转发到一个JSP。
http://192.168.0.5/struts2/example/HelloWorld.action

下图是示例默认的action,我没有修改:

要说一说转发到的jsp,其中有struts2标签
<s:property value="message"/>
<s:url id="url" action="HelloWorld">
     <s:param name="request_locale">en</s:param>
</s:url>
<s:a href="%{url}">English</s:a>

我把jsp改了,删除了所有struts2标签,只输出一行文件

天啊,性能超出我的想像,太好了。看来是struts2标签拖了后腿。

我把jsp改了,换了其它的struts2标签

标签是:
<s:form action="Login">
    <s:textfield key="username"/>
    <s:password key="password" />
    <s:submit/>
</s:form>
看来struts2的标签性能太差了。

Struts2由于采用了 值栈、OGNL表达式、struts2标签库等,会导致性能下降。如果避免或减少使用这些,性能还是很好了。
Struts2的 多层拦截器、
多实例action不是导致性能问题的原因。


注:以上测试都没有数据库,也没有业务,action中,jsp中内容很简单。

---------------------------------------------------------------------------------------

其它测试文章:
http://zhaoshg.iteye.com/blog/356231
http://www.iteye.com/topic/679543

MVC框架性能比较
http://wenku.baidu.com/view/148d7e34eefdc8d376ee32ac.html

spring3mvc与struts2比较
http://www.iteye.com/topic/646240



附:
几种标签和框架组合解析数据时候的 性能测试对比

一、 数据

数据通过查询日志表得到数据,共 1302 条数据,将查询出的数据放入一个静态 List 中,保证每次请求的数据相同。

测试页面的元素相同,只是在取数据方式上不同。

二、 测试目标

1、 JSP 页面使用 struts2 标签的性能;

2、 JSP 页面使用 JSTL 标签的性能;

3、 Freemarker 页面使用 struts2 标签的性能;

4、 Freemarker 页面使用 JSTL 标签的性能;

5、 Freemarker 页面使用其本身的数据加载方式的性能。

三、 加载耗时对比

时间: ms           注:每一次对比都是在同一时间段按同一顺序依次执行下列几种方式

 

 

 

struts2

JSTL C

Freemarker-struts2

Freemarker-C

Freemarker

第一次

306

58

1618

 

41

第二次

202

52

1643

 

39

第三次

211

58

2047

 

36

第四次

196

49

1621

 

28

第五次

218

52

1607

 

40

第六次

303

331

1857

 

45

第七次

210

50

1671

 

33

第八次

311

51

1699

 

47

第九次

462

55

2180

 

37

第十次

218

46

1721

 

42

平均值

263.7

80.2

1766.4

 

38.8

去掉最高和最低

223.75

53.125

1547.125

 

39.125


分享到:
评论

相关推荐

    struts1原理,struts2原理,spring mvc原理,struts1和struts2,struts和spring mvc

    **Struts2与Spring MVC比较:** 1. **灵活性**:Spring MVC允许更多的自定义,如自定义拦截器、视图解析器,而Struts2的扩展性相对弱些。 2. **依赖注入**:Spring MVC是Spring框架的一部分,天然支持DI,而Struts2...

    spring webmvc struts 2.5 很难找的依赖包

    spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 spring webmvc struts 2.5 ...

    struts2与spring2的整合

    Struts2和Spring是两个非常重要的Java开源框架,它们分别在MVC(Model-View-Controller)架构和依赖注入(Dependency Injection,DI)方面发挥着关键作用。将这两个框架整合在一起,可以构建出高效、可维护的企业级...

    Struts2与Spring2框架整合实例

    3. **Struts2的插件机制**:Struts2提供了Spring插件,该插件负责连接Struts2和Spring,允许Struts2通过Spring获取Action实例。这需要在struts.xml配置文件中添加相应的配置。 4. **AOP代理**:Spring的AOP功能可以...

    struts2-spring-plugin-2.3.4.jar

    在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖注入(DI)和面向切面编程(AOP)等功能,而 Struts 2 则是一个强大的MVC(Model-View-Controller)框架,负责处理用户请求和业务逻辑。 Struts 2 和 ...

    struts2-spring-plugin-2.2.1.jar

    Struts2-Spring-Plugin-2.2.1.jar 是一个专门为 Struts2 框架与 Spring 框架集成而设计的插件。这个插件的主要目的是简化在基于Struts2的应用程序中整合Spring的功能,如依赖注入(DI)、AOP(面向切面编程)以及...

    struts2+spring3+ibatis项目整合案例

    Struts2与Spring3的整合,使得我们可以利用Spring来管理Struts2的Action,从而实现依赖注入,提高代码的可测试性和可维护性。 Spring3则是企业级应用的全面解决方案,包括IoC(Inversion of Control,控制反转)和...

    Struts2与Spring整合的demo

    - `StrutsSpring`可能包含一个简单的整合示例,包括Struts2的配置文件、Spring的配置文件以及相关的Action类和业务接口。 - 示例可能会展示如何配置Action类,如何在Spring中定义bean,以及如何在Struts2中引用...

    struts2+spring+mybatis+easyui的实现

    Struts2、Spring和MyBatis是Java Web开发中经典的三大框架,它们分别负责MVC模式中的控制层、业务层和服务层。EasyUI则是一个基于jQuery的UI组件库,用于快速构建美观且响应式的Web应用界面。下面我们将深入探讨这三...

    struts2+spring4+hibernate

    同时,Spring4的Spring MVC模块可以与Struts2结合使用,提供另一种MVC实现方式,以应对更复杂的应用场景。 Hibernate则是一个强大的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。在电子商务系统...

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    `struts2-spring-plugin-2.5.16.jar`是Struts2与Spring集成的插件,它使得Struts2可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力。通过这个插件,我们可以将Action类的实例化和管理交给Spring容器,从而...

    struts2+spring练习

    Struts2提供了MVC(模型-视图-控制器)架构,帮助开发者更好地组织和管理应用程序逻辑,而Spring则是一个全面的后端框架,提供依赖注入、AOP(面向切面编程)、事务管理等特性。 在"Struts2+Spring练习"项目中,...

    spring.jar spring-webmvc-struts.jar spring-webmvc.jar

    "spring-webmvc-struts"可能指的是Spring与Struts的集成包,Struts是另一个流行的Java Web MVC框架。这个库可能包含了一些桥接代码,帮助开发者将Spring的IoC(Inversion of Control,控制反转)和AOP功能与Struts的...

    struts2+spring3+hibernate3所需jar包

    Struts2、Spring3和Hibernate3是Java Web开发中经典的SSH(Struts2、Spring、Hibernate)企业级应用框架组合。这些框架各自扮演着不同的角色,共同构建了一个强大的后端开发解决方案。 Struts2作为MVC(Model-View-...

    struts2-spring3-hinernate4

    SSH(Struts2、Spring3、Hibernate4)是Java Web开发中的一个经典组合,用于构建高效、可维护的Web应用程序。这个压缩包包含了SSH框架集成的相关资料,让我们逐一解析其中的知识点。 首先,Struts2是MVC(Model-...

    Struts VS Spring两种MVC框架比较

    本文将对比分析Struts与Spring这两种流行的MVC框架,帮助开发者更好地理解它们的特点与适用场景。 #### Struts框架详解 **背景介绍** Struts是Apache Jakarta项目下的一个开源框架,由Craig R. McClanahan等人...

    struts2+spring实例程序

    Spring还提供了Spring MVC模块,用于构建Web应用程序,它与Struts2类似,也是一个MVC框架,但提供了更现代的API和更强大的数据绑定功能。 当我们把Struts2和Spring结合起来使用时,可以创建出高效且可维护的企业级...

    struts2+spring+mybatis框架

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,用于简化开发并提供更好的控制层。它提供了丰富的拦截器、结果类型和插件机制,使得开发者能够方便地处理请求、控制业务流程和展示视图。...

    struts2+spring+springstruts2+spring+springstruts2+spring+spring

    在IT领域,特别是Java开发中,Struts2、Spring以及Hibernate(SSH)组合是一个非常流行的MVC(Model-View-Controller)架构模式实现方案。尽管标题和描述中的重复信息可能是一个错误,但我们可以深入探讨Struts2、...

    Struts2+Spring演示实例源代码

    3. **Struts2与Spring的整合**: - **Spring插件**:Struts2提供了一个Spring插件,使得Spring管理的Bean可以直接作为Struts2的Action。 - **Action配置**:在struts.xml中声明Spring管理的Action,不再需要在...

Global site tag (gtag.js) - Google Analytics