Tomcat 各版本(8-10)压测对比,提升性能好帮手

tomcat   信创  
发布于 Sep 18, 2024

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

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

如果你不熟悉 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 的标准构建的。

解决方案是:

[!NOTE]

新建 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 满

本次的分享到此结束,希望对你有所帮助。

如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!

本文由 黄彦祥 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。