others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

tomcat8 优化

访问量:1303 创建时间:2021-05-10

参考视频地址 参考视频地址2

tomcat目录结构

目录 目录下文件 说明
bin / tomcat启动停止等批处理脚本
startup.sh,startup.bat linux、windows下启动脚本
shutdown.sh,shutdown.bat linux、windows下关闭脚本
conf / tomcat配置文件
Catalina 用于存储针对每个虚拟机的Context配置
context.xml 用于定义所有web应用均需加载的Context配置,如果web应用指定了自己的context.xml,该文件将被覆盖
catalina.properties tomcat的环境变量配置
catalina.policy tomcat运行的安全策略配置
logging.properties tomcat的日志配置文件,可以通过该文件修改tomcat的日志级别及日志路径等
server.xml tomcat核心配置文件
tomcat-users.xml 定义tomcat默认的用户及角色映射信息配置
web.xml tomcat中所有应用默认的部署描述文件,主要定义了基础servlet和MIME映射
lib / tomcat服务器的依赖包
logs / tomcat默认的日志存放目录
webapps / tomcat默认的web应用部署目录
work / web应用jsp代码生成和编译的临时目录

tomcat架构

tomcat实现两个核心功能,1) 处理Socket连接,负责网络字节流与Request和Response对象的转化。2) 加载和管理Servlet,以及具体处理Request请求。因此tomcat设计了2个核心组件连接器Connector和容器Container来做这两件事。

连接器 Coyote: 是tomcat的连接器框架名称,是tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接受相应。 Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了同意的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote 将Socket输入转换封装为Request对象,交由Catalina容器进行处理,处理请求完成后,Catalina通过coyote 提供的response对象将结果写入输出流。 Coyote作为独立的模块,只负责具体的协议和IO的相关操作,与Servlet规范没有直接关系,因此即便是Request和Response独享也并未实现servlet规范对应的接口,而是在Catalina中将他们进一步封装为ServletRequest和ServletResponse。

IO模型与协议: 在Coyote中,Tomcat支持的多种I/O模型和应用层协议,具体包含如下(tomcat8.5之后移除了对BIO的支持):

IO模型 描述
NIO 非阻塞IO,采用Java NIO类库实现
NIO2 异步I/O,采用jdk 7最新的NIO2类库实现
APR 采用apache可移植运行库实现,是C/C++编写的本地库,如果选择该方案,需要单独安装APR库。

tomcat支持的应用层协议:

应用层协议| 描述 http/1.1| 大部分web应用采用的访问协议 AJP| 用于和web服务器(apache)集成,实现对静态资源的优化以及集群部署,当前支持AJP/1.3 http/2| 提升web性能,下一代http协议,8.5 、9+以后版本支持

Tomcat为了实现支持多种I/O模型和应用层协议,一个容器可能对接多个连接器,就好比一个房间多个门。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来,组装后叫Service组件。Tomcat内可能有多个Service,在Tomcat中配置多个Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

容器 - Catalina

Catalina是servlet容器实现,包含了安全、会话、集群、管理等servlet容器架构的各个方面。它通过松耦合的方式集成Coyote,以完成按照请求协议进行数据读写。同时,它还包括我们的启动入口、Shell程序等。Tomcat本质是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模块都是为Catalina提供支撑。比如coyote模块提供链接通信,jasper模块提供jsp引擎,naming提供jndi服务,juli提供日志服务。

Container结构: tomcat设计了4种容器,分别是Engine\host\context\wrapper. 这四种容器不是平行关系,而是父子关系。tomcat通过一种分层架构,使得Servlet容器具有很好的灵活性。

Tomcat启动流程

Tomcat请求处理流程

Tomcat jvm配置选项

windows平台bin/catalina.bat;

set JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8

linux平台bin/catalina.sh

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8"
参数 含义
-server 以服务器模式运行
-Xms 堆内存初始大小
-Xmx 堆内存最大大小
-Xmn 新生代的内存大小,官方建议3/8
-XX:MetaspaceSize 元空间内存初始大小,jdk1.8 版本之前配置为-XX:PermSize (永久代)
-XX:MaxMetaspaceSize 元空间内存最大大小,在jdk1.8之前配置为-XX:MaxPermSize(永久代)
-XX:InitialCodeCacheSize
-XX:ReservedCodeCacheSize
代码缓存区大小
-XX:NewRatio 设置新生代和老年代的相对大小比例。这种方式的优点是新生代大小会随着整个堆大小动态扩展。如-XX:NewRatio=3 指定老年代/新生代为3/1 . 老年代占堆大小的3/4,新生代占1/4 .
-XX:SurvivorRatio 指伊甸区eden与幸存区大小比例。 如-XX:SurvivorRatio=10表示伊甸区eden是幸存区To大小的10倍(也是幸存区from的10倍),所以,伊甸区eden占新生代的10/12,幸存区from和幸存区to各占新生代的1/12,注意,这两个幸存区永远一样大。

Tomcat性能调优

对于系统性能,用户最直观的感受就是系统的加载和操作时间,即用户执行某项操作的耗时。性能测试可以从以下两个指标量化: - 响应时间: 执行某个操作的耗时。针对一个操作测试多次,以获取操作的平均时间。 - 吞吐量: 即在给定的时间内,系统支持的事务数量,计算单位为TPS.

常用的测试工具:ApacheBench\ApacheJmeter\WCAT\WebPolygraph\LoadRunner

ApacheBench : 是一款ApacheServer基准的测试工具,用户测试Apache Server的服务能力(每秒请求数),它不仅可以用于apache测试,还可以用于Tomcat\Nginx\lighthttp\IIS等服务器。

#安装
[root@disp bin]# yum install httpd-tools

tomcat配置优化

配置优化主要就是调整tomcat/conf/server.xml中关于连接器的配置,提升应用服务器的性能。

参数 说明
maxConnections 最大连接数,当达到该值后,服务器接收但不会处理请求,额外的请求将会阻塞直到连接数低于maxConnections.可以通过ulimit -a 查看服务器限制。对于CPU要求更高(计算型)时,建议不要设置过大;对于CPU要求不是特别高时,建议配置在2000左右。需要服务器硬件支持。
maxThreads 最大线程数,需要根据服务器硬件设置
acceptCount 最大排队等待数,当服务器接收的请求数量达到maxConnections,此时Tomcat会将后面的请求,存放在任务队列中进行排序,acceptCount指的就是任务队列等待的请求书。一台Tomcat的最大请求数量,时maxConnections+accpetCount.

禁用AJP:改conf下的server.xml文件,将AJP服务禁用掉即可。 目前一般使用nginx反向代理+tomcat(http) , AJP可以禁用。

Connector 配置nio2 protocol="org.apache.coyote.http11.Http11Nio2Protocol"

登陆评论: 使用GITHUB登陆