Tomcat IO选择历史
- Tomcat7时默认用的BIO,同步阻塞。可以通过配置修改为NIO
1 | <Connector port="8080" protocol="org.apache.coyote.http11.Http11Ni oProtocol" |
- Tomcat8.5以后默认用的是NIO.
阻塞与非阻塞
Socket通信过程分两个部分:
- 连接准备
- 拷贝内核缓存到用户缓存。
阻塞和非阻塞的概念是在连接准备阶段的描述。
Tomcat的BIO实现
- JioEndpoint的Acceptor线程负责循环阻塞接收sock连接。
- 每接收到一个socket连接就包装成SocketProcessor扔进线程池Executor.SocketProcessor是一个Runnable
- SocketProcess负责从scoket阻塞读取数据,并且向socket中阻塞写入数据。
Acceptor现成数量默认为1,可以通过acceptorThreadCount参数进行配置。
1 | <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" |
Tomcat中每个Connector都会创建一个线程池,并且默认值:
- 最小线程数量10
- 最大线程数量20
使用BIO处理请求时:
- 当请求数量比较大时,可以提高Acceptor线程数量,提高接收请求的速率。
- 当请求比较耗时时,可以提高线程池Executor的最大线程数量。
原理图:
Tomcat的NIO实现
NIO非阻塞接收socket连接,非阻塞从socket读取数据,非阻塞将数据写入socket中。
在Tomcat中,只有从socket读取请求行,请求头数据时是非阻塞的。在读取请求体是阻塞的,响应数据也是阻塞的。