【连载 21】性能测试实践——超时结账第一回合
3.7.1 超市结账第一回合
让我们把目光转回小八超市。最近生意红火,8 个收银台忙得团团转,早高峰时连上厕所的时间都没有。收银员们叫苦不迭,纷纷建议老板临时增加 2 个收银台。小八思前想后,决定先对现有的 8 个收银台进行一次摸底,看看在满负荷运转的情况下,每分钟能结账多少顾客。根据摸底结果,再决定是否增加临时收银台。
以此为背景,我们来设计一个性能测试用例。根据需求分析,我们选择线程模型,也就是排队模型,总并发数量为 8。测试内容就是模拟顾客结账的流程,简化为三个步骤:扫码计价、付款结账和打包走人。为了给收银员留出热身时间,我们设置了 2 分钟的 Rump-Up 时间。
相信大家对这种场景已经驾轻就熟,下面是我设计的多线程类。为了增加一点挑战性,我分别统计了三个步骤的耗时,并且支持异步输出实时信息,这样可以更快定位系统瓶颈,提升排查效率。
既然要增加额外的统计和异步输出功能,必然需要一个额外的线程来完成这个任务。为了避免线程开销,我在 TaskExecutor 类中增加了一个属性 realTimeThread:
这样在 start()方法中稍加改造即可使用。当 realTimeThread 未赋值时,默认只统计当前实时 TPS 和 RT。
接下来我们编写多线程任务类代码。增加了三个阶段方法以及对应的统计属性。本次数据统计采用了实时 TPS 和 RT 相同的方案,使用一个全局线程安全对象计算总耗时,然后依据实时 TPS 计算平均耗时。
为了增加统计数据的波动性,在 pay()方法中增加了时间相关变量作为休眠参数。多线程任务类代码如下:
测试用例如下:
控制台输出信息如下(省略了重复内容):
通过这次测试,小八超市的收银台性能一目了然,接下来就是根据数据做决策了。正所谓“磨刀不误砍柴工”,有了这些数据支持,小八的决策会更加科学合理。
版权声明: 本文为 InfoQ 作者【FunTester】的原创文章。
原文链接:【http://xie.infoq.cn/article/3f5b0217826f69d9f61ef297b】。文章转载请联系作者。
评论