Tomcat调优
一、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 中配置压缩了。
上一篇: tomcat漏扫修复及调优
下一篇: Tomcat调优总结