性能优化之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"

性能优化之Tomcat

(2)g1(jdk9之后默认G1,测试用的jdk8)

JAVA_OPTS="-XX:+UseG1GC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc1.log"

性能优化之Tomcat


gc.log分析:easygc.io

性能优化之Tomcat


demo演示

1、将demo部署到tomcat

task1业务耗时1s,task2业务耗时2s。

@RestController@RequestMapping(value = "/test")public class WarController { @GetMapping(value = "/task1") public String task1() throws InterruptedException { Thread.sleep(1000); return "task1"; } @GetMapping(value = "/task2") public String task2() throws InterruptedException { Thread.sleep(2000); return "task2"; }}

2、默认配置压测,task2

配置:

  • 线程数:100

  • 循环次数:10

性能优化之Tomcat

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" />

性能优化之Tomcat

需要调整压测线程数和Executor中线程数,达到最优状态即可。可参考如下:

配置:

  • 线程数:500

  • 循环次数:10

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="25"  prestartminSpareThreads="true" maxQueueSize="100"/>
性能优化之Tomcat

注意:异常率0的时候,最大吞吐量可作为系统吞吐量。


4、nio协议

nio2的设置:

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


5、对比

最初的吞吐量:40多,现在200多,优化大约5倍性能。当然这里没有精确调整参数,可自行尝试!

*******************************************************

如有错误,欢迎指正!



以上是关于性能优化之Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

DAS性能优化之Tomcat数据源调优

JAVA开发之大型互联网企业高并发架构Tomcat服务器性能优化视频教程

Jmeter之tomcat性能测试+性能改进措施

Tomcat性能优化之开启Nio非阻塞模式

tomcat8性能优化之server.xml配置文件

Tomcat性能优化之开启Nio非阻塞模式