SpringCloud性能参数调优

一、zuul并发调优

zuul默认是使用semaphore隔离,并且最大的并发默认是10

1、修改隔离策略

默认情况下推荐使用 thread 隔离策略

线程池提供了比信号量更好的隔离机制,并且从实际测试发现高吞吐场景下可以完成更多的请求。但是信号量隔离的开销更小,对于本身就是10ms以内的系统,显然信号量更合适

zuul:
 ribbon-isolation-strategy: thread
 ribbon:
 threadPool:
 useSeparateThreadPools: true
 threadPoolKeyPrefix: api-gateway

ribbon-isolation-strategy:修改线程隔离策略useSeparateThreadPools:让每个路由使用独立的线程池threadPoolKeyPrefix:线程池前缀

2、Hystric熔断器并发调优

  • 我们知道Hystrix线程池的大小和超时时间我们都是可以设置的,线上环境,我们需要对这些参数进行调整,该如何调整呢?
  • 假设你的系统B,预计QPS是30,每秒请求响应时间是200ms,那么可以算出30*0.2=6,然后再加点缓冲空间,比如4,那么总共就是6+4=10的线程数量,当然这个4你可以自己调整,这是为了防止突然增大的流量给个缓冲的余地
  • 当然这个缓存增加的线程数量对设置超时时间是有参考意义的,比如上面我如果设置了10条线程,此时的超时时间该设置多少?并不是越多越好哦,应该是这么算:10/30=0.333,那么也就是在300ms左右,10是线程池数目,30是你预计的QPS。
  • 想象下,如果超时时间设为500ms,当很多请求都变为500ms时,也就是10/0.5=20,你的QPS变成了20,那么多余的请求就不会不断堆积,导致线程卡死,线程卡死后的恢复速度会是比较慢的,所以要合理设置线程池和超时时间。

修改熔断器的线程数量,注意线程数不是越多越好

hystrix:
 threadpool:
 default:
 coreSize: 100
 maximumSize: 2000
 allowMaximumSizeToDivergeFromCoreSize: true
 maxQueueSize: -1
 command:
 default:
 execution:
 isolation:
 thread:
 timeoutInMilliseconds: 60000

allowMaximumSizeToDivergeFromCoreSize:允许maximumSize起作用maxQueueSize:如该值为-1,那么使用的是SynchronousQueue,否则使用的是LinkedBlockingQueuetimeoutInMilliseconds:断路器的超时时间;如果ribbon配置了重试那么该值必需大于ribbonTimeout,重试才能生效

3、使用Undertow代替Tomcat

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器,可以将 Web 服务器切换到 Undertow 来提高应用性能,Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器

Untertow 的特点:

  • 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念,它由两个核心 Jar 包组成,加载一个 Web 应用可以小于 10MB 内存
  • Servlet3.1 支持:它提供了对 Servlet3.1 的支持
  • WebSocket 支持:对 Web Socket 完全支持,用以满足 Web 应用巨大数量的客户端
  • 嵌套性:它不需要容器,只需通过 API 即可快速搭建 Web 服务

3.1、移除Tomcat 依赖

<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>

3.2、增加Untertow 依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

3.3、配置文件加上Untertow的配置

server:
 undertow:
 io-threads: 16
 worker-threads: 256
 buffer-size: 1024
 direct-buffers: true

io-threads:设置IO线程数,它主要执行非阻塞的任务,默认会取值cpu核心worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作会从这个线程池中取得线程,默认值是IO线程数*8buffer-size:设置buffer大小,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理direct-buffers:是否分配的直接内存(NIO直接分配的堆外内存)

二、Feign参数调优

1、替换OKHttp

在默认情况下 spring cloud feign在进行各个子服务之间的调用时,http组件使用的是jdk的HttpURLConnection,没有使用线程池。

有2种可选的线程池:HttpClient和OKHttp

比较推荐OKHttp,请求封装的非常简单易用,性能也很ok。

1.1、添加依赖

<dependency>
 <groupId>com.squareup.okhttp3</groupId>
 <artifactId>okhttp</artifactId>
</dependency>

1.2、修改配置文件

feign:
 okhttp:
 enabled: true
 httpclient:
 enabled: false
 max-connections: 1000 #默认值200 
 max-connections-per-route: 100 #默认值50

max-connections:最大连接数max-connections-per-route:每个url的连接数

2、开启Feign请求响应压缩

开启压缩可以有效节约网络资源,但是会增加CPU压力,建议把最小压缩的文档大小适度调大一点

## 开启Feign请求响应压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
## 配置压缩文档类型及最小压缩的文档大小
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048

三、Ribbon参数调优

主要调整请求的超时时间,是否重试

如果业务没有做幂等性的话建议把重试关掉ribbon.MaxAutoRetriesNextServer=0

## 从注册中心刷新servelist的时间 默认30秒,单位ms
ribbon.ServerListRefreshInterval=15000
## 请求连接的超时时间 默认1秒,单位ms
ribbon.ConnectTimeout=30000
## 请求处理的超时时间 默认1秒,单位ms
ribbon.ReadTimeout=30000
## 对所有操作请求都进行重试,不配置这个MaxAutoRetries不起作用 默认false
#ribbon.OkToRetryOnAllOperations=true
## 对当前实例的重试次数 默认0
#ribbon.MaxAutoRetries=1
## 切换实例的重试次数 默认1
ribbon.MaxAutoRetriesNextServer=0

如果MaxAutoRetries=1和MaxAutoRetriesNextServer=1请求在1s内响应,超过1秒先同一个服务器上重试1次,如果还是超时或失败,向其他服务上请求重试1次。那么整个ribbon请求过程的超时时间为:ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1)

四、JVM参数调优

关于Jvm调优Oracle官网有一份指导说明:
Oracle官网对Jvm调优的说明
有兴趣大家可以去看看。

执行启动设置Jvm参数的操作。

java   -Xms1024m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m  -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC    -jar   test-1.0.0.jar

关于这些设置的JVM参数是什么意思,请参考第二步中的oracle官方给出的调优文档。我在这边简单说一下:

-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)


 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值