转自:http://www.gootry.com/wangzhuan/article/100928211150/252
Tomcat提供了三种不同的服务器设计实现方法,以服务于HTTP,并实现与服务于AJP三种设计方法相同的设计方法。
JIO(java.io)
除非在Tomcat启动时找到了APR Connector的libtcnative库,否则这是Tomcat的默认连接器实现方法,这也称为“Coyote”。
它是一个使用java.io核心Java网络类的纯Java TCP包服务器实现。它也完全是HTTP和AJP的模块化实现。
于是用纯Java编写的,所以对完全支持Java的所有操作系统来说,JIO是二进制可随处移植的(portable)。
许多人认为这种实现方法比主流的Apache httpd要慢,因为它是用Java编写的。假定Java总是比编译的C要慢。真的吗?请拭目以待!
APR(Apache Portable Runtime)
第二种连接服务器的方法是以Java类的方式实现,这些Java类包含了一个以C编程语言编写的、置于小的libtcnative库文件中的JNI压缩包,这些Java类轮流取决于Apache Portable Runtime(APR)库文件。
连接Apache httpd Web服务器的类库也是在C中实现的,而且用APR进行网络通信。
这种可选的实现方法的目标包括:使用胜过JIO连接器的相同开源C代码,作为Apache httpd的服务器实现方法,并提供至少与Apache httpd同等的性能。
因为这种方法主要是在C中实现的,所以缺陷在于单个二进制版本的这种连接器不能像JIO连接器一样运行在所有平台上。
这意味着Tomcat管理员需要编译连接器,因此必须具备一定的开发环境,而且可能有编译问题。
但是,这种连接器的作者通过要求得到比这种连接器实现要快的Tomcat的Web性能,验证了这种特殊设置的效果。
笔者将通过基准调校,让您亲眼看到其实际效果。
NIO(java.nio)
这是用纯Java编写的连接器(Conector)的一种可选方法。该实现用java.nio核心Java网络类以提供非阻塞的TCP包特性。
这种Connector设计的主要目标是用非阻塞(nonblocking)的方式部分实现Connectot,以达到使用很少的线程给Tomcat管理员提供比JIO Connector执行效果更好的Connectot实现。
另一方面,NIO Connector只需要一个线程就能分析众多连接器的请求,但每个请求随后必须运行自身线程(Java Servlet规范要求限制的)才能寻到servlet。
因为部分请求处理是以非阻塞的Java代码完成的,因此,部分请求处理所占用的时间是Java线程不需处于在用状态的时间,这意味着小线程池可用于处理相同数量的并发请求。
小线程池通常意味着低CPU占用,轮流使用该线程池意味着获得更好的性能。这样处理使速度更快的理论原因建立在假设高堆栈可以或不可以用于任何入的自身Web应用程序和交换负荷之上。
因此,对一些请求处理,NIO Connector会执行更好,而对另一些请求处理,则执行效果更差,这要视其他Connector设计的情况而定。
依靠这些Tomcat Connector,笔者在prefork及worker多线程(Multi-Process Model,缩写为MPM)编译配置下进行Apache httpd基准调校,井要求通过Apache httpd连接器模块,把基准调校的请求所在的httpd prefork和worker配置从Apache httpd发送到Tomcat。
转载于:https://blog.51cto.com/shugao/1256904