今早对Tomcat7.0.5、Netty3.2.3、Jetty-hightide-7.2.2做了一个简单的压测,
测试方案我想肯定是不太严谨的,但是对于快速评估还是有点价值的,测试结果出乎意外。
压测工具: ApacheBench(简称ab), Version 2.3
测试服务器有两台:
被压测服务器 和 运行ab的服务器
两台服务器的配置都是:
64位Linux,双CPU,,4G内存
Tomcat7.0.5 使用BIO(阻塞IO),最大线程开了200个,
Netty3.2.3和Jetty-hightide-7.2.2都使用NIO,Jetty最大线程开了250个。
请求总数固定是10万,对每个请求的响应字节数固定是1k,
以下是测试结果:
第一列是最大并发数,其他三列是每妙处理的请求数,
并发500、1000时测了4次,并发2000、3000测了两次,并发10000时测了3次。
BIONIONIO 并发 Tomcat Netty Jetty 500 87238311447111270 10737 566711064 10986 557011625 10469 46881000 79948321502110045 9885500610162 10156 4736984210166 47622000 8040780346688487814845623000 65406784452871457166415810000 430350993500455859733006445750373471
可以看出Tomcat和Netty只有达到10000并发时才开始有明显差距,
而Jetty在并发为2000以下时都比Tomcat和Netty要差一倍,即使达到10000并发,Jetty的NIO也比Tomcat的BIO差。
从这个结果来看,我真的很怀疑在64位OS和高速局域网中是否有必要使用NIO?
补充:
Tomcat7.0.5的NIO基本上不可用,每次压都是:
严重: java.lang.OutOfMemoryError: Java heap spaceat org.apache.coyote.http11.InternalNioInputBuffer.<init>(InternalNioInputBuffer.java:58)at org.apache.coyote.http11.Http11NioProcessor.<init>(Http11NioProcessor.java:77)at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.createProcessor(Http11NioProtocol.java:435)at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:363)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1526)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:619)Exception in thread "http-8080-exec-321" java.lang.OutOfMemoryError: Java heap spaceSEVERE:Memory usage is low, parachute is non existent, your system may start failing.
享受每一刻的感觉,欣赏每一处的风景,这就是人生。