技术栈

Tomcat 、Jetty 和 Undertow 对比测试

2018-11-18  本文已影响504人  anyesu

背景


最近在做压测, 同事觉得 Tomcat 不行想要切换 web 服务器, 于是我就去网上搜了一些测评结果, 不出意外 Tomcat 得到了一致的差评。抱着怀疑的态度, 我决定对 SpringBoot 内嵌支持的三款 Servlet容器 ( TomcatJettyUndertow ) 做一个简单的对比测试 , 测试结果仅供参考

测试环境


项目 描述
测试端主机 阿里云ECS(ecs.sn1ne.2xlarge) 8C16G CentOS7.4.1708 Linux Kernel 3.10.0
被测端主机 阿里云ECS(ecs.sn1ne.2xlarge) 8C16G CentOS7.4.1708 Linux Kernel 3.10.0
网络环境 阿里云专有网络 内网带宽: 2Gbps
测试工具 wrk
项目框架 SpringBoot 1.5.10.RELEASE
JDK 1.8.0_191 Java HotSpot(TM) 64-Bit Server VM
测试容器 Tomcat Jetty Undertow

说明:

测试方法


使用最简单的 HTTP 接口, 不包含任何业务逻辑和数据库操作, 反映容器的极致性能

@RestController
@RequestMapping("/api")
public class TestController {

    @RequestMapping("/test")
    public String test() {
        return "This is a test result.";
    }

}

使用 wrk 5000 并发下持续压测 10 分钟 ( 超时时间设为 30s , 避免超时时间过短带来的大量错误 )

./wrk -t 8 -c 5000 -d 10m -T 30s "http://yourhostip:3000/api/test"

说明:

测试结果


Tomcat 8.0.53 NIO 模式

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -jar servlet-test-tomcat-8-nio.jar
wrk 的 CPU 使用率: 161.3% ( 最大 800% )
Server 的 CPU 使用率: 52.4 us, 13.0 sy,  0.0 ni, 16.8 id,  0.0 wa,  0.0 hi, 17.8 si,  0.0 st
Server GC 情况:YGC: 870 YGCT: 5.3 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    86.31ms    7.23ms 778.24ms   88.50%
    Req/Sec     7.25k   420.33    14.55k    72.93%
  34639518 requests in 10.00m, 5.33GB read
  Socket errors: connect 0, read 1253, write 2928, timeout 0
Requests/sec:  57726.28
Transfer/sec:      9.09MB

Tomcat 8.5.34 NIO 模式

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -jar servlet-test-tomcat-8.5-nio.jar
wrk 的 CPU 使用率: 132.3% ( 最大 800% )
Server 的 CPU 使用率: 60.2 us, 14.1 sy,  0.0 ni, 19.1 id,  0.0 wa,  0.0 hi,  6.5 si,  0.0 st
Server GC 情况:YGC: 940 YGCT: 5.736 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    83.43ms    9.79ms   1.70s    96.22%
    Req/Sec     7.51k   408.60    14.48k    73.85%
  35852565 requests in 10.00m, 4.55GB read
  Socket errors: connect 0, read 1165, write 2883, timeout 0
Requests/sec:  59745.50
Transfer/sec:      7.76MB

Tomcat 8.0.53 APR 模式 ( 服务器上需要安装 apr 类库 )

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -Djava.library.path=/usr/local/apr/lib -jar servlet-test-tomcat-8-apr.jar
wrk 的 CPU 使用率: 183.4% ( 最大 800% )
Server 的 CPU 使用率: 69.5 us, 13.7 sy,  0.0 ni,  3.7 id,  0.0 wa,  0.0 hi, 13.1 si,  0.0 st
Server GC 情况:YGC: 1224 YGCT: 6.251 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    61.71ms   71.59ms   7.29s    99.87%
    Req/Sec    10.36k   441.68    18.63k    78.23%
  49480257 requests in 10.00m, 7.61GB read
  Socket errors: connect 0, read 1388, write 814, timeout 0
Requests/sec:  82453.62
Transfer/sec:     12.99MB

Jetty 9.4.8.v20171121

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -jar servlet-test-jetty.jar
wrk 的 CPU 使用率: 11.3% ( 最大 800% )
Server 的 CPU 使用率: 98.6 us,  0.5 sy,  0.0 ni,  0.5 id,  0.0 wa,  0.0 hi,  0.4 si,  0.0 st
Server GC 情况:YGC: 640 YGCT: 6.541 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   126.01ms  435.50ms  29.95s    90.64%
    Req/Sec   206.88    127.12     1.03k    70.75%
  978373 requests in 10.00m, 128.76MB read
  Socket errors: connect 0, read 95571, write 7191, timeout 331
Requests/sec:   1630.39
Transfer/sec:    219.72KB

Undertow 1.4.22.Final

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -jar servlet-test-undertow.jar
wrk 的 CPU 使用率: 32.6% ( 最大 800% )
Server 的 CPU 使用率: 93.6 us,  2.4 sy,  0.0 ni,  1.5 id,  0.0 wa,  0.0 hi,  2.5 si,  0.0 st
Server GC 情况:YGC: 370 YGCT: 1.684 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   354.95ms  138.95ms   1.93s    75.08%
    Req/Sec     1.77k   199.04     4.19k    72.85%
  8471058 requests in 10.00m, 1.28GB read
  Socket errors: connect 0, read 1601, write 2882, timeout 0
Requests/sec:  14117.10
Transfer/sec:      2.18MB

Undertow 1.4.22.Final 配置线程数

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -Dserver.undertow.io-threads=16 -Dserver.undertow.worker-threads=256 -jar servlet-test-undertow.jar
wrk 的 CPU 使用率: 33.3% ( 最大 800% )
Server 的 CPU 使用率: 92.1 us,  2.4 sy,  0.0 ni,  2.3 id,  0.0 wa,  0.0 hi,  3.2 si,  0.0 st
Server GC 情况:YGC: 367 YGCT: 2.23 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   391.49ms  333.83ms   3.23s    60.47%
    Req/Sec     1.76k   235.55     4.51k    69.41%
  8389131 requests in 10.00m, 1.27GB read
  Socket errors: connect 0, read 3987, write 3486, timeout 0
Requests/sec:  13980.36
Transfer/sec:      2.16MB

Undertow 2.0.15.Final

java -Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k -jar servlet-test-undertow2.jar
wrk 的 CPU 使用率: 31.6% ( 最大 800% )
Server 的 CPU 使用率: 90.0 us,  2.6 sy,  0.0 ni,  4.1 id,  0.0 wa,  0.0 hi,  3.3 si,  0.0 st
Server GC 情况:YGC: 361 YGCT: 2.676 FGC:0
Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   368.09ms   17.14ms 942.66ms   97.28%
    Req/Sec     1.70k   164.17     4.01k    76.01%
  8118614 requests in 10.00m, 1.22GB read
  Socket errors: connect 0, read 686, write 1453, timeout 0
Requests/sec:  13530.04
Transfer/sec:      2.09MB

测试结果分析


Servlet 容器 QPS QPS / GC 次数
Tomcat 8.0.53 NIO 模式 57726.28 57726.28/870=66.352
Tomcat 8.5.34 NIO 模式 59745.50 59745.50/940=63.559
Tomcat 8.0.53 APR 模式 82453.62 ( 最优 ) 82453.62/1224=67.364
Jetty 9.4.8.v20171121 1630.39 ( 最差 ) 1630.39/640=2.547
Undertow 1.4.22.Final 14117.10 14117.10/370=38.154
Undertow 1.4.22.Final 配置线程数 13980.36 13980.36/367=38.094
Undertow 2.0.15.Final 13530.04 13530.04/361=37.479

优化


结语



转载请注明出处:https://www.jianshu.com/p/f7cb40a8ce22

上一篇 下一篇

猜你喜欢

热点阅读