Tomcat性能调优
1.调优方式
1.1.tomcat自身调优
- 动静分离
- 启用线程池
- 修改运行模式
- 禁用AJP连接方式
1.2.jvm内存调优
jvm内存调优
2.tomcat自身调优
2.1.动静分离
tomcat对静态资源对处理性能较差,可以将动态资料资源和静态资源分开,静态资源使用nginx,动态资源使用tomcat
2.2.启用线程池
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="10"
maxQueueSize="20000"
maxIdLeTime="60000"/>
-
name:给执行器(线程池)起一个名字;
-
namePrefix:指定线程池中的每一个线程的 name 前缀;
-
maxThreads:线程池中最大的线程数量,假设请求的数量超过了 750,这将不是意味着将 maxThreads 属性值设置为 750,它的最好解决方案是使用「Tomcat集群」。也就是说,如果有 1000 请求,两个 Tomcat 实例设置 maxThreads = 500,而不在单 - Tomcat 实例的情况下设置 maxThreads=1000。
-
minSpareThreads:线程池中允许空闲的线程数量(多余的线程都杀死);
-
maxQueueSize: 线程池队列大小,超出对线程直接被拒绝
-
maxIdLeTime:一个线程空闲多久算是一个空闲线程;
2.3.调优连接器Connector
<Connector executor="tomcatThreadPool"
port="8081" protocol="HTTP/1.1"
connectionTimeout="20000" #连接超时时间
redirectPort="8453" #ssl重定向端口
enableLookups="false" #是否启动dns解析
URIEncoding="UTF-8" /> #请求URI编码
- executor:所使用对线程池,需要在上面定义
- port:端口,服务开放对端口
- protocol:请求使用到连接协议。BIO,NIO,APR
tomcat8以下默认是BIO,tomcat8以上默认是NIO
默认值为 HTTP/1.1使用自动切换机制选择基于Java NIO的连接器或基于APR / native的连接器
org.apache.coyote.http11.Http11NioProtocol
-非阻塞Java NIO连接器
org.apache.coyote.http11.Http11Nio2Protocol
-非阻塞Java NIO2连接器
org.apache.coyote.http11.Http11AprProtocol
-APR/本地连接器。 - connectionTimeout:连接超时时间,请求超过这个时间将返回超时
- redirectPort:HTTPS重定向到另一个端口(connector)
- enableLookups:是否启用dns解析,默认false
- URIEncoding:这指定用于解码URI字节的字符编码。默认值为UTF-8
即使不设置executor也可以设置线程信息,将使用内置到线程池来创建线程
<Connector executor="tomcatThreadPool"
port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8463"
maxThreads="1000"
minSpareThreads="20"
acceptCount="2000"
enableLookups="false"
URIEncoding="UTF-8" />
2.4.禁用AJP
AJP是二进制到HTTP传输协议,效率比HTTP更高,但是浏览器不支持,其他很多服务器也不支持。
AJP可以通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。nginx不支持AJP协议
注释掉AJP连接
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
3.jvm调优
jvm主要是调整内存大小,降低gc时间
- 修改bin/catalina.sh
在第一行添加如下参数
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
- java.awt.headless:Headless模式是在缺少显示屏、键盘或者鼠标是的系统配置。
- file.encoding:设定文件编码格式
- -server:dk的server版,tomcat默认以client模式运行,server版拥有更高的并发能力和更敏捷的垃圾回收机制
- -Xms:Java虚拟机堆区内存初始内存分配的大小,按照实际情况进行分配(一般为操作系统可用内存的1/64大小)
- -Xmx:Java虚拟机堆区内存可被分配的最大上限(一般为操作系统可用内存的1/4大小)
- -XX:NewSize:新生代初始化内存的大小(注意:该值需要小于-Xms的值)
- -XX:MaxNewSize:新生代可被分配的内存的最大上限(注意:该值需要小于-Xmx的值)
- -Xmn:对-XX:NewSize、-XX:MaxNewSize两个参数同时进行配置
- -XX:PermSize:非堆区初始化内存分配大小。
- -XX:MaxPermSize:非堆区分配的内存的最大上限。
调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。
参考
- https://tomcat.apache.org/tomcat-9.0-doc/config/executor.html
- https://tomcat.apache.org/tomcat-9.0-doc/config/http.html