性能优化之Tomcat
Posted 码友汇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能优化之Tomcat相关的知识,希望对你有一定的参考价值。
**********************************************
高并发请求下,你的Tomcat能承受住吗?下载tomcat后我们该如何正确配置它呢?下面和我一起来了解下吧!(文章直接上干货,tomcat基础请自行学习)
优化思路
1、禁用ajp协议
8.5.51版本之前默认是开启的,之后版本都是默认禁用的。
2、启动线程池
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"
prestartminSpareThreads="true" maxQueueSize="100"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
不配置线程池的情况下默认10个线程,最小10,最大200
参数说明:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业务来判断。
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize,最大的等待队列数,超过则拒绝请求
3、运行模式设置
运行模式:
bio:不推荐
nio:推荐,新版支持nio2(nio2的内核态到用户态是异步的)
apr:操作系统级别的异步
nio2的设置:
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
参数需要不断测试,最终确定!!!
其实优化到这里就可以了,下面的优化手段了解即可哦......
4、compression压缩属性优化
sendfile:nio开始在内核态传输,效率得到了提升。
compression压缩开启的话,需要关闭sendfile,因为compression是用户空间压缩,会冲突,只能二选一。看具体的业务场景。
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"
useSendfile="false"
compression="on"/>
加上这两个参数反而降低了性能,所以要根据项目定位去考虑是否优化。
5、deferAccept参数优化
这里优化的是TCP中的TCP_DEFER_ACCEPT参数(内核级别)。
只在apr通道中可能实现。意义不大!
6、keep-alive的优化
在不同的web服务器中,肯定都有keepalive的配置,一般配置如下两个参数:
keepAliveTimeout:此时间过后连接就close了,单位是milliseconds
maxKeepAliveRequests:最大长连接个数(1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间)
在tomcat中,http11之后,keepalive默认就是开启的。可以不修改!
7、jvm优化
修改垃圾回收器类型,启动参数等,根据机器内存及CPU信息设置,也要参考项目业务类型!下面仅针对GC类型设置:
(注意:我用的单核CPU虚拟机,内存很小,吞吐量很差,学习方法即可)
bin/catalina.sh
(1)pl+po
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
(2)g1(jdk9之后默认G1,测试用的jdk8)
JAVA_OPTS="-XX:+UseG1GC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc1.log"
gc.log分析:easygc.io
demo演示
1、将demo部署到tomcat
task1业务耗时1s,task2业务耗时2s。
public class WarController {
public String task1() throws InterruptedException {
Thread.sleep(1000);
return "task1";
}
public String task2() throws InterruptedException {
Thread.sleep(2000);
return "task2";
}
}
2、默认配置压测,task2
配置:
线程数:100
循环次数:10
3、启用线程池
默认配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"
prestartminSpareThreads="true" maxQueueSize="100"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
需要调整压测线程数和Executor中线程数,达到最优状态即可。可参考如下:
配置:
线程数:500
循环次数:10
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="25"
prestartminSpareThreads="true" maxQueueSize="100"/>
注意:异常率0的时候,最大吞吐量可作为系统吞吐量。
4、nio协议
nio2的设置:
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
5、对比
最初的吞吐量:40多,现在200多,优化大约5倍性能。当然这里没有精确调整参数,可自行尝试!
*******************************************************
如有错误,欢迎指正!
以上是关于性能优化之Tomcat的主要内容,如果未能解决你的问题,请参考以下文章