SpringBoot服务器压测对比(jetty、tomcat、undertow)

1. 概述

在 Spring Boot 中,内置了三种 Servlet 容器:Tomcat、Jetty、Undertow ,也就是本文的三位主角。实际生产中,绝大多数情况,使用的都是 Tomcat ,可能很多人,初始学习的都是 Tomcat ,比较偶尔听到 Jetty ,非常小众知道有 Undertow 这个容器。那么,抛出他们的具体实现不说,我们来一起测试一下,它们的性能差别有多少。

2. 性能指标

为了保持一致,我们还是以 QPS 作为性能的指标,下面提供四个实例和对应的版本:

  • benchmark-jetty - Jetty 9.4.27.v20200227
  • benchmark-tomcat - Tomcat 9.033
  • benchmark-undertow - Undertow 2.0.30.Final

有了四个实例之后需要使用 mvn package 命令,打包出不同的示例,进行压力测试。
另外,上述示例,我们在 Controller 提供了简单的 HTTP Restful API 接口,返回简单的字符串。如下:

@RestController
public class TestController {
    @GetMapping("/")
    public String test() {
        return "ok";
    }
}

3. 测试环境

  • 系统 :MacOs 10.15.7
  • CPU :1.4 GHz 四核Intel Core i5
  • 内存 :16 GB
  • 磁盘 :256 GB SSD
  • JDK :openjdk version “1.8.0_212”
  • JVM 参数 :-Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k

有一点要注意,JVM 本身有预热的过程,Tomcat、Jetty、Undertow 本也有预热的过程(例如说,线程的初始化),所以需要多次测试,取平均值。

本文,我们使用 jmeter 如下命令进行测试:
在这里插入图片描述
Thread: 100 / Ramp-Up: 5S / 持续时间60S

4. Tomcat NIO

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

Tomcat 一共分成三种模式:

  • BIO (blocking I/O)模式:阻塞式 I/O 操作,表示 Tomcat 使用的是传统的 Java I/O 操作(即 java.io 包)。在 Tomcat 7 以及以前版本,默认使用 BIO 模式运行。一般情况下,BIO 模式是三种运行模式中性能最低的。

    也因为 BIO 模式,基本是性能最低的,所以本文我们也不进行测试,节约时间。

  • NIO (Non-blocking I/O)模式:非阻塞时 I/O 操作,表示 Tomcat 使用的是 JDK 1.4 后新提供的 I/O 操作(即 java.nio 包)。在 Tomcat 8 以及到目前最新版本的 Tomcat 9 ,默认使用的都是 NIO 模式运行。相比 BIO 模式来说,它能提供更好的并发性能

  • APR (Apache Portable Runtime/Apache 可移植运行库) 模式:APR 是 Apache HTTP 服务器的支持库。我们可以理解成,Tomcat 将以 JNI 的方式,调用 Apache HTTP 服务器的核心动态链接库来处理文件或网络传输,从而大大的提升 Tomcat 对静态文件的处理性能。Tomcat APR 模式,也是 Tomcat 上运行高并发应用的首选模式。

下面,开始正式的测试。启动 Tomcat应用程序,如下启动命令:

java -jar benchmark-tomcat-1.0-SNAPSHOT.jar -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k

在这里插入图片描述
吞吐量 为 25818.605

5. Jetty

Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 内容,例如 JSP 和 servlet 提供运行环境。Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。开发人员可以将 Jetty 容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的 Java 应用提供网络和 web 连接。

下面,开始正式的测试。启动 Jetty应用程序,如下启动命令:

java -jar benchmark-jetty-1.0-SNAPSHOT.jar -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k

在这里插入图片描述
吞吐量 为 41262.1

相比 Tomcat NIO 模式,大概有 15444 QPS 提升。

6. Undertow

Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。Undertow 提供一个基础的架构用来构建 Web 服务器,这是一个完全为嵌入式设计的项目,提供易用的构建器 API,完全兼容 Java EE Servlet 3.1 和低级非堵塞的处理器。

下面,开始正式的测试。启动 Undertow应用程序,如下启动命令:

java -jar benchmark-undertow-1.0-SNAPSHOT.jar -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k

在这里插入图片描述
吞吐量 为 47439.586
相比 Tomcat NIO 模式,大概有 21621 QPS 提升,相比 Jetty 模式,大概有 6177 QPS 提升

7.总结

总结来说,测试的结果,Undertow > Jetty  > Tomcat NIO

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Boot 内嵌 Tomcat 和外部 Tomcat 对比 Spring Boot 是一个非常方便的框架,它可以快速创建一个独立的 Spring 应用程序,并且内嵌了 TomcatJetty 或者 Undertow 等 Web 容器,可以通过简单的配置来启动和停止 Web 服务器。 与外部 Tomcat 相比,Spring Boot 内嵌 Tomcat 的优点主要有以下几点: 1. 快速启动 Spring Boot 内嵌 Tomcat 可以快速启动应用程序,不需要安装和配置外部 Tomcat 服务器,这使得开发人员更加专注于应用程序开发,节省了时间和精力。 2. 简单配置 Spring Boot 内嵌 Tomcat 的配置非常简单,只需要在 application.properties 或 application.yml 配置文件中定义相关的配置参数,就可以轻松地启动和停止 Web 服务器。 3. 简化部署 使用 Spring Boot 内嵌 Tomcat 可以将应用程序打包成一个独立的可执行的 JAR 文件,这样可以方便地进行部署和维护,也可以方便地进行版本控制和升级。 4. 更好的可移植性 Spring Boot 内嵌 Tomcat 可以在不同的操作系统和环境中运行,这使得应用程序更加可移植和易于部署。 虽然 Spring Boot 内嵌 Tomcat 有很多优点,但是与外部 Tomcat 相比,还是存在一些缺点: 1. 硬件资源消耗 由于内嵌 Tomcat 需要占用一定的硬件资源,所以对于大型的应用程序来说,可能需要更多的硬件资源才能保证其正常运行。 2. 自定义性 内嵌 Tomcat 的功能相对简单,对于一些需要自定义的功能,可能需要使用外部 Tomcat 来实现。 3. 集成其他应用程序 如果需要与其他应用程序进行集成,可能需要使用外部 Tomcat 来实现。 总之,Spring Boot 内嵌 Tomcat 和外部 Tomcat 都有各自的优缺点,应该根据具体的应用场景来选择合适的方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值