Tomcat连接器与线程池原理及参数释义(1)

最近在组里进行了技术分享,故将网上及官网查找的,统一整理出来。

 

一、连接器Connector

1. 概念

Connector的主要功能是接收连接请求,并把用户请求包装成标准的HTTP请求(包含协议名称、请求头Head、请求方法是Get还是Post等),创建request和response对象用于和请求端交换数据;然后分配线程给Engine(Servlet容器)来处理请求,并把request和response对象传递给Engine引擎,当Engline处理完请求后,也会通过Connector将响应返回给客户端。

(1)一个Tomcat可以配置多个Connector,分别用于监听不同端口,或处理不同协议(HTTP 1.1或AJP/1.3(AJP:Apache JServerProtocol,Apache与其他服务器之间的通信协议))

(2)对于HTTP请求,会使用不同的协议,最典型的有BIO、NIO、NIO2、APR

BIO org.apche.coyote.http11.Http11Protocol - blocking Java connector Tomcat7以及Tomcat7以前版本默认的运行模式(到了Tomcat8.5和9.0则去掉了BIO)
NIO org.apche.coyote.http11.Http11NioProtocol  - non blocking Java connector Tomcat8在Linux系统中默认使用该方法
NIO2 org.apche.coyote.http11.Http11Nio2Protocol - non blocking Java connector Tomcat8增加了NIO2
APR org.apche.coyote.http11.Http11AprProtocol - the APR/native connector

(1)Apache PortableRuntime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能,从操作系统层面解决IO阻塞问题。

(2)Tomcat7/8在Win7或以上的系统中默认使用该方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

2. 配置

在server.xml里

3. 主要参数详解

参数的含义,主要参照官网:http://tomcat.apache.org/tomcat-9.0-doc/config/http.html

下面列出重要且不好理解的参数:

参数名 描述
protocol 设置协议来处理传入流量。默认值是HTTP/1.1,将使用自动切换机制来选择具体的连接器(BIO、NIO、NIO2、APR等)。所以这里应该明确指定一个协议,而不是依靠这种自动切换机制。
redirectPort 用http请求某个资源时,而该资源本身又被设置了必须要https方式访问,此时Tomcat会自动重定向到这个redirectPort设置的https端口
maxConnections 在任何给定的时间服务器接收和处理的最大连接数,表示有多少个socket连接到Tomcat上,是TCP连接层相关的参数。如果设置为-1,则连接数不受限制。默认值与连接器使用的协议有关:NIO默认值10000,APR/native默认值8192,BIO默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。
acceptCount 当前连接数超过maxConnections时,还可接受的连接数,即TCP的完全连接队列(accept队列)的大小,默认值100。当队列满时收到的任何请求将被拒绝。acceptCount的设置,与应用在连接过高情况下希望做出什么反应有关系。如果设置过大,后面进入的请求等待时间会很长;如果设置过小,后面进入的请求立马返回connection refused。
maxThreads 最多同时处理的工作线程数,默认值200。如果使用了executor将忽略该属性,连接器将使用executor,而不是一个内部线程池来处理请求。

举例:maxThreads=1000,maxConnections=800,acceptCount=100,假设某一瞬间的并发是1000,那么最终Tomcat的线程数将会是800,即同时处理800个连接上的请求,另外100进入队列排队,剩余100个请求会被拒绝。

Tomcat可接受的最大连接数为maxConnections + acceptCount) 

 

4. 接受请求的过程

(1)对于 client端的一个请求过来,TCP的三次握手建立连接,连接建立成功后进入accept队列(acceptCount就是这个accept队列的大小)。

(2)Tomcat的acceptor线程则负责从accept队列中取出该connection,接受该connection,然后交给工作线程(即maxThreads大小)去处理(读取请求参数、处理逻辑、返回响应等)。

(3)如果该连接不是keep alived的话,则关闭该连接,然后该工作线程释放回线程池;如果是keep alived的话,则等待下一个数据包的到来直到keepAliveTimeout,然后关闭该连接。

(4)然后acceptor线程接着从accept队列中取connection,重复上面的操作。当当前socket连接超过maxConnections时,acceptor线程自己会阻塞等待,等Tomcat接收的连接数小于maxConnections后,才去处理accept队列的下一个连接。

Tomcat连接器与线程池原理及参数释义(1)_第1张图片

 

你可能感兴趣的:(学习杂烩)