一 测试目的 这次对Jetty和Tomcat进行性能测试,主要是为了给新版本WebPortal的开发选择合适的Java Web Server。 我们之前对老的Rest和新的TMMI都进行过性能测试,Rest有Akamai的缓存,性能基本

 

一 测试目的

这次对Jetty和Tomcat进行性能测试,主要是为了给新版本WebPortal的开发选择合适的Java Web Server。

我们之前对老的Rest和新的TMMI都进行过性能测试,Rest有Akamai的缓存,性能基本没有问题。但是WebPortal的内容是不断更 新的,不适合使用Akamai缓存,所以性能就全靠WebPortal本身以及均衡负载了。所以我想,在开发新版本WebPortal时,要尽量进行优 化,包括硬件、Web Server、数据库访问等。

Jetty和Tomcat是两个主要的开源Java Web Server,两者都比较成熟,Google App Engine使用Jetty,JBoss是使用Tomcat作为Web容器。究竟哪个更适合我们的需求,还是自己做测试比较靠谱。

这次测试中,Jetty的版本是6.1.19,Tomcat版本是6.0.35。被测试的应用是Akamai地图应用(AkamaiLogParser),为了方便测试,对代码进行了部分修改,后面会介绍。

二 Jetty和Tomcat的部署、配置

我们之前版本的Rest、WebPortal都是使用embedded的Jetty进行部署。Jetty和Tomcat都能支持stand-alone和embedded方式。下面就来介绍下Jetty和Tomcat stand-alone方式的部署和配置。

Jetty的部署、配置

1. 将Jetty的zip文件copy至服务器并解压,解压后可以看到如下文件(夹)

其中,bin中是一些启动Jetty的脚本和jar文件;contextes中是各个context的配置信息,一个context相当于一个应 用,比如AkamaiLogParser可以对应一个context;etc中是jetty的配置信息;webapps是jetty默认的存放部署的应用 的目录,不过在这次测试中,我建立了一个文件夹myapp,用于存放AkamaiLogParser。

2. 将AkamaiLogParser程序包copy至myapp目录下。要注意的时,要把项目所有依赖的jar文件放在 {JETTY_HOME}/myqpp/AkamaiLog/webapps/WEB-INF/lib里面,jetty会在这个目录下加载需要的jar文 件。另外,web.xml和spring的配置文件也可以放在WEB-INF下。

3. 在{JETTY_HOME}/contexts下新建文件akamai.xml,文件内容为:

其中contextPath是指访问AkamaiLogParser的URL,这里设置为“/”,URL就是http://domianname:port/***.html了。jetty.home是指AkamaiLogParser程序包所在的相对于{ JETTY_HOME }的路径。

4. Log4j.properties放在{ JETTY_HOME }/ resources下,jetty会从此目录读取log配置

5. AkamaiLogParser用到的额外配置文件conf.properties,可以直接放在{ JETTY_HOME }下,这是启动Jetty时的当前路径

6. 在{ JETTY_HOME }下,使用java –jar start.jar启动jetty

7. 可以使用java –XmsXXXm –XmxXXXm来调整分配给jetty的内存大小

8. 可以在{ JETTY_HOME }/etc/jetty.xml中修改jetty的配置信息,比如jetty的端口、minThreads和maxThreads等。后面在测试中,对 jetty进行性能调优时,主要就是修改minThread和maxThreads这两个参数。

Tomcat的配置、部署

1. Tomcat的部署方法比较简单,这里仅仅是为了测试,所以没有理会log的配置等。部署方法为将AkamaiLogParser的webapps下的所 有内容copy之{TOMCAT_HOME}/webapps/ROOT目录下,这里同jetty一样,需要将所有依赖的jar包放在WEB-INF /lib目录下。

2. 使用{TOMCAT_HOME}/bin/startup.sh启动tomcat

3. 调整为tomcat分配的内存大小的方法为,修改{TOMCAT_HOME}/bin/catalina.sh,在echo "Using CATALINA_BASE: $CATALINA_BASE"前添加如下代码:JAVA_OPTS="-server -Xms512m -Xmx2048m"。

4. 调整连接池的方法为在{TOMCAT_HOME}/conf/server.xml的Connector节点中添加如下参数:connectionTimeout="…" maxThreads="…" acceptCount="…"。

三 测试环境

被测服务器:

CentOS 5.6 64位

CPU:两个2.93GHz的CPU

内存:2G

JDK:1.6.0_29,Java HotSpot(TM) 64-Bit Server VM

Jetty:6.1.19

Tomcat:6.0.35

发送测试请求的Jmeter机器:

使用三台机器运行JMeter,采用JMeter远程测试的方法(稍后介绍),其中两台机器用作JMeter server,一台用作client。

被测服务器和Jmeter的三台机器都是同一台物理上划分出来的虚拟机,所以网络传输的速度应该很快,不会成为影响测试结果的因素。

测试时,还对AkamaiLogParser的代码进行了修改,让每次请求都直接返回内存中的一个字符串,这样就屏蔽了磁盘文件的读写速度对测试结果的影响。

另外,为jetty和tomcat分配的内存大小都是“-Xms512m –Xmx2048m”。

至此,就确保了在相同的硬件条件下,jetty和tomcat的处理能力是唯一影响测试结果的因素。

四 Jmter远程测试

Jmeter远程测试中,用两种角色:server和client。Server用来向被测服务器发送请求,client用来检测测试结果。下面是本次测试中的物理环境图:

使用Jmeter进行远程测试的步骤为:

1. 启动Jmeter server,启动命令为:JMETER_HOME/bin/jmeter-server。由于需要同时发送数量很大的请求,需要更改为Jmeter分配 的java 堆的大小,修改方法为:在JMETER_HOME/bin/jmeter.sh中添加JVM_ARGS="-Xms512m -Xmx2048m"。

有时会碰到Server failed to start: java.rmi.RemoteException: Cannot start. XXX is a loopback address.的错误,这时需要修改/etc/hosts文件,将127.0.0.1指向localhost.localdomain,将机器的实际IP指向真实的机器名。

2. 将Jmeter server的地址添加到Jmeter client的属性文件中。编辑JMeter控制机的属性文件。在/bin/jmeter.properties文件中找到属 性"remote_hosts",使用JMeter远程服务器的IP地址作为其属性值。可以添加多个服务器的IP地址,以逗号作为分隔。

3. 通过Jmeter client启动远程测试,添加线程组:

其中“Number of Threads(users)”是同时发送的请求数量。Ramp-UP Period是在多长时间内达到并发数。Loop Count就是发送多少轮请求。

4. 新建HTTP REQUEST:

5. 创建测试结果监听器。

6. 通过Run->Remote Start All开启测试。

五 测试结果分析

下面是测试中搜集到的数据

Tomcat测试结果

并发数

maxThreads

acceptCount

CPU

内存

Error%

吞吐量(次/秒)

4000

2000

2000

47.5%

7.5%

0.34%

987

6000

3000

3000

56.2%

7.5%

0.63%

1150

8000

4000

4000

63.2%

7.7%

0.15%

1120

10000

5000

5000

54.4%

7.4%

0.31%

1188

10000

10000

10000

66.2%

7.9%

0.53%

1148

Jetty测试结果

并发数

maxThreads

minThreads

CPU

内存

Error%

吞吐量(次/秒)

4000

5000

100

53.9%

29.5%

0.32%

1009.6

4000

8000

800

48.8%

19.8%

0.25%

1000.1

10000

5000

100

58.5%

29.4%

3.23%

1130

10000

10000

1000

65.1%

20.2%

0.99%

1106

上面两组数据中,红色部分为保证较低错误路的前提下获得的最佳性能。比较上面两组数据可知,tomcat的吞吐量是1188次/秒,Jetty是 1009.6次/秒,两者相差并不太多,但是对于jetty,当并发数上升后,错误率也在上升,同时,Jetty也消耗更多的资源。总结而言,在本次测试 环境下,tomcat性能比jetty略优,tomcat稳定性较好,资源消耗也小于Jetty。建议新版本WebPortal的开发中,选择 Tomcat作为web server。

由于本次测试的硬件环境跟MARS Production的硬件环境并不一致,测试结果对production环境中的性能表现并不一定具有参考价值。
原文:http://www.cnblogs.com/zhangxiaojun/archive/2013/02/07/2908619.html

Jetty和Tomcat的使用及性能测试的更多相关文章

  1. 详解web容器 - Jetty与Tomcat孰强孰弱

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器.它有一个基本数据模型,这个数据模型就是 Handler(处理器 ...

  2. Jetty和tomcat的对比

    上周面试一个来自百度的员工,其中提到一个监控项目,使用jetty容器提供rest api服务,一直懵懂jetty /tomcat这些容器的区别,周末查了下,下面这个说的简单明了~ 转自:http:// ...

  3. Jetty与tomcat的比较

    Google 应用系统引擎最初是以 Apache Tomcat 作为其 webserver/servlet 容器的,但最终将切换到 Jetty 上. 这个决定让许多开发人员都诧异的想问:为什么要做这样 ...

  4. jetty和tomcat启动项目

    首先jetty和tomcat区别,不全面说,只说我理解的.jetty架构比tomcat更为简单.jetty是基于Handler来实现的,易于拓展,因此更适合于同时处理且长时间保持连接:tomcat的架 ...

  5. Jetty与Tomcat的区别 转

    Jetty与Tomcat的区别 由于没有研究过Tomcat,所以区别不好说,这里暂时就网上的一些言论和自己所了解到的一些总结下(摘自于许令波). Jetty 的架构从前面的分析可知,它的所有组件都是基 ...

  6. Jetty和tomcat的比较

    转自: http://blog.csdn.net/classicbear/article/details/6968930 相同点: 1.      Tomcat和Jetty都是一种Servlet引擎, ...

  7. Jetty和Tomcat的选择:按场景而定

    Jetty和Tomcat的选择:按场景而定 Jetty和Tomcat为目前全球范围内最著名的两款开源的webserver/servlet容器.由于它们的实现都遵循Java Servlet规范,一个Ja ...

  8. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三)

    转载 http://blog.csdn.net/cutesource/article/details/6192163 最后我们再看看NIO方面最著名的框架Mina,抛开Mina有关session和处理 ...

  9. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(一)

    本文转载自 http://blog.csdn.net/cutesource/article/details/6192016 如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下 ...

随机推荐

  1. JSBinding / Run Samples

    This document shows you how to run JSBinding 2048 sample in Editor. First of course, create an empty ...

  2. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  3. C# 中的EventHandler

    //这里定义了一个水箱类 public class 水箱 {     //这是水箱的放水操作     public void 放水() { }     //这是水箱的属性     public dou ...

  4. linux安全

    http://drops.wooyun.org/ 最专业的安全知识分享平台 http://www.freebuf.com/ 关注黑客与极客 http://book.beifabook.com/prod ...

  5. linux包之dmidecode

    http://www.dmtf.org/standards/smbios Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息.Dmidecode 遵循 SMBIOS/DMI ...

  6. TKinter之窗口美化 窗口大小、图标等

    设置窗口大小.设置窗口标题.设置窗口图标 效果图: 代码示例: #!/usr/bin/env python # _*_ coding:utf-8 _*_ from Tkinter import * r ...

  7. hibernate的工作原理

    hibernate的工作原理1.Hibernate 的初始化.读取Hibernate 的配置信息-〉创建Session Factory1)创建Configeration类的实例.它的构造方法:将配置信 ...

  8. 查看SqlServer的内存使用情况

    上一篇提到动态T-SQL会产生较多的执行计划,这些执行计划会占用多少内存呢?今天从徐海蔚的书中找到了答案.动态视图不仅可以查到执行计划的缓存,数据表的页面缓存也可以查到,将SQL整理一下,做个标记. ...

  9. HDP2.4安装(二):Centos7配置

    Centos7 Minimal Install 安装完成后是不支持上网的,并且大部分常用的软件也未安装,首先要解决的问题就是网络配置.当网络配通后,即可通过Xshell或其它工具来远程进行操作与管理, ...

  10. linux Shell的使用

    linux Shell的使用 下面是我对shell脚本使用的学习,写成日志,做个笔记,可以当做自己以后的复习. 1.输出hello world! vi test1.sh, 如果不会vi工具的使用,请参 ...