赞
踩
基于Maven新建一个SpringBoot项目并提供一个查询接口,每调用一次这个接口都会调用一次Mysql进行查询
部署在腾讯云服务器(配置1核 2G 5M带宽)
Jmeter 1000并发循环30次测试 吞吐量 612左右
通过命令查看tomcat在没有丝毫压力的情况下内部自动维护了28个线程池的线程数量
此时对这个项目进行jmeter压测,发现tomcat在压测的情况下线程数量升到了218,并且压测完毕后线程数量回到了28
并发上不去,其实最大的原因就是server上面的配置有问题,导致并发数据上不去,直接服务被拒绝连接,server端的并发线程数上不去,导致tps容量上不去,导致客户端被拒绝连接之后,发生了各种各样的一些问题。
怎么配置tomcat,才能使得自己的服务效率更高呢?
这个和tomcat的使用的IO模式有关,也和tomcat的配置参数有关。
尤其是尤tomcat的这三个配置项:maxConnections、maxThreads、acceptCount
这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。maxConnections和accept-count的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200,肯定建议增加。但是,增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程异味着需要更多的内存。线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。
当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。详细的来说:当调用HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。
优化tomcat配置
- server:
- port: 8082
- tomcat:
- #最大工作线程数默认200 线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。
- #操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。
- max-threads: 200
- # 等待队列长度,默认100(当等待队列长度超过配置的数值时就拒绝访问)
- accept-count: 1000
- # 最小工作空闲线程数,默认10, 适当增大一些,以便应对突然增长的访问量
- min-spare-threads: 100
再次上传至腾讯云服务器压测Jmeter 1000并发循环30次测试 吞吐量 672左右
修改配置后tomcat在无压力的情况下自动维护118个线程,在压测的过程中维护218个线程
Jmeter 10000并发循环30次测试,超出的连接直接被拒绝
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。