背景:
环境上有个接口压测吞读量一直上不去,该接口的逻辑大概是查询我方数据库2个表,然后调用外围2个接口
分析过程:
1.问题1(gap时间)
a. 查看调用链发现调用链存在大量gap时间,这种gap时间一般就是资源没了,比如等待获取连接池,或者gc回收等待,归根接底都是资源问题
b. 取堆栈日志,发现大量线程sleep在这边waiting on condition
c. 查看源码发现项目组使用的第三方jar包,有这样的代码,在http请求后,在finally里使用了sleep ,大致意思就是 如果调用花费200ms,就需要sleep800ms
2.问题2(隐式转换)
d.修复代码屏将这个intervalTimeMills设置为1,此时代码就不会走这个sleep,修复后调用链如下,第三方接口时间确实提升,但是性能确实还是提升不了,继续看调用链和堆栈日志分析
发现sql执行特别慢,以及发现线程卡在了socket read
取该sql分析,发现因为字符集编码导致隐式转换,不走索引了。
结论:
1.代码的问题,finally导致每次都sleep几百ms
2.表字符集不同,导致出现了隐式转换,索引失效