史上最强Tomcat8性能优化

本文详细介绍了如何通过调整Tomcat配置,如禁用AJP连接、设置线程池以及优化JVM参数(如GC策略和连接器类型)来提升服务器性能。作者强调了从实际需求出发,动态调整参数以适应不同场景的重要性。
摘要由CSDN通过智能技术生成
  • 执行器最佳实践

  • 连接器参数说明

    • 通用属性(加粗是重点)
  • 标准实现(加粗是重点)

  • 连接器最佳实践

  • 调整JVM参数进行优化

    • 设置并行垃圾回收器
  • 查看gc日志文件

  • 调整年轻代大小

  • 设置G1垃圾回收器

  • JVM配置最佳实践

  • 总结

授人以鱼不如授人以渔


本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。

目的


通过Tomcat性能优化可以提高网站的并发能力。

Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。

对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。

服务器资源


服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。

Tomcat配置优化


Linux环境安装运行Tomcat8

具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项

如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作

/conf/tomcat-users.xml文件中的<tomcat-users>标签里面添加如下内容

如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开webapps/manager/META-INF/context.xml文件

<?xml version="1.0" encoding="UTF-8"?>

打开浏览器进行访问10.172.0.202:8080

在这里插入图片描述

点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat

在这里插入图片描述

登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息

在这里插入图片描述

AJP连接

在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。

在这里插入图片描述

什么是AJP

AJP(Apache JServer Protocol)

AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

在这里插入图片描述

我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。

修改conf下的server.xml文件,将AJP服务禁用掉即可。

在这里插入图片描述

重启tomcat,查看效果。可以看到AJP服务已经不存在了。

在这里插入图片描述

执行器(线程池)

在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

修改server.xml文件:

<Executor name=“tomcatThreadPool” namePrefix=“catalina-exec-”

maxThreads=“500” minSpareThreads=“50” prestartminSpareThreads=“true” maxQueueSize=“100”/>

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“20000”

redirectPort=“8443” />

保存退出,重启tomcat,查看效果。

在这里插入图片描述

在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1

3种运行模式

tomcat的运行模式有3种:

bio

性能非常低下,没有经过任何优化处理和支持

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)更好的并发运行性能。Tomcat8默认使用nio运行模式

apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能

对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明

| | BIO | NIO | NIO2 | APR |

| :-- | — | :-- | :-- | :-- |

| 类名 | Http11Protocol | Http11NioProtocol | Http11Nio2Protocol | Http11AprProtocol |

| 引用版本 | ≥3.0 | ≥6.0 | ≥8.0 | ≥5.5 |

| 轮询支持 | 否 | 是 | 是 | 是 |

| 轮询队列大小 | N/A | maxConnections | maxConnections | maxConnections |

| 读请求头 | 阻塞 | 非阻塞 | 非阻塞 | 阻塞 |

| 读请求体 | 阻塞 | 阻塞 | 阻塞 | 阻塞 |

| 写响应 | 阻塞 | 阻塞 | 阻塞 | 阻塞 |

| 等待新请求 | 阻塞 | 非阻塞 | 非阻塞 | 非阻塞 |

| SSL支持 | Java SSL | Java SSL | Java SSL | Open SSL |

| SSL握手 | 阻塞 | 非阻塞 | 非阻塞 | 阻塞 |

| 最大链接数 | maxConnections | maxConnections | maxConnections | maxConnections |

推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2

设置nio2:

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“org.apache.coyote.http11.Http11Nio2Protocol”

connectionTimeout=“20000”

redirectPort=“8443” />

在这里插入图片描述

可以看到已经设置为nio2了。

部署测试用的web项目


为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。

注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。

查看服务器信息

说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。

| 配置参数 | 参数值 |

| — | — |

| Linux版本 | CentOS Linux release 7.2.1511 (Core) |

| 查看逻辑cpu个数 | 4 |

| 查看物理cpu个数 | 4 |

| 总内存 | 8G |

CentOS7服务器环境信息查看命令

查看Linux版本

查看Linux版本:cat /etc/centos-release

查看CPU个数

查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l

查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”

如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”

查看内存使用情况

查看内存占用情况:free -m

参数说明

Mem:内存的使用情况总览表。

total:机器总的物理内存 单位为:M

used:用掉的内存。

free:空闲的物理内存。

[root@localhost ~]# cat /etc/centos-release

CentOS Linux release 7.2.1511 (Core)

[root@localhost ~]# cat /proc/cpuinfo | grep “processor” | wc -l

4

[root@localhost ~]# cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

4

[root@localhost ~]# cat /proc/cpuinfo | grep “cpu cores”

cpu cores : 1

cpu cores : 1

cpu cores : 1

cpu cores : 1

[root@localhost ~]# free -m

total used free shared buff/cache available

Mem: 7825 850 6241 9 733 6714

Swap: 8063 0 8063

部署web应用

上传war包到linux服务器,然后进行部署

我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理

删除tomcat的/webapps/ROOT目录的所有文件

cd /webapps/ROOT

rm -rf *

上传war包到tomcat的/webapps/ROOT,然后解压

jar -xvf tomcat-optimization.war

rm -rf tomcat-optimization.war

进入tomcat的/bin目录重启tomcat

cd /bin

./shutdown.sh

./startup.sh

访问接口地址: http://10.172.0.202:8080/user/listUser

[{

“id”: 1,

“account”: “lilei”,

“password”: “123456”,

“userName”: “李雷”,

“gender”: 1,

“age”: 15,

“birthday”: “2001-01-01 01:01:38”,

“createTime”: “2016-03-01 19:09:55”

}, {

“id”: 2,

“account”: “hanmeimei”,

“password”: “123456”,

“userName”: “韩梅梅”,

“gender”: 0,

“age”: 14,

“birthday”: “2002-01-01 01:01:38”,

“createTime”: “2016-03-01 19:09:55”

}, {

“id”: 3,

“account”: “lucy”,

“password”: “123456”,

“userName”: “露西”,

“gender”: 0,

“age”: 13,

“birthday”: “2003-01-01 01:01:38”,

“createTime”: “2016-03-01 19:09:55”

}]

使用Apache JMeter进行性能测试

Apache JMeter是Apache组织开发的基于Java的压力测试工具。 我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。

下载安装

下载地址:http://jmeter.apache.org/download_jmeter.cgi

在这里插入图片描述

注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置

直接将下载好的zip压缩包进行解压即可。

在这里插入图片描述

进入bin目录,找到jmeter.bat文件,双机打开即可启动。

在这里插入图片描述

JMeter启动页面

在这里插入图片描述

JMeter主页面

在这里插入图片描述

修改语言

默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。

设置语言为简体中文。

在这里插入图片描述

修改语言完成的界面

在这里插入图片描述

创建接口的测试用例

测试接口之前需要调整Windows环境配置,不然会报如下错误

JMeter java.net.BindException: Address already in use: connect

出现原因

TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。

解决方案

从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

解决办法

1、打开注册表:regedit

2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters

3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒

4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534

5、重启系统

第一步:设置测试计划的名称

在这里插入图片描述

第二步:添加线程组,使用线程模拟用户的并发

在这里插入图片描述

在这里插入图片描述

1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

第三步:添加http请求

在这里插入图片描述

设置http请求

在这里插入图片描述

第四步:添加请求监控

在这里插入图片描述

启动与进行接口测试

在这里插入图片描述

查看测试报告

在聚合报告中,重点看吞吐量。

在这里插入图片描述

调整Tomcat参数进行优化


通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

禁用AJP连接

修改conf下的server.xml文件,将AJP服务禁用掉即可。

在这里插入图片描述

在这里插入图片描述

这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723

可以看到,禁用AJP服务后,吞吐量会有所提升。

当然了,测试不一定准确,需要多测试几次才能看出是否有提升。

设置线程池

通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解

最大线程数为150,初始为4

<Executor name=“tomcatThreadPool” namePrefix=“catalina-exec-”

maxThreads=“150” minSpareThreads=“4” prestartminSpareThreads=“true”/>

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“20000”

redirectPort=“8443” />

在这里插入图片描述

经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724

最大线程数为500,初始为50

<Executor name=“tomcatThreadPool” namePrefix=“catalina-exec-”

maxThreads=“500” minSpareThreads=“50” prestartminSpareThreads=“true”/>

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“20000”

redirectPort=“8443” />

测试结果:733 724 718 728 734 721 720 723 平均725

吞吐量为725次/秒,性能有所提升。

最大线程数为1000,初始为200

<Executor name=“tomcatThreadPool” namePrefix=“catalina-exec-”

maxThreads=“1000” minSpareThreads=“200” prestartminSpareThreads=“true”/>

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“20000”

redirectPort=“8443” />

吞吐量为732,性能有所提升。

测试结果 737 729 730 738 735 726 725 740 平均732

最大线程数为5000,初始为1000

是否是线程数最多,速度越快呢? 我们来测试下。

<Executor name=“tomcatThreadPool” namePrefix=“catalina-exec-”

maxThreads=“5000” minSpareThreads=“1000” prestartminSpareThreads=“true”/>

<Connector executor=“tomcatThreadPool” port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“20000”

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-2l6SvBTx-1712878461054)]

[外链图片转存中…(img-nyKfiGDZ-1712878461055)]

[外链图片转存中…(img-yUXC8tMb-1712878461055)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-VWyRjStI-1712878461056)]

Mybatis面试专题

[外链图片转存中…(img-70IoRAIR-1712878461056)]

MySQL面试专题

[外链图片转存中…(img-zlWnjZ4J-1712878461056)]

并发编程面试专题

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值