分布式压测

如何开展分布式压测?

当接到一个压测需求时,要怎么测试?一般可从以下角度阐述:

​ 1、分析被测服务的调用链及其协议,选择测试工具

​ 2、编写测试用例,准备测试数据,确认本地调试通过

​ 3、准备发压环境

​ 4、确认测试指标,选择测试场景

​ 5、测试执行

​ 6、总结和分析

一、测试工具

1.1 Jmeter

​ Jmeter常用于Web场景的压力测试。但除了常见的HTTP、TCP协议的性能测试外,Jmeter本身也提供了底层SDK以供开发者进行可视化的自定义开发。

TarsJmeter插件
    Tars是由腾讯开源的高性能RPC微服务框架。
    [TarsJMeter是一套运行在JMeter环境上的性能测试方案,目的是为了解决Tars私有化协议的性能测试。
    (下载地址:https://git.code.oa.com/dcsiq_sec_gz/tars_jmeter)
    
如何使用TarsJmeter插件?
    1、编译打包,生成TencentJMeter_tars-1.0.jar
    2、将 TencentJMeter_tars-1.0.jar 放到Jmeter的 .../lib/ext 目录下
    3、添加取样器时即可选择Tars or Shark相关Sampler

img

二、用例设计

2.1 常用测试协议

2.1.1 shark

img

​ Shark Sampler中,Shark协议总共有6种:

tcpShark nohttp:tcp on shark on tcp,长链接

tcpShark http:http on shark on tcp,长链接

OldtcpShark nohttp:tcp on old shark on tcp,长链接

OldtcpShark http:http on old shark on tcp,长链接

httpShark nohttp:tcp on shark on http,短链接

httpShark http:http on shark on http,短链接

​ 其中,OldShark是指旧Mazu,旧的是链路只有Mazu,新的是Mazu+SashimiServer。目前TMF使用的是新Mazu,因此常用协议为tcpShark http。

2.1.2 tars

img

2.1.3 http

img

2.2 常用设置

2.2.1 线程组

img

​ 线程数:通常从较小的数值开始测试,然后逐渐加大并发;

​ Ramp-Up时间:指多长时间内启动完全部线程,设置30即30s秒启动完全部线程。设置该参数可以模拟一段时间内都平稳有请求上去,避免请求全都在同一时间起来。

如何合理设置线程数?

​ 通常情况下,QPS开始会随着压测端线程数而增加,到达极限值后不再上涨,因此测试的时候需要预估合理的线程数来达到极限QPS。

​ 1、验证单个请求的响应时间(RT)

​ 2、预估线程数 = RT x CPU核数 x 单CPU使用率 = RT x CPU核数 x 100%

img

2.2.2 定时器

​ 定时器可以用于控制发送频率。(比如,想控制每秒发送一次,可以使用常数吞吐量定时器,设置为60)

​ 常用的两种定时器:

​ 固定定时器:一次请求后,延迟多长时间,再进行下一次请求

​ 常数吞吐量定时器:指定每分钟最多发送多少个请求

何时需要用定时器?怎么设置参数?

​ 在不设置定时器的情况下,会根据回包再发送下一个请求。因此定时器通常不是必须设置项。但在需要控制发包频率的场景时,可以设置。(例子:问题定位-网关HTTP协议)

​ 先设置1个线程运行,观察响应时间(RT)。假设RT=1ms,即每分钟最多可发送请求数:60/1/0.001

2.2.3 查看结果树

img

添加查看结果树,可以看到每次请求的结果,也可只过滤失败请求。这个方便在本地调试使用。

2.2.4 后端监听器

img

​ 后端监听器可以将测试结果传到influxdb,grafana从influxdb读取结果进行可视化展示,方便实时查看测试结果(QPS、错误率、耗时等)。

2.2.5 聚合报告

img

​ 聚合报告可以显示错误率、TPS等结果信息,在没有可视化报表等情况下,可以用Jmeter自带的聚合报告看到测试结果。

2.2.6 CSV数据文件设置

img

​ 适用于需要读取特定文件内容的场景。

三、环境管理

3.0 压测方式

​ 压测可分为内网压测和外网压测。TMF是使用腾讯云服务器私有化部署,在办公网进行压测为外网压测;使用同一个腾讯云账号购买服务器进行压测,即为内网压测。

​ 外网压测网络开销对响应耗时的影响较大,而内网压测几乎取消了网络开销的影响,可以更好地评估服务自身的性能,因此我们采用了内网压测。(客户端RT=服务端RT+网络开销)

3.1 环境依赖

​ 确认是否安装了Java。若没有安装,则:

yum search jdk
yum install java-1.8.0-openjdk.x86_64

​ 安装成功后,配置.bashrc:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=${JAVA_HOME}/bin:$PATH

​ 修改后,执行source ~/.bashrc生效

source ~/.bashrc 

3.2 Jmeter部署

(1)分别登录5台压测机器,将jmeter打包上传上去,解压:

img

(2)修改.bashrc配置,配置jmeter的bin目录

export JMETER_HOME=/root/apache-jmeter-5.2.1
export PATH=${JMETER_HOME}/bin:${JAVA_HOME}/bin:$PATH

​ 修改后,执行source ~/.bashrc生效

source ~/.bashrc

(3)设置jmeter分布式压测

​ 修改 /apache-jmeter-5.2.1/bin/jmeter.properties,设置remote_hosts;

​ ip设置为压测机器,端口通常设置为1099

remote_hosts=ip1:port,ip2:port,ip3:port,ip4:port,ip5:port;

​ 修改server.rmi.ssl.disable=true

server.rmi.ssl.disable=true

3.3 TarsJmeter插件替换

​ 分别登录5台压测机器,上传插件:

​ TencentJMeter_tars-1.0.jar 到 /apache-jmeter-5.2.1/lib/ext

3.4 清理环境,启动Jmeter

​ 分别登录5台压测机器,执行以下操作:

(1)清理环境:

ps aux | grep jmeter | xargs kill -9
rm -rf nohup.out
rm -rf jmeter-server.log
rm -rf taf/nohup.out

(2)每个机器执行对应ip的命令,启动jmeter:

nohup jmeter-server -Djava.rmi.server.hostname=本机ip -n &

3.5 常见问题

(1)执行用例时,出现Engine is busy…

img

​ 解决方法:执行3.4进行环境清理

(2)启动Jmeter时提示无权限

​ 解决方法:

sudo chmod -R 777 apache-jmeter-5.2.1

(3)运行用例时提示 Connection refused to host

img

解决方法:

​ 修改master机器的 jmeter.bat:

set rmi_host=-Djava.rmi.server.hostname=本机ip

​ 修改salve机器的 jmeter-server:

RMI_HOST_DEF=-Djava.rmi.server.hostname=本机ip

四、用例执行

4.1 测试前确认

(1)确认压测环境能否通过内网访问被测环境

telnet ip port

​ 若不是同一账号下的腾讯云机器,内网ip不通,需要另外准备测试机。

(2)确认压测环境能否访问influxdb的ip

telnet ip port

​ 如果不通,提供出口ip和被访ip,找运维开白名单:

curl cip.cc  # 查看出口ip
nslookup 域名  # 查看被访ip

4.2 执行用例

(1)上传用例

​ 登录master机器,上传jmx文件放到 /taf 目录下

(2)/taf 目录下,执行:

nohup jmeter -n -t xxx.jmx -r &

​ 若需要生成jmeter原生报告(.jtl),则使用以下命令:

nohup jmeter -n -t xxx.jmx -r -l report.jtl &

​ 备注:nohup 是为了将进程放到后台运行,避免跳板机中断导致的各种问题。如,强制中断会导致无法停止运行,下次执行出现Engine is busy,此时需要清理环境(详见3.4)。

4.3 停止测试

​ 登录master机器,根目录执行命令:

stoptest.sh
shutdown.sh

五、测试结果查看

5.1 查看当前执行情况

​ 登录master机器,进入执行用例的目录,执行命令:

cat nohup.out

5.2 Jmeter原生报告

(1)执行用例时使用 -l 生成 .jtl 报告

nohup jmeter -n -t xxx.jmx -r -l report.jtl &

(2).jtl 转 .html

jmeter -g report.jtl所在目录 -o 生成结果目录

img

5.3 grafana实时图表

​ 后端监听器将测试结果传入influxdb,grafana再从influxdb读取数据进行展示。方便实时查看测试结果。

img

img

六、常用测试指标

6.1 QPS

​ QPS是后台服务压测最常见的指标。

​ 影响QPS的可能因素有很多,从宏观归结来看,主要可以分为两个:耗时、CPU。不同因素的影响,通常都是对耗时和CPU产生影响。

如何测试QPS极限值?

预估最大值QPS = 1000ms / CPU Time x CPU核数 x CPU使用率

​ 但实际测试过程中,由于种种原因,通常会遇到没有压到预期最大QPS的情况。比如,CPU使用率没有压满,但QPS不再上涨。如何判断此时的QPS是否已经达到极限值?

​ 根据实践经验总结,随着压测线程数的增加,会得到一个QPS极限值。之后再增加线程数,会导致响应耗时上涨,而QPS不再变化。因此我们需要通过设置合理的线程数,来达到该极限值:

​ 1、验证单个请求的响应时间(RT)

2、预估线程数 = RT x CPU核数 x 单CPU使用率 = RT x CPU核数 x 100%

img

6.2 耗时

客户端RT = 服务端RT + 网络开销 = CPU Time + Wait Time + 网络开销

​ 由于使用内网压测,避免了网络开销对耗时的影响。因此这里的耗时基本上是服务端本身的响应耗时。

​ RT通常会随着压测线程数增加而上涨,因此这里会取QPS达到极限值时的响应耗时。TMF一般要求服务响应耗时在300ms之内。

6.3 错误率

6.4 CPU使用率

​ CPU使用率通常可以作为参考标准,用以判断QPS是否已达到预期极限值。假设被测环境为4核CPU,CPU使用率被压满可到400%(实际通常到380%-390%,服务器自身预留)。

​ 如果CPU使用率未被压满,但QPS已经到达极限值,则需要排查瓶颈点。根据经验总结,瓶颈通常为后端服务。(如:压测网关,但后端转发服务耗时高)

七、测试场景

​ 根据不同需求(被测服务)的要求,通常会选择不同的测试场景。目前TMF压测中,负载测试和稳定性测试为必选项。

7.1 基准测试

​ 在给系统施加较低压力时,查看系统的运行状况并记录相关数据作为基础。

7.2 负载测试

​ 是指对系统不断地增加压力或增加一定压力下的持续时间,知道系统的某项或多项性能指标达到安全临界值,例如某种资源已经达到饱和状态等。

7.3 压测测试

​ 压力测试是评估系统处于或超过预期负载时的运行情况,关注点在于系统在峰值负载或超出最大载荷情况下的处理能力。

7.4 稳定性测试

​ 在给系统加载一定业务压力的情况下,给系统运行一段时间,以此检测系统是否稳定。

7.5 并发测试

​ 测试多个用户同时访问同一应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题。

7.6 高耗时测试

​ 验证后端调用服务返回耗时高的情况下,当前被压测服务的处理情况。

八、问题定位

待补充 ## 九、压测心得
  1. 压测过程出现性能瓶颈,若压测机任务管理器查看到的cpu、网络都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题
  2. 通常影响性能的因素可能包括:数据库、应用程序、中间件、网络、操作系统等
  3. 若吞吐量大于并发数,则可以慢慢的往上面增加;若压测机性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢往下减,找到最佳的并发数
  4. 在实际的业务过程中,请求之间是有一定时间的停顿的,所以在请求之间设置合理的延时是必须的,也是更接近用户真实业务情况。除此之外,在大多数时候如果要在压测过程中完全模拟真实业务场景,还需要做大量的功能调研与用户使用调研,尽可能实现场景的真实覆盖,只有越接近真实,才能尽早挖掘出系统的瓶颈和准确评估系统的性能指标。

文档信息

Search

    Table of Contents