1、本次对比基础环境信息如下:
 
    springboot版本1.5.10
 
    centos虚机4c6G,版本7.4
 
    centos实机2u16c40G,版本7.4,虚机运行在实机上
 
    ab版本2.3
 
    jprofiler版本9.1.1
 
2、压测接口说明
 
    天花板:指的是一个空接口,没有任何实现,直接返回,如
 
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void test() {
		
}
 
    服务接口:指的是具有一定业务代码的接口,连接数据库/Redis然后返回json数据
 
    异步接口:指的是开启了http异步
 
3、压测过程
 
    JETTY
 
    先以Jetty开始,这里通过优化参数来不断摸底。以下是参数说明:
 
        jettyMin:最小连接数
 
        jettyMax:最大连接数
 
        mvcCore:线程池core数量
 
        mvcMax:线程池最大量
 
        mvcQueue:线程池队列大小
 
    大致结果如下:
 
 
  
   
   | JETTY天花板(无异步) | 
 
   
   | jettyMin | 50 | 100 | 200 | 300 | 
 
   
   | jettyMax | 600 | 600 | 600 | 600 | 
 
   
   | mvcCore | 50 | 50 | 50 | 50 | 
 
   
   | mvcMax | 200 | 200 | 200 | 200 | 
 
   
   | mvcQueue | 100 | 100 | 100 | 100 | 
 
   
   | 结果 | 2090 | 2116 | 2374 | 2100 | 
 
  
 
 
 
 
  
   
   | JETTY天花板(无异步) | 
 
   
   | jettyMax | 400 | 600 | 800 | 
 
   
   | jettyMin | 200 | 200 | 200 | 
 
   
   | mvcCore | 50 | 50 | 50 | 
 
   
   | mvcMax | 200 | 200 | 200 | 
 
   
   | mvcQueue | 100 | 100 | 100 | 
 
   
   | 结果 | 1655 | 2170 | 2000 | 
 
  
 
 
  
   
   | JETTY天花板(异步) | 
 
   
   | jettyMax | 600 | 600 | 600 | 
 
   
   | jettyMin | 200 | 200 | 200 | 
 
   
   | mvcCore | 50 | 100 | 200 | 
 
   
   | mvcMax | 200 | 200 | 200 | 
 
   
   | mvcQueue | 100 | 100 | 100 | 
 
   
   | 结果 | 1500 | 1600 | 1450 | 
 
  
 
 
 
 
  
   
   | JETTY天花板(异步) | 
 
   
   | jettyMax | 600 | 600 | 600 | 
 
   
   | jettyMin | 200 | 200 | 200 | 
 
   
   | mvcCore | 100 | 100 | 100 | 
 
   
   | mvcMax | 200 | 400 | 600 | 
 
   
   | mvcQueue | 100 | 100 | 100 | 
 
   
   | 结果 | 1600 | 1700 | 1550 | 
 
  
 
 
  
   
   | JETTY天花板(异步) | 
 
   
   | jettyMax | 600 | 600 | 600 | 
 
   
   | jettyMin | 200 | 200 | 200 | 
 
   
   | mvcCore | 100 | 100 | 100 | 
 
   
   | mvcMax | 400 | 400 | 400 | 
 
   
   | mvcQueue | 100 | 200 | 300 | 
 
   
   | 结果 | 1600 | 1700 | 1600 | 
 
  
 
     以下是通过工具预估最佳线程数,然后修改优化参数的结果:
 
 
  
   
   | JETTY天花板(无异步) | 
 
   
   | jettyMax | 600 | 52 |  | 
 
   
   | jettyMin | 200 | 52 |  | 
 
   
   | mvcCore | 52 | 52 |  | 
 
   
   | mvcMax | 52 | 52 |  | 
 
   
   | mvcQueue | 199 | 199 |  | 
 
   
   | 结果 | 1520 | 1600 |  | 
 
  
 
 
  
   
   | JETTY业务接口(异步) | 
 
   
   | jettyMax | 600 |  |  | 
 
   
   | jettyMin | 200 |  |  | 
 
   
   | mvcCore | 52 |  |  | 
 
   
   | mvcMax | 52 |  |  | 
 
   
   | mvcQueue | 199 |  |  | 
 
   
   | 结果 | 1719 |  |  | 
 
  
 
 
  
   
   | JETTY业务接口(无异步) | 
 
   
   | jettyMax | 600 |  |  | 
 
   
   | jettyMin | 200 |  |  | 
 
   
   | mvcCore | 52 |  |  | 
 
   
   | mvcMax | 52 |  |  | 
 
   
   | mvcQueue | 199 |  |  | 
 
   
   | 结果 | 2000 |  |  | 
 
  
 
    通过以上结果发现一个问题,开启异步HTTP后压测的结果均不如不开启HTTP异步的结果。
 
    TOMCAT
 
    通过切换成tomcat再按照以上过程压测,发现HTTP和tomcat才是天生一对,组合压测下的结果和Jetty不开启异步的结果差不多。这里不再重复贴出数据表格。
 
    UNDERTOW
 
    通过Jetty和tomcat的压测结果发现,HTTP异步并不一定会提升程序性能,只有在特定的条件下才会起到正面的效果,如应用服务器为非NIO时。而undertow和jetty一样是NIO,所以这里不再对比异步非异步,直接只测非异步。优化参数只有两个:
 
    ioThreads:cpu核数
 
    workerThreads:工作线程数(可以通过工具预估出来)
 
    以下是数据。
 
 
  
   
   | UNDERTOW业务接口(无异步) | 
 
   
   | ioThreads | 4 |  |  | 
 
   
   | workerThreads | 52 |  |  | 
 
   
   |  |  |  |  | 
 
   
   |  |  |  |  | 
 
   
   |  |  |  |  | 
 
   
   | 结果 | 2200 |  |  | 
 
  
 
 
  
   
   | UNDERTOW天花板(无异步) | 
 
   
   | ioThreads | 4 |  |  | 
 
   
   | workerThreads | 52 |  |  | 
 
   
   |  |  |  |  | 
 
   
   |  |  |  |  | 
 
   
   |  |  |  |  | 
 
   
   | 结果 | 3100 |  |  | 
 
  
 
    4、jprofiler图标对比
 
    jetty
 

 

 
    tomcat
 

 

 
        UNDERTOW
 

 

 
5、附最佳线程数预估工具
 
    GITHUB地址https://github.com/sunshanpeng/dark_magic  原文博客:http://ifeve.com/how-to-calculate-threadpool-size/
 
    Undertow使用&优化:https://www.jianshu.com/p/e625b8aa0e80