Tomcat 版本怎么选?JMeter 真实压测多版本 Tomcat 数据给你最直接的参考,快收藏备用吧!

最近线上项目出现了一些性能问题,老板让我做一下调优,老天啊,最讨厌性能调优了,你就不能多买几台服务器抗一抗吗?哈哈,为了打发老板,我决定偷个懒,用版本升级的套路来快速优化一下,也算交个差吧!

本文无技术难点,直接开大测试,使用 3 台 jmeter 压力机,给我使劲轰不同版本的 tomcat。

如果你不熟悉 jmeter,刚好我前几天刚写了两篇入门文章可以推荐给你:

JMeter 快速入门体验,小白也能看得懂!

JMeter 入门之远程启动,服务模式,多机联测,负载均衡测试

好了,直接开整吧,准备了一个 springboot 最简单的 helloworld 项目,构建出 war 包。

准备了 3 台压测机 2 台待压测机

  • 10.70.44.18 4c16g arm64

  • 10.70.200.66 4c16g amd64

  • 10.70.44.30 8c16g arm64

  • 10.70.200.129 4c16g amd64

  • 10.70.44.25 4c16g arm64

准备了 tomcat 8-10 版本的

  • apache-tomcat-8.5.87

  • apache-tomcat-9.0.94

  • apache-tomcat-10.1.29

自学的测试技能,测试的不一定专业,有专业点的圈友可以点评指正,让我成长一下

测试用例如下:

  • 分别压测不同版本 tomcat 在相同机器上的性能表现

  • 分别压测相同版本 tomcat 在不同架构机器上的性能表现

配置环境变量方便切换(JDK 使用的是 kona 11)

压测1:amd tomcat 8

5 秒内拉起 1000 用户,每个用户请求 50 次
1000 * 50 = 5w 请求

./jmeter -n -R10.70.44.18:10000 -t examples/test.jmx

Java项目需要预热,可以多压测几次,测试多次,选取 2 次比较稳定的值如下

加大压力,5 秒内拉起 2000 用户,每个用户请求 50 次
2000 * 50 = 10w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000 -t examples/test.jmx

同样,选取 2 次稳定的输出,性能有所提升,证明 1000 并发没有达到性能极值

继续加大,5 秒内拉起 3000 用户,每个用户请求 50 次
3000 * 50 = 15w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

同样,选取 2 次稳定输出,性能有所下降,说明压力有点大了,用户太多 tps 下降也属于正常

继续加大,5 秒内拉起 4500 用户,每个用户请求 50 次
4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

tps 没有升,也没有降

继续加大,5 秒内拉起 6000 用户,每个用户请求 50 次
6000 * 50 = 30w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

tps 还是相差不大,但是你会发现,随着并发数的增加,Avg 平均响应时间,Max 最大响应时间变大了

继续加大,5 秒内拉起 9000 用户,每个用户请求 50 次
9000 * 50 = 45w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

tps 下降,有一定的出错率了

压测时 CPU top 值,4c 的机器,cpu 基本能打满,内存占用倒不大,主要接口比较简单

压测2:amd tomcat 9

5 秒内拉起 1000 用户,每个用户请求 50 次
1000 * 50 = 5w 请求

./jmeter -n -R10.70.44.18:10000 -t examples/test.jmx

稳定下来和 8 差别不大,1000 并发,tps 在9780 附近

加大压力,5 秒内拉起 2000 用户,每个用户请求 50 次
2000 * 50 = 10w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000 -t examples/test.jmx tps

有所增加,跟 tomcat 8 也是近乎一致,

继续加大,5 秒内拉起 3000 用户,每个用户请求 50 次
3000 * 50 = 15w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

3000 并发貌似比 tomcat 8 好一丢丢, tps 多个7-800

继续加大,5 秒内拉起 4500 用户,每个用户请求 50 次 4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

结论同上,依然比 tomcat 8 好一丢丢

继续加大,5 秒内拉起 6000 用户,每个用户请求 50 次
6000 * 50 = 30w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

结论依然同上

继续加大,5 秒内拉起 9000 用户,每个用户请求 50 次
9000 * 50 = 45w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

依然有出错,但是性能还是比 tomcat 8 好一点的

综述:tomcat 9 比 tomcat 8 性能好一点,也就一点,好吧,一点好也是好,苍蝇腿也是肉。

压测3:amd tomcat 10

注意:war 包部署到 tomcat 10 需要做一些调整,否则会 404 的

Apache Tomcat 10.0.5 开始默认的是 Jakarta EE 规范,而 Tomcat 9 和更早的版本默认是可以处理 Java EE 规范。因此, Tomcat 9 及更早版本开发的应用程序将无法在 Tomcat 10 上运行。而我使用的示例项目是在 Tomcat 9 的标准构建的。

解决方案是:

新建 webapps-javaee 文件夹(与webapps同一目录),然后将war包放在webapps-javaee目录中,当tomcat 启动后会自动将它们转换为 Jakarta EE 并复制到 webapps 目录下,保证项目可以正常运行。

直接压力上到 3000 吧,多跑几遍,等稳定
3000 * 50 = 15w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

貌似接近 tomcat 9, 多个 200 也算吧!

继续加大,5 秒内拉起 4500 用户,每个用户请求 50 次
4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

结论同上,比 tomcat 9 多个 300 tps,依然是一个很瘦的苍蝇腿

继续加大,5 秒内拉起 6000 用户,每个用户请求 50 次 6000 * 50 = 30w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

哈哈,6000 并发的时候彰显出 tomcat 10 的魅力了哈,tps 不大降的情况还能保证 0 出错,这个绝对可以和老板吹牛逼交差了啊!

搞到 9000 试试呢? 9000 * 50 = 45w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

tps 依然坚挺,有点出错率也是不错的成绩哈,可以去交差了

压测4:arm tomcat 10

因为公司有信创及 ARM 的需求,顺便在 ARM 机器上做一下验证,确保性能不至于太差。

4c16g

3000 * 50 = 15w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

测试结果不尽如人意,比起 amd 的降低了 40% 多

4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.30:10000 -t examples/test.jmx

压测时 cpu 利用率好像不太高,不知道为啥,对比 amd 感觉少用了 1 个核一样

8c16g

换一个 8c16g 的 arm 机器再试试

4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.25:10000 -t examples/test.jmx

cpu 可以利用率高一点,性能也有所提升

性能也有所提升,8c 才能达到 amd 4c 的性能啊!

6000 * 50 = 30w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.25:10000 -t examples/test.jmx

性能依然平稳,稳就不错嘛

继续加大
9000 * 50 = 45w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.25:10000 -t examples/test.jmx

性能还算稳,依然是 8c16g 才达到 4c16g 的水平

压测5:jar tomcat-embed

再来看看一下 embed tomcat 的性能吧,这个我们用 amd 主机吧。

4500 * 50 = 22.5w 请求

./jmeter -n -R10.70.44.18:10000,10.70.200.66:10000,10.70.44.25:10000 -t examples/test.jmx

性能还可以,基本等同于 war 版本的性能

基本能把 cpu 满

压测结论

根据上面的压测结果估计你也大概知道结论了,整体看下来:

  • tomcat 8-10 随着版本的增进,性能会有所提升,tomcat 9 的性能提升较明显一点,tomcat 10 做了比较大的改版,性能提升一丢丢;

  • 同样配置如 4c16g, amd 机器可以更加充分的利用 cpu,性能较好,arm 机器增配到 8c16g 才达到 amd 4c16g 的性能;

  • 默认情况下,jar 项目和 war 项目性能差不多一致

好了,今天的分享就到这里,欢迎大家关注我,与我互动,最近再跟小伙伴们探索程序猿如何搞副业,建了一个小群交流,欢迎大家的加入与共创。

JMeter是一个开源的压力测试工具,可以用于Web应用、SOA服务以及其他HTTP协议的应用程序的性能测试。当需要对系统进行大规模并发压力测试时,我们通常会考虑构建分布式JMeter环境。 ### JMeter分布式压测环境搭建步骤: #### 第一步:准备环境 1. **服务器配置**:首先,你需要一组服务器,每台服务器都需要安装Apache JMeter,并且它们之间应该有稳定的网络连接。 2. **JMeter版本一致性**:确保所有JMeter版本一致,避免因版本差异导致的兼容性问题。 #### 第二步:部署JMeter 1. **服务器上安装JMeter**:通过SSH或其他远程访问工具将JMeter安装包上传到服务器上,然后解压并配置JMeter环境变量。可以参考官方文档或教程进行详细操作。 2. **配置JMeter**:在每个JMeter实例中配置监听地址和端口。例如,在命令行中运行 `jmeter -n -t test计划.jmx -l results.jtl` 来启动测试,这里 `-n` 指示无GUI模式运行,`-t` 表示测试脚本的位置,`-l` 表示结果保存文件位置。 #### 第三步:创建并分发测试计划 1. **设计测试计划**:使用JMeter的图形界面或脚本语言编写测试计划,包括URL、请求头、参数、断言等。确保测试计划能覆盖所需的所有功能和场景。 2. **导出测试计划**:将测试计划导出为.jmx格式文件,以便于跨节点执行。 3. **分发测试计划**:将测试计划文件复制到所有参与测试的服务器上。 #### 第四步:协调与控制 1. **负载均衡**:根据实际需求分配任务给各个服务器,可能需要使用额外的工具如LoadRunner或Zabbix等来监控和控制流量分配。 2. **日志分析**:为了更好地理解系统响应以及发现潜在瓶颈,设置详细的日志记录,并定期查看日志信息。 #### 第五步:执行分布式测试 1. **同步执行**:通过脚本或者其他自动化手段触发所有服务器同时开始执行测试计划。 2. **监视与调整**:使用JMeter自带的日志功能或外部监控工具监视测试过程,必要时调整服务器资源分配或测试策略。 #### 第六步:分析结果 1. **聚合报告**:通过JMeter的聚合报告功能合并各服务器的测试结果,生成全面的性能测试报告。 2. **优化调整**:基于测试结果分析系统性能瓶颈,针对性地优化代码或架构设计。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值