最近线上项目出现了一些性能问题,老板让我做一下调优,老天啊,最讨厌性能调优了,你就不能多买几台服务器抗一抗吗?哈哈,为了打发老板,我决定偷个懒,用版本升级的套路来快速优化一下,也算交个差吧!
本文无技术难点,直接开大测试,使用 3 台 jmeter 压力机,给我使劲轰不同版本的 tomcat。
如果你不熟悉 jmeter,刚好我前几天刚写了两篇入门文章介绍,可以往前翻一翻。
好了,直接开整吧,准备了一个 springboot 最简单的 helloworld 项目,构建出 war 包。
准备了 3 台压测机 2 台待压测机
准备了 tomcat 8-10 版本的
自学的测试技能,测试的不一定专业,有专业点的圈友可以点评指正,让我成长一下
测试用例如下:
配置环境变量方便切换(JDK 使用的是 kona 11)
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 基本能打满,内存占用倒不大,主要接口比较简单
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 性能好一点,也就一点,好吧,一点好也是好,苍蝇腿也是肉。
注意: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 依然坚挺,有点出错率也是不错的成绩哈,可以去交差了
因为公司有信创及 ARM 的需求,顺便在 ARM 机器上做一下验证,确保性能不至于太差。
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 的 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 的水平
再来看看一下 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 满
本次的分享到此结束,希望对你有所帮助。
如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!