Spring Cloud Zuul性能调整

Spring Cloud 版本:java

Dalston.SR5

这两天经过JMeter测了一下Spring Cloud Zuul的性能,用的是两台虚机8核8G和4核8G,宿主机是10核逻辑20核,代理的服务简单的返回字符串hello,vm堆内存1G够用nginx

 

先说一下测试状况,值得一提的是测试并不严谨,由于用的是虚机,而且虚机上还跑了一些其它的东西,因此不能做为最终指导,仅供参考。web

 

8核心的状况下:spring

zuul的性能约是nginx(8个worker)的75%,tomcat

nginx 8个worker 的cup总占用率为360%(有点奇怪)并发

zuul 占用750%spring-boot

 

4核的状况下:性能

zuul大约是nginx(4个worker)性能的40%,测试

nginx的cup总占用率为320%spa

zuul占用380%

 

奇怪的现象:

nginx在4核下吞吐2W,8核下吞吐1W6,不增反降,具体不知道为何(2019年1月30日追加:这是由于随着worker进程的增长,nginx的master进程调度能力跟不上了)。

测试zuul的时候,前几回性能比较低,到后边就比较稳定和高效了,可能和JIT有关,也多是线程建立的比较慢,线程默认寿命是一分钟。

—————————————————————————————————分割线———————————————————————————————————————

Zuul默认是使用信号量隔离,而且信号量的大小是100,请求的并发线程超过100就会报错

能够调大该信号量的最大值来提升性能,配置以下:

zuul:
  semaphore:
    max-semaphores: 5000

 

也能够改成使用线程隔离,调大hystrix线程池线程大小,该线程池默认10个线程,配置以下:

zuul:
  ribbonIsolationStrategy: THREAD

hystrix:
  threadpool:
    default:
      coreSize: 100
      maximumSize: 400
      allowMaximumSizeToDivergeFromCoreSize: true
      maxQueueSize: -1
maximumSize:最大线程数量

allowMaximumSizeToDivergeFromCoreSize:是否让maximumSize生效,false的话则只有coreSize会生效
maxQueueSize:线程池的队列大小,-1表明使用SynchronousQueue队列


默认配置均可以去HystrixThreadPoolProperties和ZuulProperties这两个java文件中查找


2018年8月31日追加:
Zuul使用的内置容器默认是Tomcat,能够将其换成undertow,能够显著减小线程的数量,替换方式即在pom中添加如下内容:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

 





再来一篇比较靠谱的文章:
https://www.sohu.com/a/221110905_467759
Spring Cloud Zuul作网关,这性能我只能说凑合,不过它提供了比nginx更多的便利。不行就多部署几个Zuul。
相关文章
相关标签/搜索