从理解tomcat处理Http请求到tomcat优化

为君一笑 提交于 2020-01-22 23:59:00

目录

 

对tomcat处理http请求的过程的初步理解:

tomcat优化:

三个参数:acceptCount、maxConnections、maxThreads

使用NIO:

基于三个参数配置对tomcat优化:


对tomcat处理http请求的过程的初步理解:

tomcat的Connector在某个指定的端口上侦听客户请求,接收浏览器发过来的tcp连接请求,创建一个Request和一个Response对象分别 用于和其你去端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给Engine,从Engine中获得响应 并返回给客户端。而Engine下封装的就是我们的web应用的处理过程。在默认NIO的情况下,这样一个过程是由单独的线程去实现的,也就是这个过程是并发的。

既然是并发,也就有了开发中要对tomcat做并发性能优化,目的是提高吞吐量。

tomcat优化:

三个参数:acceptCount、maxConnections、maxThreads

tpmcat处理请求时,会在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);在连接中获取请求的数据,生成request;然后会有单独线程去调用servlet容器处理请求;返回response。

acceptCount:队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。

maxConnections:处理请求的最大连接数。当Tomcat接收的连接数达到maxConnections时,不会再读取accept队列中的连接。NIO下这个参数的默认值是10000,APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。

maxThreads:请求处理线程的最大数量。默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。

结合处理请求的过程来分析acceptCountmaxConnections参数。基于tomcat中这两个参数的设置,运行在tomcat中的服务中可以同时接收的连接数为maxConnections+acceptCount。高并发情况下,acceptCount如果过大,在maxConnections达到上限后不会继续接受队列的连接,这样会使得请求响应时间较长,反之,如果过小,请求会被拒绝。

至于maxThreads就比较好理解。通常情况下maxThreads的配置会直接影响到我们的服务接受到的请求。在应用并发性能达到上限之前,maxThreads配置越大,应用程序收到的并发请求就越多。

使用NIO:

参数protocol="org.apache.coyote.http11.Http11NioProtocol"指的是NIO

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
 

基于三个参数配置对tomcat优化:

win版tomcat中默认的配置如下,protocol="HTTP/1.1"指的是BIO。linux中tomcat8默认使用是NIO。

 <Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443"/>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

  使用线程池的方式对maxThreads参数和acceptCount参数进行配置

上面提到如果自定义了线程池,那么上面那种Connector中配置的maxThreads参数就可以不写,会被忽略。在BIO下maxConnections的值也是maxThreads的值

<Executor name="tomcatThreadPool"   
          namePrefix="tomcatThreadPool-"   
          maxThreads="1000"   
          maxIdleTime="60000"  
          minSpareThreads="50"/>  
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

   Connector 组件中配置acceptCount参数,并使用executor="tomcatThreadPool" 引用上面定义的线程池,

<Connector executor="tomcatThreadPool"  
           port="8080"
           protocol="HTTP/1.1"  
           connectionTimeout="20000"  
           redirectPort="8443"   
           acceptCount="1000"/>  
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!