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。
相關文章
相關標籤/搜索