欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tomcat调优

程序员文章站 2022-06-01 12:02:01
...

Tomcat 调优及 JVM 参数优化
JVM监控与调优

一、JVM参数

export CATALINA_OUT=/data/logs/tomcat/channel_sys.out
export LOGGING_CONFIG="-Djava.util.logging.config.file=../conf/logging.properties"
#server.xml
export SERVER_CONF="-config conf/sys.xml"
export JAVA_HOME=/usr/java/jdk1.8.0_111/
export JRE_HOME=/usr/java/jdk1.8.0_111/jre

JAVA_OPTS='
-server #JVM运行模式
-Xrs #减少JVM对操作系统信号(OS Signals)的使用
-Xmx4G #最大JAVA堆 max
-Xms4G #最小JAVA堆 start
-Xss256k #JAVA栈大小
-XX:NewSize=1G #新生代大小
-XX:MaxNewSize=1G  #最大新生代大小
-XX:+DisableExplicitGC #忽略调用System.gc(),不会触发任何 GC
-XX:+UseConcMarkSweepGC #使用ParNew + CMS + Serial Old 的收集器组合进行内存回收。Serial Old 收集器将作为CMS 收集器出现Concurrent Mode Failure失败后的后备收集器使用
-XX:+CMSParallelRemarkEnabled #在使用 UseParNewGC 的情况下,尽量减少 mark 的时间
-XX:LargePageSizeInBytes=128m #指定JAVA堆的分页页面大小,内存页的大小不可设置过大
-XX:+UseFastAccessorMethods #将get,set方法转成本地代码,原始类型的快速优化
 -XX:+UseCMSInitiatingOccupancyOnly #表示只有达到阀值时才进行CMS回收
 -XX:CMSInitiatingOccupancyFraction=70 #使用cms作为垃圾回收,使用70%后开始CMS收集
-XX:SurvivorRatio=8 #新生代EDEN、FROM、TO的比例为8:1:1
-Xverify:none #禁用类验证
-Xnoclassgc #禁用类元数据回收
-Djava.net.preferIPv4Stack=true #获取到的机器名是完整的机器名
-Dfile.encoding=UTF-8 #文件编码
-Dcom.sun.management.jmxremote.ssl=false #JVISUALVM或JCONSOLE远程监控
-Dcom.sun.management.jmxremote.authenticate=false #远程监控
-Dcom.sun.management.jmxremote.port=10022  #远程监控
-Djava.rmi.server.hostname=10.206.2.180 #本机IP
#上面讲到的工具都是作为快速的查看诊断工具的。如果要深入分析问题,可以选择使用内置的Java飞行记录器:Java Mission Control,需要打开以下两个选项。
-XX:+UnlockCommercialFeatures 
-XX:+FlightRecorder

二、Tomcat参数

1、 Connector有bio、nio、apr三种运行模式

Java对BIO、NIO、AIO的支持:
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
BIO、NIO、AIO适用场景分析:
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

BIO:每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

BIO会有如下的缺点:

  • 当客户端多时,会创建大量的处理线程。每个线程都要占用栈空间和一些CPU时间。
  • 阻塞可能带来频繁的上下文切换,而大部分的上下文切换是无意义的。
    就一般而言,BIO模式是三种运行模式中性能最低的一种。

NIO:nio(non-blocking I/O)是非阻塞I/O操作。nio是一个基于缓冲区并能提供非阻塞I/O操作的Java API,它拥有比bio更好的并发运行性能。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />

NIO的工作原理包括:
1.由一个专门的线程来处理所有的 I/O 事件、并负责分发。
2.事件驱动机制,而不再同步地去监视事件。
3.线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的,减少无谓的线程切换。

NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream)。在通道上我们可以注册指定的事件,一共有以下四种事件:
1.服务端接收客户端连接事件OP_ACCEPT(16)
2.客户端连接服务端事件 OP_CONNECT(8)
3.读事件 OP_READ(1)
4.写事件 OP_WRITE(4)
服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道上的事件。以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,BIO这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达则处理这些事件;如果没有感兴趣的事件到达则处理线程会一直阻塞,直到感兴趣的事件到达为止。

APR:apr(Apache portable Run-time libraries/Apache可移植运行库)是Apache HTTP服务器的支持库。

在apr模式下,Tomcat将以JNI(Java Native Interface)的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大提高Tomcat对静态文件的处理性能。Tomcat apr是在Tomcat上运行高并发应用的首选模式。

要让Tomcat以apr模式来运行,系统必须先安装apr和native库。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
                connectionTimeout="20000"
                redirectPort="8443" />

2、Connector参数

多个Connector可以共享一个Executor线程池,所以一般先配一个线程池

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>

maxThreads最大并发数
minSpareThreads初始化时创建的线程数
<Connector 
   executor="tomcatThreadPool"
   port="8080" 
   protocol="org.apache.coyote.http11.Http11Nio2Protocol" 
   connectionTimeout="20000" 
   maxConnections="10000" 
   maxHttpHeaderSize="8192"
   redirectPort="8443" 
   enableLookups="false" 
   acceptCount="100" 
   maxPostSize="10485760" 
   compression="on" 
   disableUploadTimeout="true" 
   compressionMinSize="2048" 
   acceptorThreadCount="2" 
   compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" 
   URIEncoding="utf-8"
   useBodyEncodingForURI="true" 
/>

maxThreads :Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数

minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。

maxHttpHeaderSize :最大HTTP请求头大小

URIEncoding:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 WEB 服务器软件配置方便,需要分别指定。

connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可根据检测实际情况,适当修改。

enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。

disableUploadTimeout:上传时是否使用超时机制。

connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。

keepAliveTimeout:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。

maxKeepAliveRequests:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。

compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。

compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。

compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。

noCompressionUserAgents="gozilla, traviata": 对于以下的浏览器,不启用压缩。

如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要配置在 Tomcat 中配置压缩了。