记一次平均响应时间越来越慢的调优过程

1. 现象

最近做的性能测试中,有一支交易随着压测时间的增加,响应时间越来越慢,TPS越来越低 。压测十二个小时之后的效果平均响应时间和TPS如下图:
记一次平均响应时间越来越慢的调优过程
记一次平均响应时间越来越慢的调优过程
整个场景是要录入一个贷款的客户信息,使用50用户并发压测12小时以上;其中输入完客户信息后,点击保存按钮这个操作,随着压测的进行,响应时间越来越慢。并且停止压测后过一段时间,即使使用一个用户进行同样的操作,响应时间还是很慢,并不会恢复到最初压测的响应时间。整个场景中只有这一个操作会越来越慢,其他操作响应时间很稳定。

2. 定位问题

首先排除了物理资源和中间件引起的问题,如果是这些问题,整支交易的所有操作应该都会越来越慢,而不会只体现在这一个方法上。而且通过监控资源,服务器CPU、内存、IO都不存在瓶颈。初步判断是该方法本身出现了问题,肯定出现了资源占用后不能释放的问题,导致随着压测的进行,响应时间越来越慢,并且停止压测一段时间后,资源也不会释放。
开发同事通过对该方法的调试,并没有发现明显的问题,于是只能使用排除法,分步注释该方法的代码块,最后把整个方法体完全注释之后,只返回null结果,压测一段时间后,问题仍然存在。又判断问题不是出现在方法本身,有可能是在方法的上一层,或者是传入的参数对象有问题。开发使用的是Spring架构,由于对Spring不是太了解,这里只能描述大概的问题:Spring有自己的对象持久化方法,需要把前端页面传过来的表单数据解析成对象,然后在把相应的数据存储到数据库中(这块可能描述的不正确),但是这个对象特别大,里面还有很多list,导致越来越多的对象需要被持久化,占用的资源又不会释放,导致了响应时间越来越慢。

3. 调优

不使用Spring 自带的持久化技术,开发自己写代码实现了这一逻辑,好像是把jackjson改成了gson进行JSON和Java对象转换。改完之后再压测,问题完美的解决了,所有操作平均响应时间都是趋于平稳的。

4. TODO

后续要把Spring学习下,否则不知道开发说的什么。