`
FeiXing2008
  • 浏览: 53802 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于jetty与tomcat一些性能的研究

阅读更多
现在我有一个servlet的url为/servlet/TestRuning
其中关键代码是
PrintWriter out = response.getWriter();
		String aStr = request.getParameter("a");
		String bStr = request.getParameter("b");
		
		int a = 100;
		int b = 100;
		
		try{
			a = Integer.parseInt(aStr);
			b = Integer.parseInt(bStr);
		}catch(Exception excep){
			System.err.println("err:" + excep.getMessage());
		}
		int sum = 0;
		long s = System.currentTimeMillis();
		for(int i = 0; i < a; ++i){
			for(int ii = 0; ii < b; ++ii){
				sum = a / b;
			}
		}
		long e = System.currentTimeMillis();
		long d = e - s;
		out.println( d );
		
		
		out.flush();
		out.close();

这个代码只是两个循环,其中只是作一些除法运算操作。
然后计算时间,并输出给客户端。
此时我将这个应用布署在jetty与tomcat两个服务器中
这两个服务程序都是使用了默认的配置。

在启动程序时,我先使用两个相同的jre。
wapproxy@ubuntu:~$ ps -ef | grep java
wapproxy  2076     1  1 11:28 ?        00:00:03 /usr/lib/jvm/java-6-openjdk/jre/bin/java -Djetty.home=/home/wapproxy/jetty -Djava.io.tmpdir=/tmp -jar /home/wapproxy/jetty/start.jar /home/wapproxy/jetty/etc/jetty-logging.xml /home/wapproxy/jetty/etc/jetty.xml
wapproxy  2185  1398  8 11:30 pts/0    00:00:02 /usr/lib/jvm/java-6-openjdk/jre/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/home/wapproxy/Tomcat/conf/logging.properties -Djava.endorsed.dirs=/home/wapproxy/Tomcat/endorsed -classpath :/home/wapproxy/Tomcat/bin/bootstrap.jar -Dcatalina.base=/home/wapproxy/Tomcat -Dcatalina.home=/home/wapproxy/Tomcat -Djava.io.tmpdir=/home/wapproxy/Tomcat/temp org.apache.catalina.startup.Bootstrap start
wapproxy  2329  2309  0 11:31 pts/1    00:00:00 grep --color=auto java

确认一次,在这两个应用中我是布署了相同的应用程序,应用名为jt_jt。
其中tomcat的端口为8888
jetty的端口为8080

我使用ab进行压力测试
Server Software:        Jetty(6.1.22)
Server Hostname:        172.31.36.158
Server Port:            8080

Document Path:          /jt_jt/servlet/TestRuning?a=100000&b=100000
Document Length:        2 bytes

Concurrency Level:      1
Time taken for tests:   8.715 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      445000 bytes
HTML transferred:       10000 bytes
Requests per second:    573.72 [#/sec] (mean)
Time per request:       1.743 [ms] (mean)
Time per request:       1.743 [ms] (mean, across all concurrent requests)
Transfer rate:          49.86 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.1      0       5
Processing:     0    1   7.1      0      50
Waiting:        0    1   7.1      0      50
Total:          0    2   7.2      0      50

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      5
  95%      5
  98%     45
  99%     50
 100%     50 (longest request)

以上是jetty的,下边是tomcat的
Server Software:        Apache-Coyote/1.1
Server Hostname:        172.31.36.158
Server Port:            8888

Document Path:          /jt_jt/servlet/TestRuning?a=100000&b=100000
Document Length:        3 bytes

Concurrency Level:      1
Time taken for tests:   4.070 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      650000 bytes
HTML transferred:       15000 bytes
Requests per second:    1228.50 [#/sec] (mean)
Time per request:       0.814 [ms] (mean)
Time per request:       0.814 [ms] (mean, across all concurrent requests)
Transfer rate:          155.96 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.2      0       5
Processing:     0    0   1.7      0      45
Waiting:        0    0   1.7      0      45
Total:          0    1   2.1      0      45

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      5
  95%      5
  98%      5
  99%      5
 100%     45 (longest request)

两次测试的并发量我设成了1,也就是线程池的模式对测试结果影响不大。
关键数据如下
jetty 8080 Requests per second:    573.72 [#/sec] (mean)
tomcat 8888  Requests per second:    1228.50 [#/sec] (mean)
基本相差一倍之多。
为什么会有这个问题呢?

也许你想看看输入内容是多少
用浏览器输入单次请求http://172.31.36.158:8888/jt_jt/servlet/TestRuning?a=10000000&b=100000000
返回结果为零。

这样是不是可以证明jetty比tomcat是慢一倍呢?
如果可以证明,为什么jetty是慢过tomcat那么多呢?
分享到:
评论
22 楼 mathgl 2010-12-15  
linkerlin 写道
楼主是不是在windows下测试的 ?
Java6的NIO在 windows下工作的很差。


java 6的 NIO在windows下性能倒不差,只是cpu占用率有些高而已。。和它实现有关。

它没有使用iocp..iocp的支持要到java7才有
21 楼 sdh5724 2010-12-15  
1. 你做了连接保持了么?
2. 内存配置到一个合适大小了么? JVM参数配置?
3. 日志系统都不是全都调整到ERROR级别了?
4. AB 走的是HTTP1.0协议, 这样做对JETTY可能有些不公平?
5.  long e = System.currentTimeMillis();    压力测试下, 这个东西最好去掉。
6. 各自软件的版本?

高并发/高压力下的测试, 默认设置未必有可比较性。 你这样做是很不公正的。
20 楼 gh_aiyz 2010-12-14  
linkerlin 写道
楼主是不是在windows下测试的 ?
Java6的NIO在 windows下工作的很差。

david.org 写道
程序我没有细看, 但使用Jetty是有很大风险的.

本来Java的NIO也是不成熟的, 然而Jetty 的默认IO模式正是NIO. 使用时, 需注意Jetty的版本.

另外一点, 我认为Jetty仍然在并发编程中做的不够完美, 按照我目前的测试结果, 在超过50的并发上, Jetty并没有充分的另用CPU资源. 这会导致获得CPU时间片的线程挂起, 最终导致的后果是, 上到一定的并发, 你的load avg 会很大.

最后, 如果大家项目中使用Jetty, 我推荐使用Jetty1.6.22以上的版本.

有别的资料, 请楼下跟贴. (dongtalk@gmail.com

“NIO不成熟”真实一个荒谬的结论。
19 楼 linkerlin 2010-08-29  
楼主是不是在windows下测试的 ?
Java6的NIO在 windows下工作的很差。
18 楼 david.org 2010-04-27  
程序我没有细看, 但使用Jetty是有很大风险的.

本来Java的NIO也是不成熟的, 然而Jetty 的默认IO模式正是NIO. 使用时, 需注意Jetty的版本.

另外一点, 我认为Jetty仍然在并发编程中做的不够完美, 按照我目前的测试结果, 在超过50的并发上, Jetty并没有充分的另用CPU资源. 这会导致获得CPU时间片的线程挂起, 最终导致的后果是, 上到一定的并发, 你的load avg 会很大.

最后, 如果大家项目中使用Jetty, 我推荐使用Jetty1.6.22以上的版本.

有别的资料, 请楼下跟贴. (dongtalk@gmail.com
17 楼 FeiXing2008 2010-04-13  
我这里是用ab压出来的。
你们一般用什么的?

我这里只作为对比,与支持人数没有关系。
16 楼 FeiXing2008 2010-04-11  
我这里没有你所说的支撑多少用户喔。

不过你这里没有说与tomcat进行对比。

你的数据都是用ab进行压出来的吗?
15 楼 fireflyc 2010-04-07  
代码一样,测试条件
http://localhost:8080/test/servlet/test?a=100&b=100
机器配置
2.G物理内存
Intel Core Dou T6400 2.0GHz
jvm sun 1.6
tomcat没做什么处理,难得修改
ab -cn -n1000 (n为表格中各个参数)




经过测试,最高并发量可以达到c80 n1000的效果如果再多用户会感觉到缓慢,吞吐率开始走下坡路。当然最高点可能不是80,可能是90,或者85之类的,懒得细化了。







jetty最好的情况下是c40 n1000,再多的用户性能急剧下降。

机器是我的一台笔记本,所以测试出来的结果看起来很不稳定。这里只是想说明一下测试的方法应该是这样的,而不是单纯的说我可以支撑多少多少并发用户,(对于这样的人我很无语,他们根本不知道什么叫支撑多少多少并发用户)。说道支撑用户数要有条件,(机器配置,测试环境),要有图表(明确的表示出吞吐率,用户平均响应时间,服务器平均处理时间),只有这样才能谈论并发数。

这里可单jetty的效果不是很好,解决办法也很简单,跟踪一下看是哪里出的问题,比如jsp编译的问题?IO的问题?system call用了哪些?诸如此类。而不是一拍脑袋的认为数据库有问题(见到过N多人一碰到性能问题就说是数据库。。。都无语了。)
14 楼 moyan_java 2010-04-07  
我们用jetty主要是在开发阶段调试和演示方便。没有必要再性能上较真儿。生产环境自然要着重考虑性能问题了。
13 楼 FeiXing2008 2010-04-07  
treblesoftware 写道
得出的数据太单一了。没有很大的参考价值。


对吖,还有哪些数据是必要的呢,这个是我非常关心的一个问题。
12 楼 evaspring 2010-04-07  
淹不死の鱼 写道
且不说性能,最近才开始接触到jetty,把一个在tomcat运行良好的项目部署到jetty中,直接启动报错,虽还未查明原因,但是主观上就已经对jetty有抵触了。。。

jetty 的报错信息提示更准确也更详细,我把TOMCAT上面的项目放在jetty会报错,但是可以检查出一些隐患 ~
11 楼 hzh0725 2010-04-07  
如果看过tomcat,jetty的代码,你会发现两个东西都是很简单的,都可以很简单的集成,作为一个embed的应用,不过tomcat写的复杂一点
google选择jetty,因为它的小和性能好
10 楼 JE帐号 2010-04-07  
google 选择jetty主要还是看上它的订制性以及集成能力.换句话说,在你的应用中集成一个微型web服务器来完成部分功能,性能更重要还是便捷更重要.
9 楼 treblesoftware 2010-04-07  
得出的数据太单一了。没有很大的参考价值。
8 楼 yudylaw 2010-04-07  
Google App 现在对J2EE的支持还是初级阶段,所以还没必要上TOMCAT。
7 楼 淹不死の鱼 2010-04-07  
且不说性能,最近才开始接触到jetty,把一个在tomcat运行良好的项目部署到jetty中,直接启动报错,虽还未查明原因,但是主观上就已经对jetty有抵触了。。。
6 楼 liuruncheng 2010-04-07  
Tomcat默认是用老的IO库,要在Server.xml打开NIO再测,Jetty默认就NIO了
5 楼 FeiXing2008 2010-04-06  
hzh0725 写道
如果jetty比tomcat性能好那么多,google应该用使用tomcat作为它的appenginee的servlet container,去跟google说说

其实我并敢大胆说tomcat性能比jetty,可是现在事实如此,也许是需要配置什么地方,才可以发挥jetty性能。
所以需要请教一下大家。哈哈
4 楼 hzh0725 2010-04-06  
如果jetty比tomcat性能好那么多,google应该用使用tomcat作为它的appenginee的servlet container,去跟google说说
3 楼 FeiXing2008 2010-04-06  
结论初步为使用Tomcat性能比jetty较好

相关推荐

    how tomcat works和jetty-src和tomcat7-src

    【标题】"how tomcat works和jetty-src和tomcat7-src" 提及了三个关键概念:Tomcat的工作原理、Jetty源代码以及Tomcat 7的源代码。这些是Java Web服务器领域的核心元素,主要涉及到如何处理HTTP请求、部署Web应用...

    tomcat 学习与分析总结资料

    6. **Tomcat性能优化** 优化Tomcat涉及多个方面,如调整JVM参数、减少上下文切换、优化连接池设置、压缩响应内容、启用Keep-Alive等。深入理解这些优化策略并根据实际情况进行调整,能够显著提升服务器性能。 7. *...

    jetty入门

    与其他重量级的Web服务器(如Apache Tomcat)相比,Jetty没有繁重的依赖,这使得它启动快速,占用资源少。Jetty还支持嵌入式模式,可以直接将服务器与应用程序打包在一起,提供更简洁的部署方案。 其次,Jetty对...

    JAVA里使用Jetty作为轻量级嵌入式的Web容器

    - 与Tomcat等其他服务器相比,Jetty具有更小的内存占用、更快的启动速度和更低的资源消耗。 - 它支持最新的HTTP协议(包括HTTP/2)和Servlet规范,提供了一种灵活的API来处理HTTP请求和响应。 2. **Jetty的特性**...

    jetty-6.1.22

    Jetty是一款轻量级、高性能且易于使用的Web服务器和Servlet容器,因其小巧的体积和出色的稳定性而备受开发者喜爱...而对于有经验的开发者,深入研究Jetty的源码和模块化设计,可以帮助优化性能,实现更高效的应用服务。

    &lt;&lt;How tomcat works&gt;&gt; 英文版 中文版 源码

    8. **性能优化**:提到了一些提升Tomcat性能的方法,比如调整线程池大小、缓存策略和内存设置等。 9. **源码分析**:通过阅读源码,我们可以了解Tomcat内部的类加载、线程模型、请求处理等关键部分的设计和实现。 ...

    tomcat源码,servlet-api源码

    《深入理解Tomcat源码与Servlet-API》 ...综上所述,深入研究Tomcat源码和Servlet-API不仅能提升我们的开发技能,还能帮助我们更好地理解和优化Java Web应用的性能,从而在实际工作中发挥更大的价值。

    apache-tomcat-7.0.16

    6. **扩展与集成**:Tomcat可以与其他Java应用服务器如Jetty、GlassFish等一起工作,也可以与Spring Boot、Struts、Hibernate等框架集成,构建复杂的企业级应用。 总的来说,Apache Tomcat 7.0.16是一个强大且灵活...

    jetty-6.1.3-src.zip

    Jetty是一个开源的Java Web服务器和HTTP协议栈,它的设计目标是轻量、高效和易于嵌入。...如果你正在进行Java Web开发,或者对服务器性能有较高要求,那么研究Jetty绝对是一个值得投入的时间和精力的课题。

    信创-达梦数据库性能测试代码

    深入研究这个压缩包的内容,我们可以获得更详细的性能数据,为优化Web应用与数据库的集成提供依据。 总结,通过对达梦数据库与不同Web中间件的性能测试,我们可以了解它们在信创环境下的实际效能,为系统设计和选型...

    Spring 5 MVC演示应用程序,具有嵌入式Tomcat和Jaeger Tracing(不带Spring Boot).zip

    Spring 5支持多种嵌入式Servlet容器,如Tomcat、Jetty等。 **Jaeger Tracing** Jaeger是Uber开源的分布式追踪系统,用于监控和分析微服务架构中的请求流。在大型复杂系统中,它可以帮助开发者理解请求如何在不同...

    基于J2EE平台的B/S系统性能优化设计研究.pdf

    6. **Web容器优化**:Tomcat、Jetty等Web容器的配置也是性能优化的一部分。调整连接器参数,如最大连接数、超时时间等,可以提高并发处理能力。 7. **异步处理与多线程**:对于耗时的操作,可以采用异步处理,通过...

    J2EE学习中一些值得研究的开源项目

    本文将对一些值得关注的开源项目进行详细介绍,并分析它们的特点与应用场景。 #### 一、Web容器 ##### 1. Jakarta Tomcat - **简介**:由Apache基金会提供的一款免费开源的Web服务器软件,支持最新的Servlet、JSP...

    开发技术-Java基于CORBAJava对象负载均衡的研究.zip

    在Java中,可以使用多种方式实现负载均衡,例如使用软件负载均衡器如Nginx或HAProxy,或者使用专门的Java框架如Jetty或Tomcat的集群功能。此外,还可以通过编程的方式实现,例如在CORBA环境中,ORB可以配置为根据...

    http服务器的实现.rar

    而Jetty和Tomcat则功能强大,支持多线程、WebSocket等高级特性,适用于大型Web应用。 毕业设计和论文撰写时,你可以选择其中一种语言,深入研究其实现HTTP服务器的过程。这包括但不限于以下步骤: - 分析HTTP协议的...

    Java WEB服务器

    通过研究这些代码,你可以深入了解Web服务器的内部工作流程,包括如何解析HTTP请求、如何处理请求并生成响应,以及如何优化性能等。此外,这也是一种实践Java多线程、网络编程和并发处理的好机会。 总的来说,构建...

    基于java数据库连接池的研究毕业论文.doc

    其次,当前主流的Web服务器,如Tomcat、Jetty等,都内置了多种数据库连接池实现,如Apache的DBCP、C3P0以及HikariCP等。这些连接池组件提供了丰富的配置选项,可以根据具体的应用场景调整连接的最大最小数量、超时...

    elastic-job-lite-console-2.1.6-SNAPSHOT.tar

    《Elastic-Job Lite Console 2.1.6-SNAPSHOT 源码解析与应用探索》 Elastic-Job Lite Console 是一个基于Elastic-Job框架开发的定时任务控制台,由当当网推出,旨在为企业级分布式系统提供简单易用、功能强大的定时...

Global site tag (gtag.js) - Google Analytics