本文的宗旨在于通过简单干净实践的方式教会读者,如何使用JMeter进行工程的压测测试。也同时会介绍到;ApacheBench、Siege 两个更简单压测工具的使用。
压测是开发完成正式上线对外使用前非常重要的一环,尤其是各个互联网大厂,上线的核心应用和在618、双11以及各种大促时间节点下的应用,都需要进行压测摸底,知道一个系统的最大承载量,并基于这样的一个量的安全范围值内设置熔断、限流和降级的指标。—— 而且这也是面试过程中评估你是否真的做过上线系统的能力考察项;你的系统负载量多大、部署多少台服务器、响应时间怎么样、峰值是多少
本文涉及的工程:
这个安装分为本地安装和云服务安装,一般正规的玩法是本地安装后来写测试计划看效果。之后把jmx文件放到云服务器来执行压测。这样才能不受GUI和本地的限制,压测的比较大。本文提供了Docker部署和执行 JMX 压测脚本
因为这是一个纯Java开发的软件,所以需要JDK环境
Mac 下载 apache-jmeter-5.6.2.tgz
、Windows 下载 apache-jmeter-5.6.2.zip
注意官网还有对应的文档,很清晰的介绍了使用方法。脚本:xfg-dev-tech-jmeter/docs/dev-ops/docker-compose.yml
version: '3'
services:
# JMeter是一个功能强大的性能测试工具,可以模拟多种类型的负载,并提供详细的测试报告
# 官网:https://jmeter.apache.org/
# 脚本:jmeter -n -t one.jmx -l one.jtl
Jmeter:
image: justb4/jmeter:5.5
container_name: jmeter
restart: always
environment:
- DISPLAY=:0
- TZ=Europe/Paris
volumes:
- https://bugstack.cn/images/roadmap/tutorial/jmx/:/opt/apache-jmeter-5.5/jmx/
xfg-dev-tech-jmeter/docs/dev-ops/jmx
下是 JMeter 所保存的压测脚本。进入到 apache-jmeter-5.5/bin 目录下;
修改语言有2个方式;
这是 JMeter 压测配置中非常简单的一个测试计划,在这个测试计划下需要包括线程组 - 负责运行
、取样器(压测的接口) - 负责调接口
和至少一个监听器 - 负责看结果
。这样才能完成压测并获得结果。
通过线程组开启对HTTP接口的请求循环操作方式。它可以模拟配置出流量的负载均值请求、峰值请求、逐步加量等场景。
${__groovy((1..5).collect { "rate(" + it*10 + "/sec) random_arrivals(10 sec) pause(1 sec)" }.join(" "))}
- 请求10次,每次都递进。rate(0/min) random_arrivals(10 min) rate(100/min)
、rate(0/min) random_arrivals(5 min) rate(100/min)random_arrivals(100 min)rate(100/min) random_arrivals(5 min) rate(0/min)
- 通过这样的规律,就可以找到如何配置了。rate(0/s) random_arrivals(20 s) rate(10/s) random_arrivals(1 m) rate(10/s)
简单线程组配置起来更简单,也适合一些循环压测的场景。
此外,JMeter 还可以安装插件,设置更多的线程组模型来压测。
JMeter 把对压测的内容,抽象为取样器。包括HTTP接口、FTP服务等。
如图你可以通过这样的方式,在创建好的线程组下,创建一个取样器(HTTP压测接口)。不过这里小傅哥更建议你使用 cURL 方式导入使用。
线程组是各类方式的模拟压测调用,取样器HTTP是压测的接口。那么监听器就是看线程组对取样器HTTP的压测结果。
为了让大家更加方便的测试,不用自己在折腾,可以直接使用测试工程。测试工程内提供了测试的接口,以及对应的 jmx 脚本。启动后就可以执行测试。
<stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
云服务 https://3.cn/1K-cfT7D - 【2核2G - 40G 3M 5.5元1月】【2核2G - 40G 3M带宽 88元1年】,项目学习时如果需要服务器可以用用。如果无对外诉求,本地安装 Docker 也可以。
压测命令:jmeter -n -t one.jmx -l one.jtl
ab -n 10 -c 2 http://localhost:8091/api/jmeter/query_order_info?orderId=100001
siege -c10 -r1 -p http://localhost:8091/api/jmeter/query_order_info?orderId=100001
压测,压的不只是一个接口,而是整个服务的性能,包括;连接池、线程池、缓存、数据库、消息队列、网络、功能逻辑等等,所以我们需要更好的项目来锻炼编程能力和学习压测优化。以下这些项目就非常具有C端和技术组件的代表性。