Tomcat优化
主要有以下几个方面来提高Tomcat服务器的性能
硬件资源对tomcat的影响
系统硬件性能直接影响tomcat的并发量,起决定作用的是CPU和MEM,CPU运行速度提升,会带来tomcat响应时间的缩短,mem大小决定工程需要内存的大小和工程的并发数量。
jdk版本选择
在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进。
JDK参数优化
JAVA_OPTS参数说明
-server 启用jdk 的 server 版;
-Xms java虚拟机初始化时的最小内存;
-Xmx java虚拟机可使用的最大内存;
-XX:PermSize 内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域
-Xms=-Xmx=服务器内存*70%,如部署tomcat,jboss在同一台服务器-Xms=-Xmx=服务器内存*80%*1/4,现公司服务器内存一般都可以加到最大4G,所以可以采取以下配置,把以下参数添加到catalina.sh里面,
JAVA_OPTS='-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m'
#-Xmx6000m #设置JVM最大可用内存为6000MB
#-Xms6000m #设置JVM初始可用内存为6000MB
#-Xmn2g #设置年轻代大小为2G
#-Xss128k #设置每个线程的堆栈大小为128k
#-XX:NewRatio=4 #设置年轻代与年老代的比值为4
#-XX:SurvivorRatio=4 #设置年轻代中Eden区与Survivor区的大小比值为4
#-XX:PermSize=512m #设置堆栈永久区起始大小为512m
#-XX:MaxPermSize=512m #设置堆栈永久区最大大小为512m
#-XX:MaxTenuringThreshold=0 #设置垃圾最大年龄为0
#-XX:+UseParallelGC #选择垃圾收集器为并行收集器
#-XX:ParallelGCThreads=8 #配置并行收集器的线程数
#-XX:+UseParallelOldGC #配置年老代垃圾收集方式为并行收集
#-XX:+UseAdaptiveSizePolicy #并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时>间或者收集频率等,此值建议使用并行收集器时,一直打开。
Tomcat并发优化
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192" #http请求头信息的最大程度,超过此长度的部分不予处理。一般8K
maxThreads="1000" #Tomcat可创建的最大的线程数。默认值200
minSpareThreads="100" #Tomcat初始化时创建的线程数。默认值4
maxSpareThreads="1000"
minProcessors="100" #连接器的最小空闲线程数
maxProcessors="1000"
enableLookups="false" #是否反查域名,默认值为true。为了提高处理能力,应设置为false
URIEncoding="utf-8" #指定Tomcat容器的URL编码格式。
acceptCount="1000" #指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10
disableUploadTimeout="true"/> #上传时是否使用超时机制
压缩
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" 压缩类型
最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置
示例:
<!--enable tomcat ssl-->
<Connector port="8443" protocol="HTTP/1.1"
URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"
acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
SSLEnabled="true"
scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"
/>
数据库性能调优
Tomcat性能在等待数据库查询被执行期间会降低。如今大多数应用程序都是使用可能包含“命名查询”的关系型数据库。
如果是那样的话,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。另一件重要事是确保所有数据库连接正确地关闭。
给数据库连接池设置正确值也是十分重要的。我所说的值是指Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属性的值。
因为配置依赖与应用要求,我也不能在本文指定正确的值。你可以通过调用数据库性能测试来找到正确的值。
Tomcat本地库
Tomcat的原生库基于Apache可移植运行时(Apache Portable Runtime简称APR),给程序员提供了超强的扩展性和性能,在产品运作中帮助融合原生的服务器技术以展现最佳的性能。
禁用AJP协议
(1)通过禁用AJP协议,达到在集群的时候提高处理请求的时间。
图1
(2)启动tomcat后,不论从刚刚的管理员界面,还是从控制台上(如图1所示)都可以看出,AJP协议是开启的。
我们要做的就是要将此协议禁用,禁用方法:在server.xml中,将
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
注释掉,重新启动tomcat,可以看出控制台上已经不存在上图 黑框中所示的。
将BIO通讯模式修改为NIO通讯模式
(1)tomcat通讯协议支持http1.0和1.1,tomcat默认走的是BIO通讯模式,tomcat7和tomcat8之所以默认的都是效率低下的BIO通讯模式,是因为和前面的就项目做兼容。
(2)在控制台上(如图1所示)或者管理界面都可以看到,tomcat启动的通讯模式是bio的。
(3)应用场景:tomcat集群的时候,若项目比较新,都是1.5类库之前,即JDK版本大于1.5,可将集群中每一个tomcat的启动模式设置为高并发高性能的应答模式(NIO)。
(4)配置方法:在server.xml中 ,将 <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改为:
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
其中,原来的protocol="HTTP/1.1"表示遵循http1.1协议,同时,也是一个最原始的未经优化的通信协议,
修改之后的 protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式启动。
优化连接器
1) 设置tcpNoDelay属性值为“true”;
2) 通过maxKeepAliveRequest属性调整允许keep-alive功能的请求的最大数目,值为1时表示禁用;
3) 调整socketBuffer属性的值以改变套接字缓冲的大小;
4) 将enableLookups设置为false以禁用DNS反解;
5) Tomcat是一个多线程的Servlet容器,使用线程池能对服务器性能带去很大影响;这主要通过maxThreads、maxSpareThreads和minSpareThreads来定义;
示例:
<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
enableLookups="false"
maxPostSize="10485760"
URIEncoding="UTF-8"
acceptCount="100"
acceptorThreadCount="2"
disableUploadTimeout="true"
maxConnections="10000"
SSLEnabled="false"
/>
指定使用线程池来处理HTTP请求
注释如下的原始配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
增加如下配置,如原配置文件有,则取消注释进行修改即可。
<!--共享执行器,能定义一个或多个线程池-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="600" minSpareThreads="100" maxIdleTime="60000"/>
<!--最大线程500(一般服务器足以),最小空闲线程数20,线程最大空闲时间60秒。-->
<!--使用线程池的连接器-->
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="60000"
keepAliveTimeout="15000"
redirectPort="8443"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
enableLookups="false"
acceptCount="500"
disableUploadTimeout="true"/>
参数说明:
connectionTimeout - 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒
keepAliveTimeout - 长连接最大保持时间(毫秒)。此处为15秒
maxKeepAliveRequests - 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)
maxHttpHeaderSize - http请求头信息的最大程度,超过此长度的部分不予处理,一般8K。
URIEncoding - 指定Tomcat容器的URL编码格式。
acceptCount - 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。
disableUploadTimeout - 上传时是否使用超时机制。
enableLookups - 是否反查域名,取值为:true或false,为了提高处理能力,应设置为false。
bufferSize - 定义连接器输入流缓存大小,默认2048bytes。
maxSpareThreads - 做多空闲连接数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程 。
maxThreads - 最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
minSpareThreads - 最小空闲线程数,Tomcat初始化时创建的线程数 。
注意:允许的最大连接数,还受制于操作系统的内核参数设置,通常windows是2000个左右,linux是1024个左右。
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少