Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
在上周三下午时,客户、业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的连接数使用完了,于是重启了服务,客户访问都恢复正常。虽然问题暂时解决了,但实质原因还无法确定。根据分析,判断是spring boot服务连接被拒绝,查看配置的最大连接数和最大线程数时,配置为:
#最大连接数
server.tomcat.max-connections=300
#最大线程数
server.tomcat.max-threads=200
为了验证自己的分析,于是将最大连接数和最大线程数都设置为3,如下:
#最大连接数
server.tomcat.max-connections=3
#最大线程数
server.tomcat.max-threads=3
启动服务后,打开4个浏览器(IE、google、火狐、360),在这4个浏览器中,登录IE、google和火狐后,再登录360浏览器时,生产环境的场景复现了;重启服务,再先登录360、火狐、IE后,再登录google时,生产环境的场景同样复现了。
由此断定,spring boot中内嵌的tomcat的最大连接数达到最大值后,在没有连接数释放的情况下,新的请求会被服务器拒绝,即测试验证中第4个浏览器进入不了系统的原因。
由于公司该企业级服务系统的上线,用户量远少于300,就很奇怪连接数为何会被耗尽。
经过进一步排查,是由于系统上线后,用户的登录,支持多个用户共用一个账号,同时单个用户的会话有效期设置为了3天,客户之前在系统中出现过浏览器兼容性问题导致一个客户在一台电脑的多个浏览器上登录,另外业务人员、测试人员都在上面验证着客户的问题,都在占用着连接数,综合以上因素,导致了该系统上300个连接数被耗尽了。
为了解决这个问题,必须对tomcat的最大连接数等参数做优化设置。查询了tomcat的常用参数,其中最大连接数、最大线程数和最大等待数信息如下 :
1)maxThreads(最大线程数)
每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求,该参数决定了应用服务同时可以处理多少个HTTP请求,tomcat默认为200;
2)accepCount(最大等待数)
当调用Web服务的HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100.如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused);
3)maxConnections(最大连接数)
这个参数是指在同一时间,tomcat能够接受的最大连接数。一般这个值要大于maxThreads+acceptCount。
根据公司用户量及机器配置信息,公司的最大连接数、最大线程数和最大等待数优化为:
#最大连接数
server.tomcat.max-connections=2000
#最大线程数
server.tomcat.max-threads=1000
#最大等待数
server.tomcat.accept-count=800
1)maxThreads(最大线程数)
每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求,该参数决定了应用服务同时可以处理多少个HTTP请求,tomcat默认为200;
2)accepCount(最大等待数)
当调用Web服务的HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100.如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused);
3)maxConnections(最大连接数)
这个参数是指在同一时间,tomcat能够接受的最大连接数。一般这个值要大于maxThreads+acceptCount。
根据公司用户量及机器配置信息,公司的最大连接数、最大线程数和最大等待数优化为:
#最大连接数
server.tomcat.max-connections=2000
#最大线程数
server.tomcat.max-threads=1000
#最大等待数
server.tomcat.accept-count=800
增加线程是有成本的。JVM中默认情况下在创建新线程时会分配固定大小的线程栈,所以更多的线程异味着更多的内存;
更多的线程会带来更多的线程上下文切换成本。
如果线程占用的资源过大,会导致内存溢出(Cannt’ allocate memory)情况出现。因此需要对JVM及线程的相关参数做合理配置。
在jvm内存调整过程中,我们经常使用的参数就是:
-Xms 为jvm启动时分配的初始堆的大小,也是堆大小的最小值,比如-Xms200m,表示分配200M
-Xmx 为jvm运行过程中分配的最大堆内存,比如-Xmx500m,表示jvm进程最多只能够占用500M内存
-Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M
Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景的更多相关文章
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- Spring Boot:Spring Boot 中 Redis 的使用
Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化.除此 ...
- (转)Spring Boot(三):Spring Boot 中 Redis 的使用
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 Nosql ...
- Spring Boot(三):Spring Boot 中 Redis 的使用
Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化. Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更 ...
- Spring Boot中使用Redis小结
Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, 等. Redis简单介绍 Redi ...
- Spring Boot中的事务是如何实现的
本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天呢!灯塔君跟大家讲: Spring Boot中的事务是如何实现的 1. 概述 一直在用SpringBoot中的@Transactional来做事 ...
- springboot(三):Spring boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- 初识在Spring Boot中使用JPA
前面关于Spring Boot的文章已经介绍了很多了,但是一直都没有涉及到数据库的操作问题,数据库操作当然也是我们在开发中无法回避的问题,那么今天我们就来看看Spring Boot给我们提供了哪些疯狂 ...
- Spring Boot中通过CORS解决跨域问题
今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略. 同源策略是由Netscap ...
随机推荐
- 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
问题描述:在使用python爬取斗鱼直播的数据时,使用str(读取到的字节,编码格式)进行解码时报错:'utf-8' codec can't decode byte 0x8b in position ...
- ubantu系统之 在桌面添加应用快捷方式
1. 首先在终端使用命令:sudo nautilus 这个命令会让你用root权限打开文件管理器,输入这个命令然后输入密码确认之后会弹出一个目录窗口;2. 然后我们就要找到目录:/usr/share/ ...
- java中的访问控制有什么用?如何用法?请举例
9.访问控制 [新手可忽略不影响继续学习] 访问控制有什么用?在软件公司里是这么用的,我们想像一种场景,在你的类中,你编了三个私有方法,马克-to-win,别人当然都用不了,但在类外,你也是用不了的, ...
- Jar 包下载以及 maven jar 包配置
学习内容: jar包下载是我们必须掌握的一个内容,不管是使用Maven项目还是其他项目,一般都需要引入外部的 jar 包 jar包下载 下载地址(打不开网址的直接百度搜索 maven reposito ...
- Reflect.has检测对象是否拥有某个属性
Reflect.has({x: 0}, 'x'); // true Reflect.has({x: 0}, 'y'); // false // returns true for properties ...
- sequelize模型
model表示数据库中的表,有时它也会被称为"模型"或"工厂".Model不能通过构造函数创建,只能通过sequlize.define方法来定义或通过sequl ...
- redis笔记补充
redis补充 这篇文章是redis入门笔记的补充. 1.info命令 用来显示服务的信息. info命令可以跟下面的选项: server: 关于 Redis 服务器的一些信息 clients: 客户 ...
- Color Constancy 颜色恒定性
1:Color Constancy? 世界上并不存在颜色.颜色仅仅是我们的眼睛和大脑对不同可见光的波长进行的一层映射.也就说颜色只是我们大脑和视网膜处理的结果. 1.1 关键问题 我们的视觉系统有一个 ...
- spring boot整合mybaties项目
1.第一步配置pom.xml 2.第二步 将我们所需要的ssm配置文件复制粘贴到src/main/resources下面: 3.将ssm中所需要的layui和jsp页面放到webapp下面 4.修改复 ...
- Java语言学习day10--7月9日
###09方法的重载 * A: 方法的重载 * 在同一个类中,方法名相同,参数列表不同.与返回值类型无关. * 参数列表不同: * A:参数个数不同 * B:参数类型不同 * C:参数的顺序不同(算重 ...