背景:公司IAM系统的登录过程在压测过程中表现不太行,需要优化性能

一: 问题定位

开发环境为jmeter使用1s20个线程测试

压测记录:

通过arthas一层层trace寻找耗时程序,命令如图:

查询到是setPermissions的findAuthorityByRoleCodes方法比较耗时

本地setPermissions方法耗时

具体耗时sql:

开发环境setPermissions耗时:

开发环境authenticate耗时:

结论: findAuthorityByRoleCodes使用的sql查询耗时1s,导致登录卡慢

二: 问题处理

优化sql

优化后查询耗时

三: 优化后效果

jmeter压测记录

容器启动arthas监听运行耗时

性能对比:

性能指标

优化前

优化后

最大时延/ms

35799

5300

最小时延/ms

664

196

平均时延/ms

14099

2348

吞吐量/sec

1.14

7.1

getAccessToken耗时/ms

1304

141.5

setPermission耗时/ms

861.9

25.9

navicat查询sql耗时/ms

413

72

最终发现是编辑菜单接口每次编辑都会在把角色对应的所有菜单都入库一遍导致数据库已经19106条数据了,实际上不重复的数据只有500多条导致卡慢