目录 | 目录下文件 | 说明 |
---|---|---|
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实现两个核心功能,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请求处理流程
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,注意,这两个幸存区永远一样大。 |
对于系统性能,用户最直观的感受就是系统的加载和操作时间,即用户执行某项操作的耗时。性能测试可以从以下两个指标量化: - 响应时间: 执行某个操作的耗时。针对一个操作测试多次,以获取操作的平均时间。 - 吞吐量: 即在给定的时间内,系统支持的事务数量,计算单位为TPS.
常用的测试工具:ApacheBench\ApacheJmeter\WCAT\WebPolygraph\LoadRunner
ApacheBench : 是一款ApacheServer基准的测试工具,用户测试Apache Server的服务能力(每秒请求数),它不仅可以用于apache测试,还可以用于Tomcat\Nginx\lighthttp\IIS等服务器。
#安装
[root@disp bin]# yum install httpd-tools
配置优化主要就是调整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"