Tomcat是做Java Web开发时部署服务最受欢迎的容器,关于它的运行机制和调优参数本文进行一定的整理。
一个经典的配置文件如下所示:
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="www.testwebapp.com"> <Host name="www.testwebapp.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> </Engine> </Service> </Server>
我们可以看到它的结构:
可以从更深层次的视角来查看架构:
当一个HTTP请求到达Tomcat后,所经历的大致流程如下:
Connector是Tomcat的核心组件,从 这里 可以看到各种Connector的对比。主要参数如下:
Tomcat启动的时候会首先创建minSpareThreads个线程,然后随着负载的增加一直增加到maxThreads,如果此时所有线程都处于busy状态,此后再来的 请求将会被放入queue中(最大容纳acceptCount)直到有空闲线程来执行。 当queue满了并且连接数量达到了maxConnections,后续再连接进来的connection将收到 Connection Refused
错误。此时应该对线程池的容量做适当调整, 但也不能调整过大,防止服务器负载升高。
它可以更好的在多个Connector之间控制和调度线程池的资源,也便于控制服务器的负载。它的机制和Connector中的默认线程池一样,使用最小和最大线程池参数控制线程个数, 并通过maxQueueSize控制队列的大小,如果超过了能够容纳的容量,则抛出 RejectedExecutionException
错误。
本文首次发布于S.L’s Blog, 作者 @stuartlau , 转载请保留原文链接.
Previous
Java中的Copy-On-Write