概述
本篇文章主要记录下公司的系统部署到银行内部内uat环境后,流量突增后,导致整个系统所有请求耗时十分之久,最后崩溃,无奈连夜赶往现场,解决处理。
事情经过和原因分析
银行现场的实施同事反馈,平台页面打开都要超过5分钟,任何接口都十分卡顿。我一听就不对劲了,怎么可能呢?
到现场才发现,现场只部署了了一个节点,在UAT阶段流量接入以后,平台直接就扛不住了,其中有个接口高峰期的qps是1000,但是通过浏览器发现这个接口的平均相应时间是15s,而tomcat本身默认的线程数是200个,所以肯定导致其他所有的请求阻塞了,因为没有连接资源了,造成服务的不可用。
所以除了扩充节点解决问题以外,还需要提高单节点接口的性能。
优化手段
排查连接池大小
其实大部分的请求都是会访问数据库,而数据库严重依赖连接池数量,如果一个项目连接池数量设置过小,那势必会导致性能下降。
Hikarip连接池配置说明如下:
#最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=5
#最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=100
#自动提交从池中返回的连接,默认值为true
spring.datasource.hikari.auto-commit=true
#空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
#只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
spring.datasource.hikari.idle-timeout=30000
#连接池名称,默认HikariPool-1
spring.datasource.hikari.pool-name=Hikari
#连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短;单位ms
spring.datasource.hikari.max-lifetime=55000
#连接超时时间:毫秒,小于250毫秒,会被重置为默认值30秒
后来发现项目中设置的最大连接数maximum-pool-size