tomcat配置优化可以从两个方面入手:
i、tomcat启动命令行中的参数优化(或者叫做jvm优化 catalina.sh or catalina.bat);
ii、tomcat容器本身优化(server.xml)。
一、JVM优化:
tomcat 的启动参数位于tomcat的安装目录\bin目录下,打开参数配置文件 xxx/tomcat/bin/catalina.bat,在文件开头的一大串注释说明之后加入参数设置语句:
set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true。(注:key后面的value值只是参考,具体根据实际环境设置,但是设置的参数基本上就这些)
各项参数说明:
1、-server :JVM的服务器模式,tomcat启动时,默认采用的是客户端模式,在生产环境中,tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量等等各种优势。
2、-Xms-Xmx:jvm 内存分配值,把Xms与Xmx两个值设成一样是最优的做法;设置值时通过命令校验:java -Xmx2048M -versioin,在分配2G内存的情况下查询jdk版本,如果能正常显示,则说明jvm能够使用的最大值没有超出物理内存允许的值。(注意:win系统,32位的有限制JVM最大可用为2GB内存,64位系统无限制。)
3、-Xss:是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。
4、-XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术。
5、 -XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。
6、 -XX:PermSize=128M-XX:MaxPermSize=256M
JVM使用-XX:PermSize设置非堆内存初始值,什么叫非堆内存呢,也就是除了提供给开发人员跑应用程序需要的内存值之外其他非开发人员运行的程序需要的内存值。
该值默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4,如果是物理内存4GB,那么64分之一就是64MB,四分之一是1024MB。
7、-XX:+DisableExplicitGC:设置在程序代码中不允许有显示的调用”System.gc()”。手动调用System.gc()会导致系统响应时间严重降低。
8、-Djava.awt.headless=true:避免环境的不一样导致web页面中的图片图形显示不出来的问题。
二、tomcat容器本身优化
对Tomcat启动时的命令进行优化可以在系统的JVM可使用数、垃圾回收效率与线程阻塞情况、系统响应效率等指标;而tomcat容器优化可以提升吞吐量指标。
容器优化在文件 tomcat安装目录\conf\server.xml。
server.xml文件的结构:
元素说明:
<Server>顶层元素下可以有多个<Service>
重点说明<Connector>:
文件默认参数配置:
<Connector port=“8080” protocol=“HTTP/1.1”
connectionTimeout=“20000”
redirectPort=“8443” />
优化后的配置:
参数说明:
1、port 代表Tomcat端口号,默认8080。
2、protocol 协议类型,可选类型有4种,BIO(阻塞型IO),NIO,NIO2和APR。
** BIO
BIO(Blocking I/O) 阻塞式I/O操作,传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的,bio模式是运行模式中性能最低的一种。BIO配置采用默认即可。
一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。
Tomcat7或以下,在Linux系统中默认使用这种方式。
**NIO
NIO(New I/O)是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、非阻塞I/O操作的Java API它拥有比传统I/O操作(bio)更好的并发运行性能。
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。
Tomcat8在Linux系统中默认使用这种方式。
Tomcat7必须修改Connector配置来启动:
<Connector port=“8080” protocol=“org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=“20000” redirectPort=“8443”/>
**APR
即Apache Portable Runtime,从操作系统层面解决io阻塞问题。
Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。
** 修改方式
//BIO
protocol=“HTTP/1.1”
//NIO
protocol=“org.apache.coyote.http11.Http11NioProtocol”
//NIO2
protocol=“org.apache.coyote.http11.Http11Nio2Protocol”
//APR
protocol=“org.apache.coyote.http11.Http11AprProtocol”
3、maxThreads
获取最佳maxThreads的最佳值
(1)通过线上系统不断使用和用户的不断增长来进行性能测试,观察QPS,响应时间,这种方式会在爆发式增长时系统崩溃,如双12等。
(2)根据公式计算,服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量,这种方式有时会被误导,因为某些系统处理环节可能会耗时比较长,从而影响公式的结果。
(3)单、多用户压力测试,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量,这种方式理想场景比较适用,实际情况会比这个复杂的多。
(4)根据系统的自身情况调整,如硬件限制,系统限制,程序处理能力限制等。
(5)定期修改为不同的 maxThreads值,看服务器响应结果及用户反应。
#QPS和线程数的关系
(1)在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
(2)同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
QPS和响应时间的关系
(1)对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成。
(2)CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。
4、minSpareThreads
线程的最小运行数目,这些始终保持运行。如果未指定,默认值为10。
5、URIEncoding=”UTF-8”
使得tomcat可以解析含有中文名的文件的url。
6、maxSpareThreads
maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。
7、minSpareThreads
最小备用线程数,tomcat启动时的初始化的线程数。
8、enableLookups
enableLookups”设置为“false”来关闭DNS 查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地 址的字符串。
9、connectionTimeout
connectionTimeout为网络连接超时时间毫秒数。
10、 acceptCount
acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection
11、给Tomcat配置gzip压缩(HTTP压缩)功能
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。
1)compression=“on” 打开压缩功能
2)compressionMinSize=“2048” 启用压缩的输出内容大小,这里面默认为2KB
3)noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩
4)compressableMimeType=“text/html,text/xml” 压缩类型
12、redirectPort
在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口。
参考文档:
https://www.cnblogs.com/xiangsikai/p/9156631.html
https://www.cnblogs.com/gugnv/archive/2012/02/01/2334187.html
https://blog.csdn.net/lifetragedy/article/details/7708724
https://www.iteye.com/blog/ihuangweiwei-1233941