今早对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次。
BIO NIO NIO
并发 Tomcat Netty Jetty
500 8723 8311 4471
11270 10737 5667
11064 10986 5570
11625 10469 4688
1000 7994 8321 5021
10045 9885 5006
10162 10156 4736
9842 10166 4762
2000 8040 7803 4668
8487 8148 4562
3000 6540 6784 4528
7145 7166 4158
10000 4303 5099 3500
4558 5973 3006
4457 5037 3471
可以看出Tomcat和Netty只有达到10000并发时才开始有明显差距,
而Jetty在并发为2000以下时都比Tomcat和Netty要差一倍,即使达到10000并发,Jetty的NIO也比Tomcat的BIO差。
从这个结果来看,我真的很怀疑在64位OS和高速局域网中是否有必要使用NIO?
补充:
Tomcat7.0.5的NIO基本上不可用,每次压都是:
严重:
java.lang.OutOfMemoryError: Java heap space
at 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(Http11NioProtoc
ol.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 space
SEVERE:Memory usage is low, parachute is non existent, your system may start failing.