Tomcat、Netty、Jetty 简单压测报告
Netty 和 Tomcat 区别
Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,Tomcat实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。
有人说netty的性能就一定比tomcat性能高,其实不然,tomcat从6.x开始就支持了nio模式,并且后续还有arp模式:一种通过jni调用apache网络库的模式,相比于旧的bio模式,并发性能得到了很大提高,特别是arp模式,而netty是否比tomcat性能更高,则要取决于netty程序作者的技术实力了。
为什么Netty受欢迎?
netty是一款收到大公司青睐的框架,原因有三:
并发高
传输快
封装好
Netty为什么并发高
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。
NIO 2.0里终于有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最后一种IOasynchronous I/O
1)就IO而言:概念上有5中模型:blocking I/O,nonblocking I/O,I/O multiplexing (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX aio_functions)。
2)然后呢 不同的操作系统对上述模型支持不同: unix支持io多路复用,不同系统叫法不同 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的时候就诞生了IOCP支持最后一种异步I/O
3)Java是一种跨平台语言,为了支持异步IO,诞生了nio,Java1.4引入的NIO 1.0是基于I/O复用的。在各个平台上会选择不同的复用方式。Linux用的epoll,BSD上用kqueue,Windows上应该是重叠I/O(肯定不是IOCP)
但是nio直接使用比较难用,所以有了mina,netty这些针对网络io部分(tcp/udp-传输层)的封装(nio也有非网络io部分),为了使nio更易用。
http是应用层的协议
servlet3.0则是另外一种东西,不是对协议的封装,javaee6众多规范中的一个,但凡javaee6的实现(或者像tomcat这种web容器部分的实现),都会支持servlet3.0,servlet理论上可以支持多种应用层协议(不单单只是http),而servlet3.0以后提供的异步特性与javase提供的nio或aio无直接关系,就是使用bio一样可以实现servlet3.0中提供的异步特性。
异步只是一种概念,异步与否要看,上层使用的异步,而支持的下层完全可能是阻塞的。
tomcat就是针对http层的,所以我建议http还是选择tomcat(或者其他成熟的http-server),并不是说netty不好,而是你的选择问题。
netty是一个网络组件,tcp,udp,http都可以弄,但是官方文档都是些hello wolrd级别的。如果你非常了解http结构,完全可以基于netty搞出一个比tomcat牛的http server。如果做tcp开发,netty不二之选!
现在高并发分布式网站架构一般采用 nginx(前端负载均衡)+ Netty/Tomcat(HTTP)
Netty是基于Java NIO开发的,而Tomcat是Apache下的针对HTTP的服务器项目,前者更像一个中间件框架,后者更像一个工具
Tomcat、Netty、Jetty 简单压测报告
淘宝的旺旺是Jetty,Jetty是一个Servlet容器,
Netty也是一个NIO的后端框架,不依赖于web容器。
对 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(非阻塞IO),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.
参考:
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2021-02-17 05:51:08
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!