每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着跟线程切换。而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。在Apache Tomcat6 中支持了Java语言的特性 NIO( New I/O),使用NIO在服务器端会有更好的性能,加强服务器端对并发处理的性能。
注意:在tomcat6在默认的配置选项中是没有把NIO功能打开。从Apache Tomcat 站点下载 的Tomct6 压缩包中 conf/server.xml的 配置文件第69行,内容如下:
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
进行测试,可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下:
- 2013-1-10 12:59:40 org.apache.coyote.http11.Http11Protocol init
- 信息: Initializing Coyote HTTP/1.1 on http-8080
- 2013-1-10 12:59:40 org.apache.catalina.startup.Catalina load
修改成支持NIO的类型,配置如下:
- <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
- connectionTimeout="20000"
- redirectPort="8443" />
进行测试,被打开nio配置,启动时的信息,如下:
- 2013-1-10 13:01:01 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
- 信息: Using a shared selector for servlet write/read
- 2013-1-10 13:01:01 org.apache.coyote.http11.Http11NioProtocol init
- 信息: Initializing Coyote HTTP/1.1 on http-8080