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

1. 现象

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

2. 定位问题

首先排除了物理资源和中间件引起的问题,如果是这些问题,整支交易的所有操作应该都会越来越慢,而不会只体现在这一个方法上。而且通过监控资源,服务器CPU、内存、IO都不存在瓶颈。初步判断是该方法本身出现了问题,肯定出现了资源占用后不能释放的问题,导致随着压测的进行,响应时间越来越慢,并且停止压测一段时间后,资源也不会释放。
开发同事通过对该方法的调试,并没有发现明显的问题,于是只能使用排除法,分步注释该方法的代码块,最后把整个方法体完全注释之后,只返回null结果,压测一段时间后,问题仍然存在。又判断问题不是出现在方法本身,有可能是在方法的上一层,或者是传入的参数对象有问题。开发使用的是Spring架构,页面表单的超大型对象数据直接提交到后台时,系统框架和spring框架解析此对象时可能存在全局变量,随着压测时间的增加,此变量大小线性递增,因此导致了响应时间越来越慢。

3. 调优

修改了页面对象提交到后台的数据格式,优化前为整个表单直接提交,优化后为整个页面数据用JSON字符串格式提交到后台,不使用Spring自带的方式解析对象,而是自己使用gjson实现。改完之后再压测,问题完美的解决了,所有操作平均响应时间都是趋于平稳的。

你可能感兴趣的:(性能测试)