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 项目性能差不多一致
好了,今天的分享就到这里,欢迎大家关注我,与我互动,最近再跟小伙伴们探索程序猿如何搞副业,建了一个小群交流,欢迎大家的加入与共创。