一、整体知识体系
二、调优实战
1、禁用ajp
对于tomcat10已经默认禁用了,但是对于10以下的版本需要手工禁用,ajp的漏洞大家可以自行去“国家信息安全共享平台"查看
2、启用线程池
(1)每个线程池都是一个线程,所以打开线程池可以提高性能
(2) 修改配置文件: conf/server.xml 中的<Executor> 注释打开
打开线程池
连接器指定线程池
三、Tomcat运行模式
BIO:tomcat7之前默认的阻塞模式,性能低下(accept和read方法会阻塞),没有经过任何优化处理和支持,8.5版本以后已经抛弃该模式
NIO:同步非阻塞模式(解决了accept和read的阻塞问题,NIO模式下调用read方法一定会读到数据),tomcat内部实现了reactor线程模型,性能较高
NIO2:纯异步模式,tomcat内部实现了preactor线程模型
APR:安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度提高了性能
四、性能测试
本例是使用jmeter对应用服务器登录接口进行测试
未禁用AJP协议,未用线程池之前,并发场景下异常率较高,吞吐量很低,相应较长
禁用AJP之后,吞吐量有较大提高,但是异常率快速增长,多次测试,相差不是很大
加入NIO线程池后,异常率下降到0,吞吐量比原来快了6-8倍
附测试使用的server.xml截图:
五、Tomcat线程线程详解
1 main线程
(1) main线程是Tomcat的主要线程,其主要作用是通过启动包来对容器点火
(2) main的作用是把容器组件拉起来,然后阻塞在8005端口,等待关闭
2 localhost-startstop线程(Tomcat8)
(1) Tomcat采用层级异步启动,对于每一层级的组件都是采用startstop线程进行启动
(2) 当组件启动完成之后,那么该线程就退出了,生命周期仅仅限于此
3 AsyncFileHandleWriterandleWriter线程
主要作用是对接日志框架
4 ContainerBackgroundProcessor线程(Tomcat8)
(1) 主要负责实时扫描Tomcat容器的变化,在一些时刻触发某些事件,例如在热部署开启时reload工程等
(2) 扫描容器时按照层级递归扫描
5 Catalina-Utility 线程 (Tomcat9)
将Tomcat8中的ContainerBackground线程和startstop线程合二为一了
6 Accept线程
(1)Tomcat前端最外层的线程,负责统一接受socket请求
(2)Acceptor处理完之后的线程在nio 和 bio模式之间略有差异
其中,NIO的效率比BIO高是因为acceptor线程和exec线程之间多了一个pull线程在轮询,已经就绪的这些socket通道全部返回给你;pull线程里面调用的是IO多路复用,其意思就是每一个socket都会有数据,不会发生阻塞
7 ClientPoller线程(默认2个)
(1) nio模式中的特有线程,reactor模式的实现者
(2) 具体负责接收acceptor线程交接过来的事件,对事件轮询后交接给exec线程处理
8 exec线程
(1)Tomcat的主要工作线程,默认开启10个,接收poller线程丢过来的IO事件
(2)主要工作是http协议解析,攒出Request和response,然后调用Tomcat后端的容器
9 NioBlockingSelector.BlockPoller线程(默认2个)
负责Servlet的输入和输出
10 AsyncTimeOut线程(Tomcat8)
主要作用检测异步request请求,触发超时,并将该请求再转发到工作线程池处理
11 其他线程
六 线程的分类
左侧是辅助线程,右边的4个线程是tomcat中最繁忙的4个线程,也是tomcat最重要的4个线程