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

jetty、tomcat、undertow

  • 1. 概述
  • 2. 性能指标
  • 3. 测试环境
  • 4. Tomcat NIO
  • 5. Jetty
  • 6. Undertow
  • 7.总结

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 如下命令进行测试:
SpringBoot服务器压测对比(jetty、tomcat、undertow)_第1张图片
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

SpringBoot服务器压测对比(jetty、tomcat、undertow)_第2张图片
吞吐量 为 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

SpringBoot服务器压测对比(jetty、tomcat、undertow)_第3张图片
吞吐量 为 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

SpringBoot服务器压测对比(jetty、tomcat、undertow)_第4张图片
吞吐量 为 47439.586
相比 Tomcat NIO 模式,大概有 21621 QPS 提升,相比 Jetty 模式,大概有 6177 QPS 提升

7.总结

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

你可能感兴趣的:(tomcat,spring,boot,服务器,压测,jmeter)