一、优化
参考官方配置参数信息
http://tomcat.apache.org/tomcat-9.0-doc/config/http.html
${TOMCAT_HOME}/conf/server.xml
1.线程池优化
搜索<Executor name="tomcatThreadPool"】,并开启
-
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
-
maxThreads="150" minSpareThreads="4"/>
maxThreads :
Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,如果未指定,则此属性设置为200
根据自己的实际情况合理设置,设置越大会耗费内存和 CPU,因为 CPU 疲于线程上下文切换,没有精力提供请求服务了
minSpareThreads:
最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,如果未指定,10
则使用默认值
然后在
-
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
-
connectionTimeout="20000"
-
redirectPort="8443" />
启用,当然也可以直接在Connector中设置这些参数
executor:
对Executor 元素中的名称的引用。如果设置了此属性,并且存在指定的执行程序,则连接器将使用执行程序,并且将忽略所有其他线程属性。请注意,如果未为连接器指定共享执行程序,则连接器将使用专用的内部执行程序来提供线程池。
2.protocol优化
默认值是 HTTP/1.1
使用自动切换机制来选择基于Java NIO的连接器或基于APR / native的连接器。如果PATH
(Windows)或LD_LIBRARY_PATH
(在大多数unix系统上)环境变量包含Tomcat本机库,并且AprLifecycleListener
用于初始化APR的useAprConnector
属性设置为 true
,则将使用APR /本机连接器。如果找不到本机库或未配置该属性,则将使用基于Java NIO的连接器。请注意,APR /本机连接器对HTTPS的设置与Java连接器不同。
要使用显式协议而不是依赖上述自动切换机制,可以使用以下值:org.apache.coyote.http11.Http11NioProtocol
- 非阻塞Java NIO连接器org.apache.coyote.http11.Http11Nio2Protocol
- 非阻塞Java NIO2连接器org.apache.coyote.http11.Http11AprProtocol
- APR /本机连接器。
当然也可以使用定制实现
二、启动
1.tomcat的启动流程
Tomcat中的main入口是org.apache.catalina.startup.Bootstrap#main
2.tomcat在接收到请求的全过程
- Connector组件的Acceptor监听客户端套接字连接并接收Socket。
- 将连接交给线程池Executor处理,开始执行请求响应任务。
- Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Request对象。
- Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。
- Engine,Host,Context,Wrapper容器的管道开始处理
- 最后执行 Wrapper容器对应的Servlet对象的 处理方法