1.背景描述
在某财务公司企业网银项目中,通过压力测试发现,在0-10Vus阶段,随着压力增加,系统TPS随之增加,但是当并发用户数继续增加时,TPS基本稳定,只有平均响应和时间再不断增加,并且通过Nmon监控服务器硬件资源应用一直稳定34%左右,数据库稳定在2%左右,不存在资源瓶颈,测试机与被测服务器在同一网段内,也排除了网络瓶颈问题。
2.问题排查
<1>数据库问题排查
由于该测试中选取了大量的涉及数据库表增删改查的交易,我们首先怀疑了数据库的慢查询或者表锁导致的交易等待,所以我们通过oracle 生成AWR报告来排查问题。
(下面步骤主要内容来自于https://blog.csdn.net/w892824196/article/details/82319234)
- 通过su - oracle 切换到数据库用户 进入数据库 sqlplus / as sysdba
- 进入oracle 目录
- 查看用户 show parameter db_name
- 开始压测后执行 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
- 结束压测后执行 exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
- 输入命令 @?/rdbms/admin/awrrpt
- 备注:4和5步骤中不执行,后面默认产生系统规定的时间节点(默认人一小时生成一次报告)
- 输入回车 默认是html格式
- 输入1,查询最近一天的
- 输入开始节点和结束节点
- 输入想要生成的报告名称,以html格式结尾
- 生成的awr默认在登陆数据库的路径
通过上述步骤生成AWR报告,但是结合开发反馈,报告中并没有明显的性能缺陷,在开发组优化部分SQL后,复测仍存在原问题;(详细AWR报告解析,建议参考Demonson 的 https://blog.csdn.net/demonson/article/details/79474133 作者解答非常详细;或者查看wangwei 的https://blog.csdn.net/weiwangsisoftstone/article/details/7614430对我们常用的项进行了重点讲解。)
<2>各连接池确认
经过一轮折腾后一无所获,我们回到了最初的起点,去排查数据库线程池等可能存在连接限制的地方,意外发现被测系统中negix服务对连接有诸多限制,由于性能测试脚本未做IP欺诈,所以negix会对请求进行限制,我们修改了negix限制规则,但是收效甚微。但是在此过程中我们似乎发现了问题真正所在。
(注:结合下图,当前系统为单服务器串行,negix为预装服务器,当前系统中并不实用)
在修改negix之前,当我们执行测试脚本时100并发只有可怜的几个活动线程,大量请求被被暂挂,在修改negix后活动请求略有提升到20-30个左右,但是仍有大量请求被挂起。
<3>暂挂请求问题
由于本人测试经验不足,请教了一位前辈,指出可以配合开发通过Javacore排查代码问题。
转载大神黑暗行动的三篇文章:
Javacore和Heapdump生成和获取
- https://blog.csdn.net/chy2z/article/details/82987113
- https://blog.csdn.net/chy2z/article/details/83002584
- https://blog.csdn.net/chy2z/article/details/83005424
结合这三篇文章,和开发人员的协作,找到了相关问题代码,由于测试周期时间紧张,这一次并没有直接修复,但开发组反馈基本明确了问题所在,将在下一版本中进行更新,本人也会跟进复测,届时再跟新本文。
作为一名软件性能测试的初级从业者,想通过CSDN 分享自己的项目经历,能够为大家提供一丝丝经验,更多的是发现自己在项目中的不足,尽心总结。如果读者发现我在项目执行中有问题或纰漏,希望您能够指点一二。