97. 常用的HTTP服务压测工具

导言

在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug,同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求(服务器实例个数,如需要部署1048G的机器),节约资源成本。

压测相关术语

  • 响应时间(RT) :指系统对请求作出响应的时间.
  • 吞吐量(Throughput) :指系统在单位时间内处理请求的数量
  • QPS每秒查询率(Query Per Second) :“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
  • TPS(TransactionPerSecond):每秒钟系统能够处理的交易或事务的数量
  • 并发连接数:某个时刻服务器所接受的请求总数

压力测试工具

一、ab

ab全称Apache Bench,是Apache自带的性能测试工具。使用这个工具,只须指定同时连接数、请求数以及URL,即可测试网站或网站程序的性能。

通过ab发送请求模拟多个访问者同时对某一URL地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处理时间等统计数据。

命令格式:

ab [options] [http://]hostname[:port]/path

常用参数如下:

  • -n requests 总请求数
  • -c concurrency 一次产生的请求数,可以理解为并发数
  • -t timelimit 测试所进行的最大秒数, 可以当做请求的超时时间
  • -p postfile 包含了需要POST的数据的文件
  • -T content-type POST数据所使用的Content-type头信息

更多参数请查看官方文档。

例如测试某个GET请求接口:

ab -n 10000 -c 100 -t 10 "http://127.0.0.1:8080/api/v1/posts?size=10"

测试POST请求接口:

ab -n 10000 -c 100 -t 10 -p post.json -T "application/json" "http://127.0.0.1:8080/api/v1/post"

二、wrk

wrk是一款开源的HTTP性能测试工具,它和上面提到的ab同属于HTTP性能测试工具,它比ab功能更加强大,可以通过编写lua脚本来支持更加复杂的测试场景。

Mac下安装:

brew install wrk

常用命令参数:

  • -c --conections:保持的连接数
  • -d --duration:压测持续时间(s)
  • -t --threads:使用的线程总数
  • -s --script:加载lua脚本
  • -H --header:在请求头部添加一些参数
  • –latency 打印详细的延迟统计信息
  • –timeout 请求的最大超时时间(s)

使用示例:

wrk -t8 -c100 -d30s --latency http://127.0.0.1:8080/api/v1/posts?size=10

输出结果:

Running 30s test @ http://127.0.0.1:8080/api/v1/posts?size=10
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    14.55ms    2.02ms  31.59ms   76.70%
    Req/Sec   828.16     85.69     0.97k    60.46%
  Latency Distribution
     50%   14.44ms
     75%   15.76ms
     90%   16.63ms
     99%   21.07ms
  198091 requests in 30.05s, 29.66MB read
Requests/sec:   6592.29
Transfer/sec:      0.99MB

三、go-wrk

go-wrkGo语言版本的wrkWindows同学可以使用它来测试,使用如下命令来安装go-wrk

go get github.com/adeven/go-wrk

使用方法同wrk类似,基本格式如下:

go-wrk [flags] url

常用的参数:

  • -H=“User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;”: 由’\n’分隔的请求头
  • -c=100: 使用的最大连接数
  • -k=true: 是否禁用keep-alives
  • -i=false: if TLS security checks are disabled
  • -m=“GET”: HTTP请求方法
  • -n=1000: 请求总数
  • -t=1: 使用的线程数
  • -b=“” HTTP请求体
  • -s=“” 如果指定,它将计算响应中包含搜索到的字符串s的频率

执行测试:

go-wrk -t=8 -c=100 -n=10000 "http://127.0.0.1:8080/api/v1/posts?size=10"

输出结果:

==========================BENCHMARK==========================
URL:                            http://127.0.0.1:8080/api/v1/posts?size=10

Used Connections:               100
Used Threads:                   8
Total number of calls:          10000

===========================TIMINGS===========================
Total time passed:              2.74s
Avg time per request:           27.11ms
Requests per second:            3644.53
Median time per request:        26.88ms
99th percentile time:           39.16ms
Slowest time for request:       45.00ms

=============================DATA=============================
Total response body sizes:              340000
Avg response body per request:          34.00 Byte
Transfer rate per second:               123914.11 Byte/s (0.12 MByte/s)
==========================RESPONSES==========================
20X Responses:          10000   (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)
### 常用的性能试和压力测试工具 在性能试领域,有多种主流工具可供选择,它们根据不同的试需求、部署环境以及技术栈提供支持。以下是一些常见的性能试和压力测试工具: #### 1. **JMeter** Apache JMeter 是一款开源的性能工具,广泛用于试 Web 应用程序、数据库、FTP、LDAP 等系统的性能。它支持多线程并发试,并能够模拟高并发场景,适用于试内网系统中的硬件资源和服务表现[^1]。 ```java // 示例:JMeter 脚本片段(使用 JSR223 Sampler 编写 Groovy 脚本) def response = "Hello, JMeter!" log.info(response) ``` #### 2. **LoadRunner** LoadRunner 是由 Micro Focus 提供的一款商业级性能工具,功能强大且支持多种协议,包括 HTTPHTTPS、Web Services、Citrix、SAP 等。它不仅能够进行负载试,还支持性能调优分析,适合复杂的企业级应用试[^1]。 #### 3. **阿里云 PTS** 阿里云性能服务(Performance Testing Service,PTS)是基于云端的性能工具,能够在防火墙外部生成大规模并发请求,降低了本地部署机的成本与准备周期。该工具特别适合对阿里云上部署的应用进行性能验证,但对非阿里云环境的支持有限。 #### 4. **CloudTest** CloudTest 是另一个基于云的性能试平台,支持从全球多个节点发起试请求,适用于跨地域、分布式系统的性能评估。其优势在于快速启动大规模并发用户,并提供实时监控与数据分析功能。 #### 5. **Gatling** Gatling 是一个基于 Scala 的高性能开源性能工具,专注于 HTTP 协议的试。其特点是支持异步 IO 操作,资源消耗较低,适合高并发、低延迟的试场景。Gatling 提供了简洁的 DSL 脚本语言和详细的 HTML 报告输出[^3]。 ```scala // Gatling 示例脚本 import io.gatling.core.Predef._ import io.gatling.http.Predef._ class BasicSimulation extends Simulation { val httpProtocol = http .baseUrl("http://example.com") .acceptHeader("text/html,application/xhtml+xml") val scn = scenario("BasicSimulation") .exec(http("request_1") .get("/")) setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol) } ``` #### 6. **Locust** Locust 是一个基于 Python 的开源负载工具,支持分布式试架构。它通过编写 Python 脚本来定义用户行为,易于扩展和集成,尤其适合微服务架构下的性能试。Locust 支持动态调整并发用户数,并提供直观的 Web UI 展示实时性能数据。 ```python from locust import HttpUser, task class WebsiteUser(HttpUser): @task def index(self): self.client.get("/") ``` #### 7. **k6** k6 是一个现代化的开源性能工具,专为 DevOps 和 CI/CD 流水线设计。它支持 JavaScript 脚本编写试逻辑,具备良好的可读性和易用性。k6 可以轻松集成到自动化试流程中,并提供丰富的性能指标报告。 ```javascript import http from 'k6/http'; import { check } from 'k6'; export default function () { let res = http.get('https://example.com'); check(res, { 'status is 200': (r) => r.status === 200, }); } ``` #### 8. **Tsung** Tsung 是一个基于 Erlang 的多协议分布式负载工具,支持 HTTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP 等协议。它适合需要大规模并发试的场景,特别是在电信或大型互联网系统中。 #### 9. **The Grinder** The Grinder 是一个 Java 开源的负载试框架,支持灵活的脚本编写(Python/Jython),并可以运行在分布式环境中。它提供了强大的插件机制,适合高级用户进行定制化试需求。 #### 10. **BlazeMeter** BlazeMeter 是一个基于云的性能试平台,兼容 JMeter 脚本,支持一键式执行大规模试任务。它可以在全球多个区域发起试请求,并提供详尽的性能报告和趋势分析,适合企业级用户[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值