JAVA:Tomcat常见的优化实例

1、简述

Tomcat 是一个 JSP/Servlet 容器。其作为 Servlet 容器,有三种工作模式:独立的 Servlet 容器、进程内的 Servlet 容器和进程外的 Servlet 容器。
进入 Tomcat 的请求可以根据 Tomcat 的工作模式分为如下两类:Tomcat 作为应用程序服务器:请求来自于前端的 web 服务器,这可能是 Apache, IIS, Nginx 等;Tomcat 作为独立服务器:请求来自于 web 浏览器;
在这里插入图片描述

2、端口

在 Tomcat 目录下的 conf 文件夹 server.xml中找到 port 修改自己的端口号

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
redirectPort="8443" uriEncoding="utf-8"/>

3、协议优化

protocol:协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR。Tomcat默认是以BIO运行。
在这里插入图片描述

3.1 BIO协议

BIO:BIO(Blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以BIO模式运行的。遗憾的是,就一般而言,BIO模式是三种运行模式中性能最低的一种。BIO配置采用默认即可。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
redirectPort="8443" uriEncoding="utf-8"/>

3.2 NIO协议

NIO:NIO(New I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java NIO是一个基于缓冲区、并能提供非阻塞I/O操作的java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以NIO模式来运行也比较简单,我们只需要protocol类型修改为:

<Connector connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
redirectPort="8443" uriEncoding="utf-8"/>

NIO2,是JDK7 开始支持,异步非阻塞 IO。

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

3.3、APR协议

APR:APR(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用 Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat对静态文件的处理性能。与配置 NIO运行模式一样,也需要将对应的 Connector节点的 protocol属性值改为:

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

4、参数配置优化

在Tomcat配置文件conf下面 server.xml 中的配置中和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
tcpNoDelay:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true。
maxHttpHeaderSize:“8192” http 请求头信息的最大程度,超过此长度的部分不予处理。一般 8K。
URIEncoding:“UTF-8” 指定 Tomcat 容器的 URL 编码格式。
disableUploadTimeout:“true” 上传时是否使用超时机制
参数调整:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
redirectPort="8443" uriEncoding="utf-8"/>

改为:

<Connector port="8080" 
 protocol="org.apache.coyote.http11.Http11NioProtocol" 
 connectionTimeout="20000"
 redirectPort="8443"
 maxThreads="500"
 minSpareThreads="100" 
 maxSpareThreads="200"
 acceptCount="200"
 enableLookups="false" 
 />

5、压缩参数优化

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML,CSS,javascript , Text ,它可以节省 40%左右的流量。更为重要的是,它可以对动态生成的,包括 CGI、PHP , JSP , ASP , Servlet,SHTML 等输出的网页也能进行压缩,压缩效率惊人

<Connector port="9027"
protocol="HTTP/1.1"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>

compression=“on” 打开压缩功能
compressionMinSize="2048"启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents=“gozilla,traviata” 对于以下的浏览器,不启用压缩
compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain” 哪些资源类型需要压缩

扫描二维码关注公众号,回复: 16209974 查看本文章

6、内存优化

内存方式的设置是在 catalina.sh 中,调整一下 JAVA_OPTS 变量即可,因为后面的启动参数会把 JAVA_OPTS 作为 JVM 的启动参数来处理。具体设置如下:

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4" 

其各项参数如下:
-Xmx3550m:设置 JVM 最大可用内存为 3550M。
-Xms3550m:设置 JVM 促使内存为 3550m。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存。
-Xmn2g:设置年轻代大小为 2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(除去持久代)。设置为 4,则年轻代与年老代所占比值为 1:4,年轻代占整个堆栈的 1/5
-XX:SurvivorRatio=4:设置年轻代中 Eden 区与 Survivor 区的大小比值。设置为4,则两个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个年轻代的 1/6
-XX:MaxPermSize=16m:设置持久代大小为 16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

7、垃圾回收策略调优

垃圾回收的设置也是在 catalina.sh 中,调整 JAVA_OPTS 变量。具体设置如下:

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100" 

具体的垃圾回收策略及相应策略的各项参数如下:串行收集器(JDK1.5 以前主要的回收方式)
-XX:+UseSerialGC:设置串行收集器 ,并行收集器(吞吐量优先)
示例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0 支持对年老代并行收集
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM 会自动调整年轻代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的 Survivor 区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
并发收集器(响应时间优先)示例: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-XX:+UseConcMarkSweepGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,
-XX:NewRatio=4 的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC: 设置年轻代为并行收集。可与 CMS 收集同时使用。JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值。
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次 GC 以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片。

8、添加 JMS 远程监控

对于部署在局域网内其它机器上的 Tomcat,可以打开 JMX 监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在 JVM 启动参数中配置即可,配置如下:
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38 设置 JVM 的 JMS 监控监听的 IP地址,主要是为了防止错误的监听成 127.0.0.1 这个内网地址
-Dcom.sun.management.jmxremote.port=1090 设置 JVM 的 JMS 监控的端口
-Dcom.sun.management.jmxremote.ssl=false 设置 JVM 的 JMS 监控不实用SSL
-Dcom.sun.management.jmxremote.authenticate=false 设置 JVM 的 JMS 监控不需要认证

9、分析工具

使用 JDK 自带的 jconsole 可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等;
JDK 自带的 jvisualvm 可以下载插件(如 GC 等),可以查看更丰富的信息。如果是分析本地的 Tomcat 的话,还可以进行内存抽样等,检查每个类的使用情况
IBM ISA,JProfiler、probe 等,具体监控及分析方式去网上搜索即可

猜你喜欢

转载自blog.csdn.net/lishangke/article/details/128903465