`
FeiXing2008
  • 浏览: 53159 次
  • 性别: 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较好

相关推荐

Global site tag (gtag.js) - Google Analytics