性能工具之 JMeter TPS限制与动态调节

举报
zuozewei 发表于 2022/01/05 14:37:17 2022/01/05
【摘要】 在压测时,“控量”有时候是需要的,JMeter 是根据线程数大小来控制压力强弱的,但我们制定的压测目标中的指标往往是TPS,这就给测试人员带来了不便之处,必须一边调整线程数,一边观察 TPS 达到什么量级了。如,在某个压力下服务容量没有问题,我们希望在不停止压测的情况下,再加一些压力,这样的功能该如何实现呢?

前言

在压测时,“控量”有时候是需要的,JMeter 是根据线程数大小来控制压力强弱的,但我们制定的压测目标中的指标往往是TPS,这就给测试人员带来了不便之处,必须一边调整线程数,一边观察 TPS 达到什么量级了。如,在某个压力下服务容量没有问题,我们希望在不停止压测的情况下,再加一些压力,这样的功能该如何实现呢?

为了解决这个问题,JMeter 提供了吞吐量控制器的插件,我们可以通过设定吞吐量上限来限制 TPS,达到控量的效果。

技术方案

JMeter 提供了 Constant Throughput Timer组件 和 Throughput Shaping Timer

在这里插入图片描述

在这里插入图片描述

这里提供的方案也很简单,基于 Constant Throughput Timer,基本的实现原理是将吞吐量限制值设为占位符(如下图中的 ${__P(throughput, 10)},throughput 就是占位符,10是默认值),利用 JMeter 的 BeanShell 功能,通过执行外部命令的方式,在运行时注入具体值,达到动态调节吞吐量的目的。

在这里插入图片描述

BeanShell 解释器有一个非常有用的特性——它可以充当服务器,支持可以通过 telnet 或 http 访问。

如果希望使用服务器,请在 jmeter.properties 中定义以下内容:

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh

使用示例

JMeter 脚本 Debug Sampler 下添加 Constant Throughput Timer 节点,即可对该线程组发出的 TPS 压力大小进行限制。操作如下:

在这里插入图片描述

编写 update.bsh BeanShell脚本为:

import org.apache.jmeter.util.JMeterUtils;

getprop(p){ // get a JMeter property
    return JMeterUtils.getPropDefault(p,"");
}

setprop(p,v){ // set a JMeter property
    print("Setting property '"+p+"' to '"+v+"'.");
    JMeterUtils.getJMeterProperties().setProperty(p, v);
}

setprop("throughput", args[0]);

通过运行命令动态调整TPS:

sudo java -jar /<jmeter_home>/lib/bshclient.jar localhost 9000 throughput.bsh <参数>
 ~/Desktop  sudo java -jar /Users/zuozewei/Downloads/performance/apache-jmeter-5.4.1/lib/bshclient.jar localhost 9000 throughput.bsh 20
Connecting to BSH server on localhost:9000
Reading responses from server ...
BeanShell 2.0b6 - by Pat Niemeyer (pat@pat.net)
bsh % Setting property 'throughput' to '20'.
bsh % ... disconnected from server.

注意事项:

Constant Throughput TimerTarget throughput 以分钟为单位配置,TPS 值换算成分钟时,需要乘以60 (1分钟=60秒),可使用__jexl3进行计算。

运行效果

视频地址:https://www.bilibili.com/video/BV1Yg411L7iF?share_source=copy_web

源码地址:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。