草庐IT

SpringBoot系列(四十四):Tomcat与Undertow容器性能对比分析|超级详细,建议收藏

bug菌¹ 2023-05-26 原文
👨‍🎓作者: bug菌
✏️博客: CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️ 温馨提醒:本文字数:999字, 阅读完需:约 5 分钟

嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章 点亮 👍吧,您的点赞三连( 收藏+关注 👨‍🎓 +留言 📃)就是对bug菌我创作道路上最好的鼓励与支持 😘。时光不弃 🏃🏻‍♀️,创作不停 💕,加油 ☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

在上一篇《SpringBoot之配置Undertow容器》一文中写道:“Undertow的性能和内存使用方面都要优于 Tomcat容器”, 这一期,我就要给大家来求证一波,口说无凭,那我就拿当前的Web项目来做为测试项目,监控工具就地取材,通过使用 JDK 自带的jvisualvm 工具,分别监控对比一下tomcat与Undertow使用前后各项指标的发生情况。

可能还有很多小伙伴不知道jdk自带的jvisualvm怎么玩,具体我将在如下进行步骤讲解。

二、jvisualvm工具使用说明🔥

首先jvisualvm.exe位于jdk安装目录下的bin文件中下,比如我的[C:\Program Files\Java\jdk1.8.0_201\bin],你们的自己找一下,然后在bin文件夹中找到[ jvisualvm.exe ],双击打开。具体请看如下截图:

启动后的实际界面如下:

我们可以从应用程序中找到我们正启动着的springboot应用,比如这是我的项目应用:com.example.demo.DemoApplication,找到应该选中双击进入,可以看到同界面右半部分会弹出应用程序等相关信息。

为此,监控工具就准备妥当了,接下来测试正式开始。

三、测试对比🔥

1、Tomcat容器测试

首先我们把项目使用容器切换为Tomcat。我们先来看看,Tomcat容器在相同项目环境下运行中,堆内存大约使用了41M,线程活动数:29,实际峰值:33。

如上监控截图还可以看到cpu使用为0,那是项目接口没有被请求,接着我模拟项目被疯狂请求的情景(同一接口调用20次)。

项目运行各方面指数会发生如何变化?大家请仔细看:

当发送大量请求时,分析如上监控数据,可以得知,项目运行最大cpu使用占比为1.1%,堆内存使用大约75M,前后出现断崖式下跌。

接着我们来测试一下使用Undertow容器,看看它的表现又如何。

2、Undertow容器测试

我先把tomcat容器切换成轻量级 Undertow,然后重新打开监控工具,大家请看。

它大约堆内存使用了138M,线程活动数:20,实际峰值:23。这还是在应用不复杂的情况下,大型应用出入会更大。

为保证同试验场景,我也是同一接口20次请求,进行接口调用模拟,看看Undertow的表现如何?请大家敬请期待。

当发送大量请求时,分析监控各项数据,可以得知,最大cpu使用占比30%,堆内存使用大约60M,线程活数丝毫不动,发现堆内存的占用增长不明显。

3、试验结论

通过试验结果数据分析对比,发现项目使用Undertow容器的情况下,无论是堆内存使用情况还是线程使用情况,明显比使用tomcat容器下更胜一筹;但在并发量不高的情况下 , 也发现Tomcat与undertow的吞吐量区别上看上去变化不大。

四、总结🔥

在SpingBoot项目中,我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替Tomcat;对于Jetty,看场景选择,若是面对长连接、即时通信等聊天场景为主,那首选Jetty容器,Jetty在这方面表现更佳,总之,Jetty的性能和内存使用方面都优于Tomcat,弱于Undertow。

其次对于Undertow在高并发业务场景中,性能优于Tomcat容器(测试数据肉眼可见)。

所以,对于高并发项目,首选推荐使用Undertow,你会发现你的系统性能会得到很大的提升。

... ...

ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

五、往期推荐🔥

  • ... ...

文末🔥

如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

我是bug菌,一名想走 👣 出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!


感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!

有关SpringBoot系列(四十四):Tomcat与Undertow容器性能对比分析|超级详细,建议收藏的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  5. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  6. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  7. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  8. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  9. ruby - 从结束值创建一系列字符串 - 2

    我使用irb。下面是我写的代码。“斧头”..“bc”我期待"ax""ay""az""ba"bb""bc"但结果只是“斧头”..“bc”我该如何纠正?谢谢。 最佳答案 >puts("ax".."bc").to_aaxayazbabbbc 关于ruby-从结束值创建一系列字符串,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7617092/

  10. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

    我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

随机推荐