springhystrix和内置tomcat组件的参数调优解析
1. springboot内置tomcat容器的参数配置
server:
port: 12021
# server端的socket超时间(毫秒),使⽤值-1表⽰没有(即⽆限)超时,默认值为60000(即60秒)
# Tomcat附带的标准l将此值设置为20000(即20秒),除⾮disableUploadTimeout设置为false,否则在读取请求正⽂(如果有)时也会使⽤此超时
connection-timeout: 80000
tomcat:
# URL统⼀编码
uri-encoding: UTF-8
# 处理的最⼤并发请求数,默认值200
max-threads: 1000
# 在给定时间接受和处理的最⼤连接数,默认值10000
max-connections: 20000
# 初始化时创建的最⼩线程数,始终保持运⾏,默认值10
min-spare-threads: 20
# 监听端⼝队列最⼤数,满了之后客户请求会被拒绝(不能⼩于maxSpareThreads),默认为100
acceptCount: 700
# 取消post参数⼤⼩限制,默认为2097152(2M)
max-http-post-size: -1
# 请求和响应HTTP标头的最⼤⼤⼩,以字节为单位指定,如果未指定,则此属性设置为8192(8 KB)
max-http-header-size: 8192(8 KB)
开发中遇到问题,需查询tomcat官⽅⽂档:spring framework网络系统参数
2. spring cloud hystrix的参数hystrixmand.default和hystrix.threadpool.default中的default为默认CommandKey(默认值:当前执⾏⽅法名)
Execution相关的属性的配置:
隔离策略,有THREAD和SEMAPHORE
THREAD - 它在单独的线程上执⾏,并发请求受线程池中的线程数量的限制
SEMAPHORE - 它在调⽤线程上执⾏,并发请求受到信号量计数的限制
ution.isolation.strategy 隔离策略,默认是Thread, 可选Thread|Semaphore
在THREAD模式下,达到超时时间,可以中断
在SEMAPHORE模式下,会等待执⾏完成后,再去判断是否超时
设置标准:有retry,99meantime+avg meantime;没有retry,99.5meantime
ution.isolation.thread.timeoutInMilliseconds 命令执⾏超时时间,默认1000ms
abled 执⾏是否启⽤超时,默认启⽤true
ution.isolation.thread.interruptOnTimeout 发⽣超时是是否中断,默认true(THREAD模式有效)
execution.isolation.thread.interruptOnCancel 当发⽣取消时,执⾏是否应该中断,默认值为false(THREAD模式有效)
ution.isolation.semaphore.maxConcurrentRequests 最⼤并发请求数,默认10,
## 该参数当使⽤ExecutionIsolationStrategy.SEMAPHORE策略时才有效。如果达到最⼤并发请求数,请求会被拒绝。
## 理论上选择semaphore size的原则和选择thread size⼀致,但选⽤semaphore时每次执⾏的单元要⽐较⼩且执⾏速度快(ms级别),否则的话应该⽤thread,semaphore应该占整个容器(tomcat)的线程池的⼀⼩部分
## 只有在⾼并发(单个实例每秒达到⼏百个调⽤)的调⽤时,才需要修改HystrixCommands 的隔离策略为semaphore
Fallback相关的属性:(应⽤于Hystrix的THREAD和SEMAPHORE策略)
hystrixmand.default.fallback.isolation.semaphore.maxConcurrentRequests 如果并发数达到该设置值,请求会被拒绝和抛出异常并且fallback不会被调⽤,默认10
hystrixmand.abled 当执⾏失败或者请求被拒绝,是否会尝试调⽤Fallback(),默认true
Collapser Properties相关参数:
ThreadPool相关参数:
线程数默认值10适⽤于⼤部分情况(有时可以设置得更⼩),如果需要设置得更⼤,那有个基本得公式可以follow:
requests per second at peak when healthy × 99th percentile latency in seconds + some breathing room
每秒最⼤⽀撑的请求数 (99%平均响应时间 + 缓存值)
⽐如:每秒能处理1000个请求,99%的请求响应时间是60ms,那么公式是:1000 * (0.060+0.012)
基本得原则时保持线程池尽可能⼩,主要是为了释放压⼒,防⽌资源被阻塞。当⼀切都是正常的时候,线程池⼀般仅会有1到2个线程激活来提供服务。
hystrix.Size 并发执⾏的最⼤线程数,默认10
hystrix.threadpool.default.maxQueueSize BlockingQueue的最⼤队列数,当设为-1,会使⽤SynchronousQueue,值为正时使⽤LinkedBlcokingQueue。该设置只会在初始化时有效,之后不能修改threadpool的queue size,除⾮reinitialising thread e hystrix.threadpool.default.queueSizeRejectionT
hreshold 即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝。因为maxQueueSize不能被动态修改,这个参数将允许我们动态设置该值。if maxQueueSize == -hystrix.threadpool.default.keepAliveTimeMinutes 如果corePoolSize和maxPoolSize设成⼀样(默认实现)该设置⽆效。如果通过plugin(github/Netflix/Hystrix/wiki/Plugins)使⽤⾃定义实现,该设置才有⽤,默认1.
hystrix.llingStats.timeInMilliseconds 线程池统计指标的时间,默认10000
hystrix.llingStats.numBuckets 将rolling window划分为n个buckets,默认10
实际使⽤中,发现使⽤默认配置,经常报semaphore异常,服务请求被拒绝。⽤压测⼯具jmeter场景复现:
1. 通过gateway访问服务,开100个线程请求,成功率52%;开200个线程请求,成功率39%;开500个线程请求,成功率30%;
2. 不通过⽹关,直接访问服务,开100个线程请求,成功率100%;开200个线程请求,成功率100%;开500个线程请求,成功率49%;
现象解释:
1. springboot默认的tomcat线程池为200,通过直连服务,并发访问的线程在200以下时,请求顺利处理,达到500时,超过了线程数,线程不够⽤,会导致部分请求失败,可通
过超时时间和线程池配置优化;
2. gateway⽹关,配合hystrix访问,因为默认的semaphore是10,并发到100时,信号量处理不过来,就会有⼤量的fallback,并发到200时,同时会导致失效的fallback的内置队
列(默认100个)空间不⾜,抛出异常,并发加到500,异常增多,失败率加⼤;
根据hystrix配置参数的作⽤,优化ution.isolation.semaphore.maxConcurrentRequests=200,压测gateway发现,并发500,成功率为100%,远优
于直接请求。(由于直连接⼝并发调⽤指标⼩于500,综合考虑服务器的承载后,没有测试上限)
结果表明gateway,hystrix的内部调⽤对并发有较好的优化,联合tomcat线程池和hystrix的semaphore.maxConcurrentRequests,能够极⼤的提⾼单机并发性能。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论