之前面试高级测试工程师时,被问到性能测试这个问题,以下仅代表个人见解:
我的思路是:
详细说明当时整个性能测试的落地全程,包括性能测试需求的获取、方案的设计、测试脚本的场景设计举例、测试环境的搭建、测试执行时怎么监控资源,如何分析性能测试数据,如何定位问题,最终如何报告问题,回归的时候如何证明性能确认变优等。
当时的说法:
我之前做的是电影院项目,比如说元旦、国庆等节假日之前,需要做主流程业务的性能测试,以保证高峰期的正常使用。
做性能测试分为几步: 首先,获取性能需求,这个一般是产品经理通过影院往年同时期的高峰期数据设定;
然后测试员根据性能需求设置测试用例,比如说哪些业务场景需要做性能测试?我们当时的排片、售票、卖品销售、提交订单等几个接口是必须要测的,根据需求设置场景,比如说要500个租户一万家影院跑单个接口、组合接口等场景的测试。
然后测试需要去做性能测试准备,首先在性能测试环境同步生产环境里的数据作为铺底数据,然后根据性能场景需要读写大量数据的情况,去准备对应的数据,比如将1万个影院账号数据写入CSV文件,以作登录和下单组合场景测试等。
测试在设计脚本的同时,运维需要搭建测试环境,我们当时是有一个与生产环境的配置一致的性能测试环境的,这部分由运维准备。
设计脚本时先把单接口跑通了,然后通过100、200、500个租户这样来持续加压。
然后通过Grafana监控平台对服务器的各项指标进行监控,找出系统的瓶颈。 比如说在执行100个租户并发的时候,服务器的CPU使用率就达到99%了,那必然是性能不达标的,此时会使用Linux的top命令来查看CPU的使情况等手段来排查问题,如果无法定位问题,可能需要跟开发合作一起排查。
定位到问题之后,开发修复,之后回归测试。需要使用Grafana来进行对比两次的性能数据,确认性能是否优化。
最后还有一个报告总结阶段,我们当时是多个项目组一起做性能测试,测试成员在线上协作文件上报告各自的结论,再由总负责人汇总报告。
说完一长串之后,面试官又针对我提到的点再次提问:
你刚才说到当服务器CPU达到99%的时候,你需要去排查,可以具体说说是怎么操作的吗?
- 第一步:先保证环境的硬件性能,比如说如果是一个日访问量上千万的网站,但是你测试的服务器是什么“等比例缩小”之类的,就不靠谱。
- 第二步:保证测试场景设置的合理性,是否设置了10万个线程在1秒之内全部启动之类的不合理操作。
- 第三步:使用Linux的top命令,迅速锁定是“谁”导致的。可以获取到使用率最高进程的PID
- 第四步:使用top -H -p PID命令查看实际占用CPU最高的线程TID
- 第五步:
- 使用命令
printf "%x\n" tid
,将线程ID转换为16进制 - 使用命令
jstack pid |grep tid -A 50
,此处tid为上一步转换后的16进制,使用此命令可以查看到对应线程的线程栈信息,从而对根据线程栈对对应的代码进行分析。
- 使用命令
- 第六步:找开发看问题。