Spring Boot 内置容器 优化指南
0. 基础
具体的配置参考 common-application
1. 使 用Tomcat作为内置容器
tomcat的影响性能的配置项是:
server.tomcat.max-connections=0 # 最 大链接数
server.tomcat.max-threads=0 # 工作线程数
内置tomcat容器 采 用的是BIO (one thread per connection) 模型,所以针对不不同的配置业务和情况需要将这个值设置。
除了了上述的值之外
server.tomcat.accept-count=0 # 队列列最 大值
acceptCount是当线程数达到maxThreads后,后续请求会被放 入 一个等待队列列,这个acceptCount是这个队列列的 大 小,如果这个队列列也满了了,就直接refuse connection。
2. 使 用Undertow作为内置容器 [推荐]
undertow的性能配置项是:
server.undertow.io-threads=4 # 设置IO线程数, 它主要执 行行 非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核 心 一个线程
server.undertow.worker-threads=20 # 阻塞任务线程池, 当执 行行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
server.undertow.buffer-size=1024 # 每块buffer的空间 大 小,越 小的空间被利利 用越充分,块多了了但是会变慢
server.undertow.buffers-per-region=1024 # 每个区分配的buffer数量量 , 所以pool的 大 小是buffer-size *buffers-per-region
server.undertow.direct-buffers=true # 是否分配的直接内存
针对以上配置 server.undertow.worker-threads 类似于 server.tomcat.max-threads 这个值建议根据系统配置设置,server.undertow.direct-buffers建议开启可以使 用堆外内存减少byte数组的回收开销。
关于 tomcat 和 undertow 和 jetty 的测试性能可以参考 tomcat-vs-jetty-vs-undertow, 简 而 言之,undertow 会有更更好的性能表现。
3. Spring Zuul 性能调优
Undertow 和 Tomcat 作为外部请求的接受者,Zuul更更多的作为转发 方,影响Zuul的性能参数主要集中在转发上:
zuul.host.maxTotalConnections #适 用于ApacheHttpClient,如果是okhttp 无效。每个服务的http客户端连接池最 大连接,默认是200.
zuul.host.maxPerRouteConnections # 适 用于ApacheHttpClient,如果是okhttp 无效。每个route可 用的最 大连接数,默认值是20。
zuul.semaphore.max-semaphores #Hystrix最 大的并发请求
execution.isolation.semaphore.maxConcurrentRequests,这个值并 非TPS、QPS、RPS等都是相对值,指的是1秒时间窗 口内的事务/查询/请求,semaphore.maxConcurrentRequests是 一个绝对值, 无时间窗 口,相当于亚毫秒级的。当请求达到或超过该设置值后,其其余就会被拒绝。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds # 用来设置thread和semaphore两种隔离策略略的超时时间,默认值是1000。
ribbon 参数调优
ribbon.MaxAutoRetries #最 大重试次数
ribbon.ConnectTimeout #连接接超时时间 ribbon.ReadTimeout #连接读取超时时间
主要是ConnectTimeout和ReadTimeout2个参数,最终会设置到http Client中,注意这个参数很重要了了,会配合execution.isolation.thread.timeoutInMilliseconds 一起来 用,多少合适要根据微服务实际情况来定:
太 小:会导致很多正常业务失败.
太 大:会导致实际的熔断效果很差,严重会导致雪崩。