如何测量JMeter中线程的开始到结束时间
How to measure the start to endtime of a thread in JMeter
我一直在尝试弄清楚如何测量 JMeter 中的线程(虚拟用户)完全完成所花费的时间。我现在不一定关心响应时间。我尝试加载测试的 API 以异步方式工作。我提出开始工作的请求,我得到了一个工作 ID,然后我使用该工作 ID 检查该工作的状态,直到它完成。我想知道完成每个作业需要多长时间,即作业何时开始(线程已创建)和作业何时完成(线程已完成工作)。
我见过几个人建议在类似情况下使用 Transaction Controller
,但是,除非我误解了,否则它会给出“事务”中所有请求的总响应时间,而这并没有帮帮我。
这是我目前在 JMeter 中的设置:
实际上效果很好,我提出了提交作业并提取作业 ID 的初始请求。在 while 循环中,我每 10 秒使用提取的 id(恒定计时器)检查作业的状态,直到作业完成。
这是 5 个并发用户的汇总报告的样子,我也可以使标签相同,以便进一步压缩,但 none 此信息告诉我线程花费了多长时间。根据样本数量,我可以推测一半的线程大约需要 10 秒才能完成,而其他线程我可以乘以 10 秒(睡眠定时器)并粗略估计完成需要多长时间,但这很难做到(或者至少是时间密集型的)几百个线程。我真的希望 JMeter 有一些开箱即用的东西,可以以漂亮的报告格式为我提供这些信息。
我也看到有人建议获取此类信息的唯一方法是解析日志,只是想知道是否有人解决过类似的问题。
你的问题包含答案,只是测量它
将JSR223 Sampler添加到线程组的开头并将以下代码放入“脚本”区域:
SampleResult.setIgnore()
vars.putObject('startTime', System.currentTimeMillis())
第一行告诉 JMeter 不要存储 JSR223 采样器结果(因为我相信你不需要这个)第二行将当前时间戳保存到 ${startTime}
JMeter Variable
将另一个 JSR223 采样器添加到线程组的末尾并在那里使用以下代码:
SampleResult.setIgnore()
def end = System.currentTimeMillis()
def start = vars.getObject('startTime')
log.info('Thread ' + (ctx.getThreadNum() + 1) + ' elapsed time: ' + (end - start))
在这里,我们在作业结束后获取当前时间戳,并将其从第一个 JSR223 采样器中的先前时间戳存储中减去。增量被打印到 jmeter.log file however you might rather want to store it into another JMeter Variable and expose it to the results via Sample Variables 属性 所以它会被添加到 .jtl 结果文件
演示:
请参阅 Top 8 JMeter Java Classes You Should Be Using with Groovy 以详细了解这些 SampleResult
、vars
和 ctx
缩写的含义
我一直在尝试弄清楚如何测量 JMeter 中的线程(虚拟用户)完全完成所花费的时间。我现在不一定关心响应时间。我尝试加载测试的 API 以异步方式工作。我提出开始工作的请求,我得到了一个工作 ID,然后我使用该工作 ID 检查该工作的状态,直到它完成。我想知道完成每个作业需要多长时间,即作业何时开始(线程已创建)和作业何时完成(线程已完成工作)。
我见过几个人建议在类似情况下使用 Transaction Controller
,但是,除非我误解了,否则它会给出“事务”中所有请求的总响应时间,而这并没有帮帮我。
这是我目前在 JMeter 中的设置:
实际上效果很好,我提出了提交作业并提取作业 ID 的初始请求。在 while 循环中,我每 10 秒使用提取的 id(恒定计时器)检查作业的状态,直到作业完成。
这是 5 个并发用户的汇总报告的样子,我也可以使标签相同,以便进一步压缩,但 none 此信息告诉我线程花费了多长时间。根据样本数量,我可以推测一半的线程大约需要 10 秒才能完成,而其他线程我可以乘以 10 秒(睡眠定时器)并粗略估计完成需要多长时间,但这很难做到(或者至少是时间密集型的)几百个线程。我真的希望 JMeter 有一些开箱即用的东西,可以以漂亮的报告格式为我提供这些信息。
我也看到有人建议获取此类信息的唯一方法是解析日志,只是想知道是否有人解决过类似的问题。
你的问题包含答案,只是测量它
将JSR223 Sampler添加到线程组的开头并将以下代码放入“脚本”区域:
SampleResult.setIgnore() vars.putObject('startTime', System.currentTimeMillis())
第一行告诉 JMeter 不要存储 JSR223 采样器结果(因为我相信你不需要这个)第二行将当前时间戳保存到
${startTime}
JMeter Variable将另一个 JSR223 采样器添加到线程组的末尾并在那里使用以下代码:
SampleResult.setIgnore() def end = System.currentTimeMillis() def start = vars.getObject('startTime') log.info('Thread ' + (ctx.getThreadNum() + 1) + ' elapsed time: ' + (end - start))
在这里,我们在作业结束后获取当前时间戳,并将其从第一个 JSR223 采样器中的先前时间戳存储中减去。增量被打印到 jmeter.log file however you might rather want to store it into another JMeter Variable and expose it to the results via Sample Variables 属性 所以它会被添加到 .jtl 结果文件
演示:
请参阅 Top 8 JMeter Java Classes You Should Be Using with Groovy 以详细了解这些 SampleResult
、vars
和 ctx
缩写的含义