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个左右。

原文地址:https://www.cnblogs.com/panwenbin-logs/p/8177284.html