赞
踩
在 Spring Boot 中,内置了三种 Servlet 容器:Tomcat、Jetty、Undertow ,也就是本文的三位主角。实际生产中,绝大多数情况,使用的都是 Tomcat ,可能很多人,初始学习的都是 Tomcat ,比较偶尔听到 Jetty ,非常小众知道有 Undertow 这个容器。那么,抛出他们的具体实现不说,我们来一起测试一下,它们的性能差别有多少。
为了保持一致,我们还是以 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";
}
}
有一点要注意,JVM 本身有预热的过程,Tomcat、Jetty、Undertow 本也有预热的过程(例如说,线程的初始化),所以需要多次测试,取平均值。
本文,我们使用 jmeter 如下命令进行测试:
Thread: 100 / Ramp-Up: 5S / 持续时间60S
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
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 提升。
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 提升
总结来说,测试的结果,Undertow > Jetty > Tomcat NIO
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。