性能测试中 QPS 取样器和 RT 取样器
之前写过一个性能测试框架中QPS取样器实现,总体思路是通过一个异步工具类com.funtester.frame.execute.Progress
来统计各个线程自己的统计数据(响应时间),然后再依据线程数计算实时的 QPS。
但是这个思路很容易受到数据(响应时间)取样的样本大小影响,因为对于混合接口压测场景中,不同接口的响应时间可能会差别很大。所有通过之前的思路就需要优化了,经过一些尝试终于确定了新的方案。
思路
这个功能仅针对于静态压测模型来讲,因为动态压测模型实现思路已经很不一样了,强制统一不太合适。所以针对动态模型,我单独写了一个动态模型的 QPS 取样器,对于之前的静态模型,我重新实现了 RT 取样器。由于动态模型中并不会记录响应时间,暂时也没有增加 RT 取样器的计划。
对于静态模型的 RT 取样器。我添加了
com.funtester.base.constaint.ThreadBase#INTERCEPT
和com.funtester.base.constaint.ThreadBase#COUNT
,通过控制这两个开关来实现不同的功能。通过一个异步线程接口控制台输出内容,来控制 RT 取样器工作状态。对于动态模型中的 QPS 模型,用到了性能测试中的LongAdder,经过测试性能足够好。依然通过异步线程获取这个计数器的值当做 QPS,然后每次重置即可。
对于动态模型中的线程模型,由于
com.funtester.base.constaint.ThreadBase
已经提供了com.funtester.base.constaint.ThreadBase#executeNum
当做每个线程的计数器,由于单线程的,所以并不用考虑线程安全的问题。直接将任务池中的com.funtester.base.constaint.ThreadBase
存活对象遍历一遍求和即可。
实现
静态模型
取样器方法实现:
这里用到了com.funtester.utils.CountUtil#index
,代码后面会附上。
动态 QPS 模型
之前写过一个基于Disruptor
的动态 QPS 模型框架:
高性能队列Disruptor在测试中应用
2021-12-28
千万级日志回放引擎设计稿
2021-12-30
但是经过实际使用,并不适合,二次开发的复杂程度较高,目前已经放弃了。不过由于部分用例已经用上了,新的框架还没时间验证,所以还会保留一阵子。
关于Disruptor
获取实时 QPS 的可以翻一翻上面的文章,下面是新写的框架实现:
其中com.funtester.frame.execute.FunEventConcurrent#total
作为单个测试任务的统计对象,这也是为以后多任务做铺垫。
动态线程模型
这个相对简单,不用考虑线程安全的问题,只是在每次输出增减内容之后输出当前任务池的信息即可。
首先是任务池信息获取方法:
其次是在处理控制台输出内容的内部类稍微改造一下:
Have Fun ~ Tester !
版权声明: 本文为 InfoQ 作者【FunTester】的原创文章。
原文链接:【http://xie.infoq.cn/article/2dfda5ef9737d825d1c3d6827】。文章转载请联系作者。
评论