Tomcat性能调优

1、基于操作系统层面的硬件和 JVM (内存)的优化
一、操作系统调优
对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快。。
二、JDK版本的提升
应该选择SUN的JVM,在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进。JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。因此对性能要求较高的情况推荐使用 JDK1.6
三、应用程序方面基于代码的JVM调优和垃圾回收操作上的优化。

 

2、基于Tomcat本身调优
2.1、JVM参数调优
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50 -XX:+DisableExplicitGC"
1、-Xmx1024m  设置JVM最大可用内存为1024MB
2、-Xms1024m  设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
3、-XX:NewSize  设置年轻代大小
4、XX:MaxNewSize 设置最大的年轻代大小
5、-XX:PermSize  设置永久代大小
6、-XX:MaxPermSize 设置最大永久代大小
7、-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
8、-XX:MaxTenuringThreshold=0:设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
9、-XX:+DisableExplicitGC这个将会忽略手动调用GC的代码使得 System.gc()的调用就会变成一个空调用,完全不会触发任何GC
修改参数
windows下修改:
在bin/catalina.bat文件,
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
Linux下修改:
在bin/catalina.sh文件,
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

2.2、禁用AJP连接器

AJP(Apache JServer Protocol),AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
在Server.xml中注释掉

2.3、在server.xml修改配置

Connector是Tomcat接收请求的入口,每个Connector有自己专属的监听端口,Connector有两种:HTTP Connector和AJP Connector。
1、maxThreads(最大线程数): default is 200
2、minSpareThreads(最小活跃线程数): default is 25
3、maxIdleTime(空闲线程等待时间):Default value is 60000(1 minute)
4、maxQueueSize(最大的等待队里数,超过则请求拒绝)Default value is Integer.MAX_VALUE
5、prestartminSpareThreads(是否在启动时就生成minSpareThreads个线程):the default is false
6、compression 打开压缩功能   
7、compressionMinSize   启用压缩的输出内容大小,这里面默认为2KB
8、compressableMimeType 压缩类型
9、connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

2.4、属性级别修改:

禁用reloadble属性 ,是否分配线程处理监听物理目录变化的自动扫描更新。

2.5、HTTP协议优化:

protocol:协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR
(1)BIO:BIO(Blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。BIO配置采用默认即可,即:protocol="HTTP/1.1"
(2)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模式来运行也比较简单;只需要修改
//NIO和NIO2
protocol="org.apache.coyote.http11.Http11NioProtocol"        protocol="org.apache.coyote.http11.Http11Nio2Protocol"
(3)APR:APR(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用 Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat对静态文件的处理性能。
需要将对应的 Connector节点的 protocol属性值改为:protocol="org.apache.coyote.http11.Http11AprProtocol" 

2.6、线程池调优

Executor代表了一个线程池,可以在Tomcat组件之间共享。使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率。要想使用线程池,首先需要在 Service标签中配置 Executor,如下
  
  
.........
参数说明:
        name:线程池名称,用于 Connector中指定。
        namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。
        maxThreads:池中最大线程数。
        minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
        maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
        maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
        prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。
        threadPriority:线程池中线程优先级,默认值为5,值从1到10。
        className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。
        线程池配置完成后需要在 Connector中指定:

2.7、tomcat版本升级8  以后采用NIO方式处理请求;

除非环境要求,尽量使用高版本的Tomcat,因为官方也会在每一次升级时候,做一些方面的优化

3、基于网络调优(动静分离)

建立动静分离环境:
1、使用Apache配合tomcat处理动静资源。
2、也可以利用CDN等资源做动静分离,比如七牛云等。
3、利用Nginx做反向代理、请求分发控制等等,也可讲Nginx作为静态资源服务器来使用。

总结:个人根据经验和网络大搜集之后整理,给大家一个参考;看到一篇博客,有一些细节上的参考如下:Tomcat调优

你可能感兴趣的:(工具使用,Java,Web,tomcat,java,运维)