1. springboot内置tomcat容器的参数配置
server:
port: 12021
# server端的socket超时间(毫秒),使用值-1表示没有(即无限)超时,默认值为60000(即60秒)
# Tomcat附带的标准server.xml将此值设置为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官方文档: http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#HTTP/1.1_and_HTTP/1.0_Support

2. spring cloud hystrix的参数hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey(默认值:当前执行方法名)
Execution相关的属性的配置:
隔离策略,有THREAD和SEMAPHORE
THREAD - 它在单独的线程上执行,并发请求受线程池中的线程数量的限制
SEMAPHORE - 它在调用线程上执行,并发请求受到信号量计数的限制
hystrix.command.default.execution.isolation.strategy 隔离策略,默认是Thread, 可选Thread|Semaphore
在THREAD模式下,达到超时时间,可以中断
在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时
设置标准:有retry,99meantime+avg meantime;没有retry,99.5meantime
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 命令执行超时时间,默认1000ms
hystrix.command.default.execution.timeout.enabled 执行是否启用超时,默认启用true
hystrix.command.default.execution.isolation.thread.interruptOnTimeout 发生超时是是否中断,默认true(THREAD模式有效)
execution.isolation.thread.interruptOnCancel 当发生取消时,执行是否应该中断,默认值为false(THREAD模式有效)
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests 最大并发请求数,默认10,
## 该参数当使用ExecutionIsolationStrategy.SEMAPHORE策略时才有效。如果达到最大并发请求数,请求会被拒绝。
## 理论上选择semaphore size的原则和选择thread size一致,但选用semaphore时每次执行的单元要比较小且执行速度快(ms级别),否则的话应该用thread,semaphore应该占整个容器(tomcat)的线程池的一小部分
## 只有在高并发(单个实例每秒达到几百个调用)的调用时,才需要修改HystrixCommands 的隔离策略为semaphore
Fallback相关的属性:(应用于Hystrix的THREAD和SEMAPHORE策略)
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 如果并发数达到该设置值,请求会被拒绝和抛出异常并且fallback不会被调用,默认10
hystrix.command.default.fallback.enabled 当执行失败或者请求被拒绝,是否会尝试调用hystrixCommand.getFallback(),默认true Collapser Properties相关参数:
hystrix.collapser.default.maxRequestsInBatch 单次批处理的最大请求数,达到该数量触发批处理,默认Integer.MAX_VALUE
hystrix.collapser.default.timerDelayInMilliseconds 触发批处理的延迟,也可以为创建批处理的时间+该值,默认10
hystrix.collapser.default.requestCache.enabled 是否对HystrixCollapser.execute() and HystrixCollapser.queue()的cache,默认true 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.threadpool.default.coreSize 并发执行的最大线程数,默认10
hystrix.threadpool.default.maxQueueSize BlockingQueue的最大队列数,当设为-1,会使用SynchronousQueue,值为正时使用LinkedBlcokingQueue。该设置只会在初始化时有效,之后不能修改threadpool的queue size,除非reinitialising thread executor。默认-1。
hystrix.threadpool.default.queueSizeRejectionThreshold 即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝。因为maxQueueSize不能被动态修改,这个参数将允许我们动态设置该值。if maxQueueSize == -1,该字段将不起作用
hystrix.threadpool.default.keepAliveTimeMinutes 如果corePoolSize和maxPoolSize设成一样(默认实现)该设置无效。如果通过plugin(https://github.com/Netflix/Hystrix/wiki/Plugins)使用自定义实现,该设置才有用,默认1.
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds 线程池统计指标的时间,默认10000
hystrix.threadpool.default.metrics.rollingStats.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配置参数的作用,优化hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=200,压测gateway发现,并发500,成功率为100%,远优于直接请求。(由于直连接口并发调用指标小于500,综合考虑服务器的承载后,没有测试上限)

结果表明gateway,hystrix的内部调用对并发有较好的优化,联合tomcat线程池和hystrix的semaphore.maxConcurrentRequests,能够极大的提高单机并发性能。

spring hystrix和内置tomcat组件的参数调优解析的更多相关文章

  1. Spring Boot修改内置Tomcat端口号 (zhuan)

    http://blog.csdn.net/argel_lj/article/details/49851625 ********************************************* ...

  2. Spring Boot修改内置Tomcat端口号

    spring Boot 内置Tomcat默认端口号为8080,在开发多个应用调试时很不方便,本文介绍了修改 Spring Boot内置Tomcat端口号的方法. 一.EmbeddedServletCo ...

  3. (一)Spring Boot修改内置Tomcat端口号--解决tomcat端口被占用的问题

    Spring Boot 内置Tomcat默认端口号为8080,在开发多个应用调试时很不方便,本文介绍了修改 Spring Boot内置Tomcat端口号的方法. 一.EmbeddedServletCo ...

  4. Spring Boot:内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...

  5. Tomcat项目内存参数调优

    一.常见的Java内存溢出有以下三种: 1. Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:JVM在启动的时候会自动设置JV ...

  6. Windows及Linux环境下Tomcat的JVM参数调优

    Windows环境: catalina.bat文件修改 set JAVA_OPTS=-server -Xms4096m -Xmx4096m -XX:PermSize=512m -XX:MaxPermS ...

  7. Spring boot 内置tomcat禁止不安全HTTP方法

    Spring boot 内置tomcat禁止不安全HTTP方法 在tomcat的web.xml中可以配置如下内容,让tomcat禁止不安全的HTTP方法 <security-constraint ...

  8. Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析

    目录 1.问题 2.1. 为什么需要使用这个/tmp/tomcat*? 2.2.那个 /tmp/tomcat* 目录为什么不存在? 三.解决办法 修改 springboot 配置,不要在/tmp 下创 ...

  9. springboot禁用内置Tomcat的不安全请求方法

    起因:安全组针对接口测试提出的要求,需要关闭不安全的请求方法,例如put.delete等方法,防止服务端资源被恶意篡改. 用过springMvc都知道可以使用@PostMapping.@GetMapp ...

随机推荐

  1. mybatis关于级联查询结果集嵌套映射对象非列表的处理问题

    工作中遇到这么一个问题,嵌套查询,返回json的时候,作为属性,deviceFields是一个device中的一个对象属性,在json返回的时候想要得到的应该是deviceFields:{ 具体属性} ...

  2. 计算机操作系统学习(一) Linux常用指令(随时更新)

    1.chmod 以下转载至https://blog.csdn.net/summer_sy/article/details/70142475 chmod u+x file.sh 就表示对当前目录下的fi ...

  3. 安装完CUDA Toolkit,VS2010调试项目控制台一闪而过

    选择菜单栏的调试>>开始执行(不调试),就不一闪而过:

  4. 动态添加,删除class样式

    function hasClass(obj, cls) { //class位于单词边界,判断class样式是否已经存在 return obj.className.match(new RegExp('( ...

  5. UVA - 11582 Colossal Fibonacci Numbers! (巨大的斐波那契数!)

    题意:输入两个非负整数a.b和正整数n(0<=a,b<264,1<=n<=1000),你的任务是计算f(ab)除以n的余数,f(0) = 0, f(1) = 1,且对于所有非负 ...

  6. MFC双缓冲

    大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板: <1>普通绘图就是直接在我们看得到的黑板上绘图 <2>双缓冲就是先在一 ...

  7. JAVAEE 和项目开发(第六课:服务器的安装和目录介绍和闪退解决办法)

    课程介绍: 在学习了 HTTP 协议后,我们对浏览器和服务器的交互流程以及规范有了一定程度的认知,并也有了自己的理解.但是不少同学对服务器的概念还是有些模糊的,那么本节课就针对服务器进行介绍,我们一起 ...

  8. 【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码

    文章目录 1.改进约会网站匹配效果 1.1 准备数据:从文本文件中解析数据 1.2 分析数据:使用Matplotlib创建散点图 1.3 准备数据:归一化特征 1.4 测试算法:作为完整程序验证分类器 ...

  9. Relu激活函数的优点

    Relu优点: 1.可以使网络训练更快. 相比于sigmoid.tanh,导数更加好求,反向传播就是不断的更新参数的过程,因为其导数不复杂形式简单. 2.增加网络的非线性. 本身为非线性函数,加入到神 ...

  10. Invalid bound statement (not found): com.xxxx.dao.other.LoginDao.getUser"

    原来是能正常运行的,后想把登录相关的调整一下目录,对应登录的文件都调整到了other下边,启动服务,请求时报错: Invalid bound statement (not found): com.xx ...