前言
Tomcat的优化不是简单的修改几个参数就可以的,它的优化主要有三方面,分为系统优化,Tomcat本身的优化,JVM调优。
Tomcat本身优化
1.Connector连接器的配置
Tomcat连接器的三种方式:bio,io和apr,三种方式性能差异很大,apr的性能最优,bio的性能最差。而Tomcat9使用的Connector默认启用Apr协议.
2.配置文件优化
配置文件优化就是对server.xml优化,可以提高Tomcat的处理请求能力。
默认配置下,Tomcat会为每个连接器创建一个绑定的线程池(最大线程数200),服务启动时,默认创建5个空闲线程随时等待用户请求
首先,打开 ${TOMCAT_HOME}/conf/server.xml,搜索【<Executor name=“tomcatThreadPool”】,开启并调整为
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>
然后,修改<Connector …>节点,增加 executor 属性,搜索【port=“8080”】,调整为
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="30000"
enableLookups="false"
disableUploadTimeout="false"
connectionUploadTimeout="150000"
acceptCount="300"
keepAliveTimeout="120000"
maxKeepAliveRequests="1"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
redirectPort="8443" />
- maxThreads:Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大线程数,默认值是200
- minSpareThreads:最小空闲线程数,Tomcat启动时的初始化线程数,表示即使没有人使用也开这么多空线程等待,默认值是10
- maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程数
最大线程数不是越大越好,当线程数开启太多,CPU疲于线程上下文切换,就没有精力提供请求服务了
- accpetCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求不予处理,默认为100个.(当连接请求大于最大备用线程数,请求就会放入请求队列中等待)
- compression: 是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩),force:表示所有情况下都进行压缩,默认值为off。压缩后可以有效的减少页面的大小,一般可以减少1/3左右,节省带宽
JVM优化
Tomcat启动命令行中的优化参数,就是JVM的调优(Tomcat本质是Java程序)。Tomcat首先跑在JVM之上的,因为它的启动其实也是一个java命令行,首先我们需要对这个Java启动命令行进行调优。不管是YGC还是Full GC,GC过程中都会导致程序运行中断,正确选择不同的GC策略,调整JVM,GC的参数,可以极大的减少由GC工作导致程序运行中断的问题。
JVM参数配置方法
Linux下Tomcat的启动参数位于catalina.sh文件。JAVA_OPTS,就是用来设置JVM相干运行参数的变量,还可以在CATALINA_OPTS变量中设置。
这两个变量的区别?
首先,在启动 Tomcat 时,任何指定变量的传递方式都是相同的,可以传递到执行“start”或“run”命令中,但只有设定在 JAVA_OPTS 变量里的参数被传递到“stop”命令中。对于 Tomcat 运行过程,可能没什么区别,影响的是结束程序,而不是启动程序。
第二个区别是更微妙,其他应用程序也可以使用 JAVA_OPTS 变量,但只有在 Tomcat 中使用 CATALINA_OPTS 变量。如果你设置环境变量为只使用 Tomcat,最好你会建议使用 CATALINA_OPTS 变量,而如果你设置环境变量使用其它的 Java 应用程序,例如 JBoss,你应该把你的设置放在JAVA_OPTS 变量中。
简单讲下就是后者设置的环境变量只能在Tomcat环境中有效,而前者还可以在别的环境下调用
JVM参数属性
set CATALINA_OPTS="
-server
-Xms6000M
-Xmx6000M
-Xss512k
-XX:NewSize=2250M
-XX:MaxNewSize=2250M
-XX:PermSize=128M
-XX:MaxPermSize=256M
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:MaxTenuringThreshold=31
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai
-Djava.awt.headless=true"
在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:
JAVA_OPTS=’-Xms512m -Xmx1024m’要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。
-Xms:初始值-Xmx:最大值-Xmn:最小值
上述命令的作用:
- 系统响应时间增快
- JVM回收速度增快又不同时影响系统的响应率
- JVM内存最大利用化
- 线程阻塞情况最小化
- server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数
- Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落(简称内存偏移),默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制
- Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制
- Xss:表示每个 Java 线程堆栈大小,JDK 5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整,在相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。一般小的应用, 如果栈不是很深, 应该是128k 够用的,大的应用建议使用 256k 或 512K,一般不易设置超过 1M,要不然容易出现out ofmemory。这个选项对性能影响比较大,需要严格的测试
- XX:NewSize:设置新生代内存大小
- XX:MaxNewSize:设置最大新生代新生代内存大小
- XX:PermSize:设置持久代内存大小
- XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代
- XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)