项目背景: springboot 2.5.1,JDK11,未使用fastJson,没有慢sql
前景提要:在3.2号压测,tps能稳定5000,Spinrgboot 2.2.3
用JMeter压测项目的4个登录退出相关接口,条件为x个并发线程,都使用super用户进行登录退出。登录相关的数据,包括用户信息等,都会存在Redis缓存中,所以只有第一次登录会查库,后续登录都是直接走缓存。
且从3月2号到如今,代码没有大改动,只有升级了Spring版本大改动。
现在出现的问题就是下图所示的陡降。
1. JMeter服务器和项目服务器的CPU最大负载才50%,排除CPU原因。
2. 只有第一次登录才走数据库,排除数据库连接慢的原因。
3. Redis和项目服务器IP为同一局域网,排除网络原因。
4. 服务器防火墙关闭/尝试更换过服务器,排除服务器原因。
5. 项目JVM一次GC都没发生/尝试设置最大堆为8G,排除JVM原因。
6. 100次/500次/1000次并发的tps都一样,排除脚本原因,排除服务器端口堵塞原因。
7. 接口响应为40ms时,为1000ms时,tps都如图且最终tps结果差值不超过50,排除项目代码原因。
求助各位大佬,排查了4天了,脑袋都疼了,现在我惟一能想到的就是SpringBoot从2.2.3升级到2.5.1,但是这是不是最终原因呢?如果是,那么是因为什么呢?如果不是,又是因为什么?
2.2直接升级2.5,这个spring boot版本升级跨度可有点大,更别说同时也带动了一大堆附属组件的升级!
建议先回归2.2.3,确认是否性能恢复。如果性能问题消失,那么就是本次升级造成的影响。仔细通过官方的升级说明,排查问题吧。另外就是你说的,代码没有大改动,但是也改了。有时候不经意的小改,也会造成大问题。
把版本再降回来。我不认为只是单纯的版本变动 ,就能带来如此大的性能下降。
下降这么大,肯定是某些资源到达限制了。查查redis/mysql连接数,查redis的负载,查主机名与IP的对应。
所有代码块加时间戳输出
还是看看线程池吧,例如数据库连接池
Jmeter原因。5台jmeter各开100线程一起压测,加起来的tps稳定在4000多。。。。。
SpringBoot从2.2.3升级到2.5.1
看下升级文档, 应该是哪个细节影响了性能
jconsole连上去再做压测,观察下下降节点那个时间范围内的线程状态,TPS下降应该是某个原因导致同时进行的线程数下降,其它线程阻塞了,然后看下堆栈一步步排查阻塞原因