spring事务与连接池共同触发的一个bug
概述
最近在做项目的压力测试的时发现,一个包含三个接口的后台服务,其中两个新增,一个更新接口。在使用jmeter进行压测时,应用的TPS特别低。而且随着并发量的增大,应用会陷入假死状态。经过两三天左右的调优实践,最终将的TPS从30提升到270,并且解决了一个在高并发环境下由spring事务传播和jdbc连接池共同作用的并发死锁问题。
初步压测结果
直接对应用进行压测的结果很不理想,200个线程同时跑,大概只能打到30/s的TPS。服务被压测的过程中,请求时间持续上升,大量请求堆积。在压力测试进行到2分钟左右的的时候,程序突然陷入假死状态,控制台不再打印日志。
项目要求单机环境下,2核4G至少要跑到200TPs以上,因此还需要对项目进行调优测试。
初步检测
项目的数据操作主要是针对mysql的插入更新和对es的插入更新。在调优前发现项目的日志前期并不完善,缺乏sql语句和es的query语句的输出。
因此首先检查项目,针对es使用spring aop拦截RequestBuilder,打印es语句。针对sql,由于使用mybatis,因此可以在yaml文件中进行配置输出包和输出登记