Skip to content

基准测试工具

benchmark工具有哪些呢?链接

sysbench

介绍

Sysbench是一款开源的多用途性能基准测试工具,广泛用于测试系统性能,特别是在数据库、CPU、内存、磁盘I/O等领域。以下是对Sysbench的详细介绍:

一、Sysbench的主要特点

  1. 多线程支持:Sysbench支持多线程操作,能够模拟复杂的工作负载场景,从而更准确地评估系统在高并发情况下的性能。
  2. 多领域测试:Sysbench可以用于评估CPU的计算性能、内存的读取和写入性能、磁盘I/O性能以及数据库在不同负载下的性能。
  3. 丰富的测试脚本:Sysbench提供了多种数据库性能测试脚本,如oltp_read_only.lua、oltp_read_write.lua等,方便用户进行针对性的测试。
  4. 低开销:即使有数千个并发线程,Sysbench的开销也很低,能够确保测试结果的准确性。
  5. 易于扩展:用户可以通过在用户提供的Lua脚本中实现预定义的钩子,轻松创建新的基准测试。

二、Sysbench的安装方法

Sysbench可以通过源码编译安装,也可以通过包管理器安装。以下是两种常见的安装方法:

  1. 通过包管理器安装(以CentOS为例):
    • 执行yum install -y automake libtool等命令安装必要的依赖。
    • 下载Sysbench的源码包并解压。
    • 执行./configuremakemake install命令进行编译和安装。
    • 将Sysbench加入环境变量。
  2. 通过源码编译安装
    • 安装必要的依赖,如mysql-community-devel
    • 下载Sysbench的源码包并解压。
    • 执行./autogen.sh./configuremake -jmake install命令进行编译和安装。

三、Sysbench的使用方法

Sysbench的命令语法如下:sysbench [options]... [testname] [command]。其中,testname是测试项名称,command是Sysbench要执行的命令(如prepare、run、cleanup、help),options是配置项。

以下是一些常用的配置项和命令:

  1. 配置项
    • --num-threads=N:指定需要使用的线程总数。
    • --max-requests=N:指定请求总数的上限值。
    • --max-time=N:指定总执行时间的上限值,以秒为单位。
    • --report-interval=N:指定定期报告中间统计数据的时间间隔,单位为秒。
  2. 命令
    • prepare:为测试执行准备操作,如创建必要的文件或填充测试数据库。
    • run:运行指定的测试。
    • cleanup:在测试运行后删除临时数据。
    • help:显示测试的使用信息和可用命令。

四、Sysbench的测试示例

  1. CPU性能测试
    • 使用sysbench cpu --cpu-max-prime=20000 run命令测试CPU的性能。该命令通过寻找最大素数的方式来评估CPU的计算能力。
  2. 内存性能测试
    • 使用sysbench memory --memory-block-size=8K --memory-total-size=10G run命令测试内存的读取和写入性能。该命令可以评估内存的带宽和延迟。
  3. 磁盘I/O性能测试
    • 使用sysbench fileio --file-total-size=10G --file-test-mode=rndrw preparesysbench fileio --file-total-size=10G --file-test-mode=rndrw run命令测试磁盘I/O的性能。该命令可以评估磁盘的吞吐量、延迟和响应能力。
  4. 数据库性能测试
    • 使用sysbench --db-driver=mysql --mysql-user=root --mysql-password=password --mysql-db=test --table-size=1000000 --threads=4 oltp_read_write preparesysbench --db-driver=mysql --mysql-user=root --mysql-password=password --mysql-db=test --table-size=1000000 --threads=4 oltp_read_write run命令测试数据库在不同负载下的性能。该命令可以评估数据库的读写性能和事务吞吐能力。

五、Sysbench的结果分析

Sysbench测试完成后,会生成详细的测试结果报告。用户可以根据报告中的各项性能指标(如总时间、事件总数、每事件执行时间、每请求响应时间等)来评估系统的性能。同时,Sysbench还提供了大量关于速率和延迟的统计数据,包括延迟百分比和直方图,有助于用户更深入地了解系统的性能表现。

综上所述,Sysbench是一款功能强大、易于使用的性能基准测试工具,能够帮助用户全面评估系统的性能表现。无论是对于数据库、CPU、内存还是磁盘I/O等领域的性能测试,Sysbench都能够提供准确、可靠的测试结果。

centOS8安装

https://medium.com/@chachia.mohamed/stress-testing-in-centos-using-sysbench-and-stress-commands-2c4530122c45

先安装epel-release仓库

bash
yum install epel-release -y

再安装sysbench

bash
yum install sysbench -y

ubuntu安装

bash
sudo apt-get update
sudo apt install sysbench

基本用法

https://www.howtoforge.com/how-to-benchmark-your-system-cpu-file-io-mysql-with-sysbench

显示cpu子命令帮助信息

bash
sysbench cpu help

显示fileio子命令帮助信息

bash
sysbench fileio help

数据库测试

参考链接

创建数据库 sbtest

mysql
create database if not exists sbtest character set utf8mb4 collate utf8mb4_general_ci;

准备测试数据

bash
sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=192.168.1.190 --mysql-port=3306 --table-size=1500000 --threads=64 --report-interval=2 oltp_read_write prepare

运行测试

bash
sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-host=192.168.1.190 --mysql-port=3306 --table-size=1500000 --threads=64 --report-interval=2 --time=30 oltp_read_write run

删除测试数据

mysql
drop database sbtest;

fio

提示:推荐使用fio工具做I/O基准测试 链接

centOS8安装fio

bash
yum install fio -y

查看fio版本

bash
fio -version

stress

提示:推荐使用stress产生内存负载和分析

centOS8安装stress

bash
yum install stress -y

iperf

用于网络性能测试

centOS8安装iperf3

bash
yum install iperf3 -y

wrk

https://github.com/wg/wrk

提醒:

  • 官方没有提供二进制 wrk,需要自己在 centOS8 上编译。
  • 使用很少的 CPU 资源即可产生很高的压力

介绍

wrk是一款针对HTTP协议的基准测试开源工具,以下是对wrk压力测试的详细介绍:

一、安装wrk

  1. 在Linux上安装
    • Ubuntu/Debian:
      1. 执行命令sudo apt-get install build-essential libssl-dev git -y
      2. 执行命令git clone https://github.com/wg/wrk.git下载wrk。
      3. 解压并进入wrk目录,执行make命令进行编译。
      4. 编译成功后,将可执行文件移动到/usr/local/bin位置,或者设置一个软连接。
    • CentOS/RedHat/Fedora:
      1. 执行命令sudo yum groupinstall 'Development Tools'
      2. 执行命令sudo yum install -y openssl-devel git
      3. 执行命令git clone https://github.com/wg/wrk.git下载wrk。
      4. 解压并进入wrk目录,执行make命令进行编译。
      5. 编译成功后,将可执行文件移动到/usr/local/bin位置,或者设置一个软连接。
  2. 在MacOS上安装
    • 推荐使用brew的方式安装。首先安装Homebrew,然后执行命令brew install wrk进行安装。
  3. 在Windows上安装
    • wrk只能被安装在类Unix系统上,因此Windows用户需要开启自带的Ubuntu子系统,或者在Docker中运行wrk镜像。

二、使用wrk进行压力测试

  1. 基本使用方法

    • 使用命令wrk <选项> <被测HTTP服务的URL>进行测试。
    • 常用选项包括:
      • -c, --connections <N>:跟服务器建立并保持的TCP连接数量(并发数)。
      • -d, --duration <T>:压测时间。
      • -t, --threads <N>:使用多少个线程进行压测。
      • -s, --script <S>:指定Lua脚本路径,用于自定义测试行为。
      • -H, --header <H>:为每一个HTTP请求添加HTTP头。
      • --latency:在压测结束后,打印延迟统计信息。
      • --timeout <T>:超时时间。
      • -v, --version:打印正在使用的wrk的详细版本信息。
  2. 示例

    • 使用10个线程,200个连接,对百度进行30秒的压测,并打印延迟统计信息:
    bash
    wrk -t 10 -c 200 -d 30s --latency http://www.baidu.com
    • 使用Lua脚本进行POST请求测试:

      1. 编写Lua脚本,例如test-postapi.lua,内容如下:
      lua
      wrk.method = "POST"
      wrk.headers["Content-Type"] = "application/json"
      wrk.body = '{"key":"value"}'
      1. 执行命令进行测试:
      bash
      wrk -t 5 -c 10 -d 1s -s test-postapi.lua http://example.com/api

三、测试结果分析

  1. 延迟:包括平均响应时间、最大响应时间、P95延迟(平均100%的请求中95%已经响应的时间)、P99延迟等。
  2. 吞吐量:即每秒处理的请求数量(QPS)或每秒处理的事务数(TPS)。
  3. 错误统计:包括连接错误、读错误、写错误、超时等。

四、注意事项

  1. 在进行压力测试之前,需要确保被测系统已经准备好,并且网络连通性正常。
  2. 根据被测系统的实际情况,合理设置线程数、连接数、压测时间等参数。
  3. 使用Lua脚本可以自定义测试行为,例如设置POST请求的参数、添加自定义的HTTP头等。
  4. 在分析测试结果时,需要综合考虑延迟、吞吐量、错误统计等多个指标,以全面评估被测系统的性能。

总之,wrk是一款功能强大且易于使用的HTTP基准测试工具,可以帮助开发人员和测试人员有效地评估和优化Web应用的性能。

安装

CentOS8

https://www.cnblogs.com/quanxiaoha/p/10661650.html

编译

bash
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git 
git clone https://github.com/wg/wrk.git
cd wrk
make
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin

内核参数调优

  • 调优文件描述符限制:链接

Ubuntu

参考链接

安装 make 工具

bash
sudo apt install make

安装 gcc 编译环境

bash
sudo apt install build-essential

克隆 wrk 源代码

bash
git clone https://github.com/wg/wrk.git

编译

bash
cd wrk && make

配置 wrk 程序

bash
cp wrk /usr/local/bin/wrk && chmod +x /usr/local/bin/wrk

基础使用

参考 链接 部署基准测试辅助目标

基本用法

bash
wrk -t8 -c512 -d120s --timeout 30 http://192.168.1.185/
  • -t8 表示并发线程数为 8
  • -c512 表示保持打开的连接数为 512
  • -d120s 表示持续测试 120 秒
  • --timeout 30 表示 socket 连接

测试结果打印请求响应延迟的分布

bash
wrk -t8 -c512 -d120s --latency --timeout 30 http://192.168.1.185/
  • --latency 表示打印请求响应延迟的分布

Lua 脚本编程

官方 Lua 脚本编程示例参考

官方 Lua 脚本 API 参考

参考链接

POST 请求

scripts.lua 脚本内容如下:

lua
request = function()
  wrk.headers["Connection"] = "Keep-Alive"
  path = "/api/v1/purchaseProduct?userId=1&productId=1&amount=1"
  return wrk.format("POST", path)
end

运行脚本

bash
wrk -t8 -c512 -d120s --latency --timeout 30 -s scripts.lua http://192.168.1.185/

定时打印报告

提醒:经过研究不提供此特性或者此特性的实现方式。

todo

  • 不是一个线程一个连接吗?
  • 为何 wrk 高性能呢?

wrk2

提醒:暂时没有需求使用它。

参考链接

介绍

wrk2 和 wrk 的核心区别在于吞吐量控制与延迟统计的准确性,具体如下:


  1. 吞吐量控制
  • wrk:
    • 不支持恒定吞吐量控制,线程根据系统负载动态调整请求速率。
    • 适用于需要最大化压测负载的场景,但无法精确控制每秒请求数(RPS)。
  • wrk2:
    • 引入 --rate 参数(或 -R),可强制保持恒定的吞吐量(RPS)。
    • 例如:wrk2 -t4 -c100 -d30s -R1000 http://example.com 表示每秒发送 1000 个请求。
    • 适用于需要精确模拟生产环境负载的场景。

  1. 延迟统计
  • wrk:
    • 使用传统延迟统计模型,基于请求发送到响应完成的时间差。
    • 存在 “协调性遗漏”(Coordinated Omission) 问题:当请求响应时间过长时,可能遗漏部分延迟数据,导致统计结果偏低。
  • wrk2:
    • 修正了延迟统计模型,避免协调性遗漏。
    • 通过记录 “理论发送时间”“实际响应时间” 的差值,确保高延迟请求被正确统计。
    • 提供更精确的延迟分布(如 99.99% 分位延迟)。

  1. 应用场景
  • wrk:
    • 适合快速测试服务器的最大吞吐量或极限性能。
    • 例如:测试服务器在高并发下的崩溃点。
  • wrk2:
    • 适合需要精确模拟生产负载的场景。
    • 例如:测试服务器在固定 RPS 下的响应时间和延迟分布。

  1. 其他差异
  • 参数支持:
    • wrk2 继承了 wrk 的所有参数(如线程数、连接数、持续时间等),并新增了 --rate--latency(更详细的延迟统计)等参数。
  • 复杂性:
    • wrk 更简单易用,适合快速压测。
    • wrk2 需要配置吞吐量参数,适合更精细的性能分析。

总结对比表

特性wrkwrk2
吞吐量控制支持恒定 RPS(--rate
延迟统计存在协调性遗漏修正延迟统计模型
应用场景极限性能测试生产负载模拟
参数扩展新增 --rate 和延迟选项
使用复杂度

推荐选择

  • 如果需要 快速测试极限性能,选择 wrk
  • 如果需要 精确模拟生产负载分析延迟分布,选择 wrk2

CentOS8 编译

参考链接

编译

bash
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git 
git clone https://github.com/giltene/wrk2.git
cd wrk2
make
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin/wrk2

内核参数调优

调优文件描述符限制:链接

JMeter

JMeter 通过分布式部署能够模拟大规模压力。

wrkJMeter 性能对比

结论:wrk 单机很轻松就能够产生 15w/s 的 QPS,但使用 JMeter 分布式部署在 3 台 4核 4G 的 slave 中并单机使用 128 线程才能够产生 15w/s 的 QPS。

ab

注意:不能充分利用压力机的多核,使用 wrk 工具替代。

介绍

ab(Apache Bench)是一个强大的HTTP服务器性能测试工具,它通过模拟多个用户同时访问某一URL地址来测试服务器的负载压力。以下是ab压力测试工具的具体用法:

一、安装ab工具

  1. 如果已经安装了Apache服务器,那么ab工具通常已经包含在Apache的安装包中,可以在Apache的安装目录下的bin目录中找到ab.exe文件。
  2. 如果没有安装Apache服务器,但想单独使用ab工具,可以安装Apache的工具包httpd-tools。例如,在Linux系统中,可以使用包管理工具(如yum)来安装httpd-tools,安装命令为yum install httpd-tools。安装完成后,就可以直接使用ab命令了。

二、ab命令的基本用法

ab命令的基本语法为:ab [options] [http://]hostname[:port]/path。其中,options是ab命令的选项,用于指定测试的参数;[http://]hostname[:port]/path是要测试的URL地址。

三、常用选项及参数说明

  1. -n:指定要执行的请求数。默认时,仅执行一个请求。
  2. -c:设置单次发出的并发请求数。默认是一次一个。
  3. -t:设置测试的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
  4. -p:包含要POST的数据的文件路径。使用该选项时,还需设置-T来指定内容类型。
  5. -T:为POST/PUT数据指定内容类型头,例如'application/x-www-form-urlencoded'。默认情况下,内容类型为'text/plain'。
  6. -v:控制显示的详细程度。值越大,显示的调试信息越多,包括头信息、响应代码和警告等。
  7. -w:以HTML表格格式输出测试结果。默认情况下,结果以简洁的两列表格形式呈现。
  8. -i:执行HEAD请求,而不是GET。
  9. -C:对请求附加一个Cookie行,例如'Apache=1234'。此参数可重复。
  10. -H:在所有标准头信息行之后附加额外的头信息行,例如'Accept-Encoding: gzip'。
  11. -A:对服务器提供BASIC认证信任,其中用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。
  12. -X:指定代理服务器及其端口号。
  13. -V:显示版本号并退出。
  14. -k:启用HTTP KeepAlive功能,以在一个HTTP会话中执行多个请求。
  15. -d:不显示“percentage served within XX [ms] table”的消息,此选项为旧版本提供支持。
  16. -S:不显示中值和标准背离值,且在均值和中值为标准背离值的1到2倍时,不显示警告或出错信息。默认情况下,会显示最小值/均值/最大值等数值。
  17. -q:在处理超过150个请求时,不显示进度信息。ab在处理大量请求时,会在stderr中每处理大约10%或100个请求时输出一个进度计数。使用-q选项可以抑制这些进度信息。

四、使用示例

假设要测试一个Web服务器的性能,可以使用以下命令:

bash
ab -n 10000 -c 100 http://example.com/

这个命令表示:并发100个用户,总共请求10000次,测试的目标URL是http://example.com/。

五、测试结果分析

ab命令执行完成后,会输出详细的测试结果,包括:

  1. Document Length:HTTP响应数据的正文长度。
  2. Time taken for tests:所有请求处理完成所花费的时间。
  3. Complete requests:完成请求数。
  4. Failed requests:失败请求数。
  5. Total transferred:网络总传输量。
  6. HTML transferred:HTML内容传输量。
  7. Requests per second:吞吐量,即每秒请求数。
  8. Time per request:服务器收到请求,响应页面要花费的时间。
  9. Transfer rate:平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题。

此外,ab命令还会输出连接时间、处理时间、等待时间等详细的性能指标,供用户进行进一步的分析和优化。

总的来说,ab压力测试工具是一个简单而强大的工具,可以帮助开发人员和测试人员有效地评估和优化Web应用的性能。

为何只使用一个 cpu 呢?

ApacheBench(ab)工具默认只使用单个CPU核心的原因主要与它的设计目标和实现方式有关:

  1. 单线程模型 ab 采用单线程同步请求模型,即所有请求按顺序串行发送。这种设计简化了实现逻辑,但无法充分利用多核CPU的并行计算能力。每个请求必须等待前一个响应完成后才能发送,形成天然的串行瓶颈。

  2. 设计哲学 ab 的设计初衷是提供轻量级的基准测试能力,而非模拟真实高并发场景。它通过控制请求速率(-R参数)来测量服务器在不同负载下的表现,而非追求极致的压测吞吐量。

  3. 资源控制考量 单线程模式更容易控制测试负载的稳定性,避免多线程带来的资源竞争和不确定性。这在需要精确测量特定并发量下的服务器响应时尤为重要。

  4. 替代方案建议 如果需要更高性能的压测工具,可以考虑:

    • wrk:支持多线程和Lua脚本,能更好利用多核CPU
    • Locust:基于Python的分布式压测工具
    • Gatling:支持异步IO和复杂场景模拟
    • k6:开发者友好的现代化压测工具
  5. 特殊场景优化 即使使用ab,也可通过以下方式提升利用率:

    bash
    # 使用并发连接数(-c)和管道数(-k)参数
    ab -n 10000 -c 100 -k http://example.com/

    通过增加并发连接数(-c),可以在一定程度上提升CPU利用率,但受限于单线程模型,提升幅度有限。

建议根据具体测试需求选择工具:若需要简单快速的基准测试,ab足够;若需模拟真实高并发场景,建议使用更现代的压测工具。

采用单线程同步请求模型,设置并发连接数还有什么意义呢?

您提出的疑问非常关键,这涉及到对 AB 工具并发模型的深入理解。让我们分三个层面解析这个问题:

1. 单线程≠完全串行(连接级并行) 虽然 AB 是单线程处理请求逻辑,但通过 -c 参数设置的并发连接数(Concurrency Level)实际上创造了「连接级并行」。每个连接是一个独立的 HTTP 通道,AB 会:

  • 同时保持 N 个连接打开(N 由 -c 定义)
  • 在每个连接上依次发送请求(保持长连接)
  • 不同连接的请求处理在服务器侧是并行的

2. 吞吐量提升的数学模型 假设:

  • 服务器响应时间为 T(含网络延迟)
  • 并发连接数为 C
  • 单次请求耗时为 S = T + 请求处理时间

理论最大请求速率 ≈ C / S

当 C=1 时,每秒请求数 ≈ 1/S 当 C=100 时,每秒请求数 ≈ 100/S(提升 100 倍)

3. 实际应用中的意义

  • 服务器压力模拟:通过高并发连接数(如 -c 1000),可以测试服务器处理大量并发连接的能力

  • 连接池效应:保持长连接减少 TLS 握手和 TCP 建连开销,更贴近真实浏览器行为

  • 资源利用率观察

    :在服务器端可以通过监控工具(如 htop, netstat)观察:

    • CPU 多核使用情况(虽然 AB 是单线程,但被测服务可能是多线程)
    • 网络带宽饱和度
    • 文件描述符使用量

优化建议

bash
# 典型压测命令结构
ab -n 10000 -c 100 -k -g output.data http://example.com/
# 参数解读:
# -n 总请求数
# -c 并发连接数(建议设置为预估线上并发的 1.5-2 倍)
# -k 启用 HTTP KeepAlive
# -g 生成 gnuplot 兼容性数据文件

进阶替代方案: 若需要更真实的并发模拟,可考虑:

  1. wrk:支持多线程和 Lua 脚本
  2. weighttp:支持异步 IO 和权重压力测试
  3. 分布式压测:使用 JMeter 集群或 Locust 分布式模式

理解 AB 的这种「连接级并行」设计,可以帮助我们更准确地用它进行基础性能测试,同时为选择更合适的工具提供判断依据。

安装

CentOS8

bash
yum install httpd-tools -y

Ubuntu

bash
sudo apt install apache2-utils -y

使用

参考 链接 部署基准测试辅助目标

基本用法

bash
ab -t 60 -n 99999999 -c 64 -k http://192.168.1.185/
  • -t 60 表示持续测试 60 秒
  • -n 99999999 表示测试中总共请求次数为 99999999
  • -c 64 表示 64 个并发连接
  • -k 表示启用 HTTP KeepAlive

Gatling

介绍

Gatling 压力测试工具是一款基于 Scala 开发的高性能开源负载测试工具,专为模拟高并发场景设计,广泛用于测试 Web 应用、API、微服务及其他分布式系统的性能和稳定性。


核心功能与特点

  1. 高性能与高并发支持
    • 基于 Akka 框架和 Netty 网络库,支持每秒数万次请求的模拟,适用于高并发场景。
    • 异步非阻塞 I/O 模型,资源消耗低,适合长时间运行的压力测试。
  2. 灵活的脚本编写
    • 使用 DSL(领域特定语言)编写测试脚本,语法简洁且功能强大。
    • 支持参数化测试、动态数据驱动(如 CSV 文件)、条件逻辑和复杂场景编排。
  3. 实时监控与报告
    • 提供基于 HTML 的动态报告,实时展示请求响应时间、吞吐量、错误率等关键指标。
    • 支持历史数据对比和趋势分析,便于定位性能瓶颈。
  4. 分布式测试
    • 支持多节点分布式部署,可模拟更大规模的并发用户。
    • 通过主从模式协调测试任务,扩展性强。
  5. 协议支持
    • 默认支持 HTTP/HTTPS 协议,适用于 Web 应用和 RESTful API 测试。
    • 提供插件机制,可扩展支持其他协议(如 WebSocket、gRPC、Kafka 等)。
  6. 集成与自动化
    • 支持与 Jenkins、GitLab CI/CD 等持续集成工具集成,实现自动化测试。
    • 可与 Selenium 等工具结合,进行端到端性能测试。

使用场景

  • Web 应用性能测试:模拟高并发用户访问,测试系统在高负载下的响应时间和稳定性。
  • API 性能测试:验证 RESTful API 的吞吐量和错误率,确保接口在高并发场景下的可靠性。
  • 微服务架构测试:测试微服务之间的调用链性能,定位服务间的性能瓶颈。
  • 限时活动压力测试:模拟秒杀、抢购等高并发场景,确保系统能够承受极端流量。

安装与配置

  1. 下载与安装

    • Gatling 官方网站 下载最新版本。
    • 解压后配置 JAVA_HOME 环境变量(Gatling 基于 Java 运行)。
  2. 编写测试脚本

    • 使用 Scala 编写测试脚本,定义用户行为、请求逻辑和测试场景。

    • 示例脚本:

      scala
      import io.gatling.core.Predef._
      import io.gatling.http.Predef._
      import scala.concurrent.duration._
       
      class MySimulation extends Simulation {
        val httpProtocol = http
          .baseUrl("https://example.com")
          .acceptHeader("application/json")
       
        val scn = scenario("Test Scenario")
          .exec(http("Request_1")
            .get("/api/resource"))
          .pause(1)
       
        setUp(
          scn.inject(atOnceUsers(100)) // 模拟 100 个并发用户
        ).protocols(httpProtocol)
      }
  3. 运行测试

    • 将脚本放置在 user-files/simulations 目录下。
    • 执行 gatling.sh(Linux/Mac)或 gatling.bat(Windows)运行测试。
  4. 查看报告

    • 测试完成后,生成 HTML 格式的报告,存储在 results 目录下。

优势与适用性

  • 优势:
    • 性能卓越,适合大规模并发测试。
    • 脚本灵活,易于编写和维护。
    • 报告直观,便于分析测试结果。
  • 适用性:
    • 适合需要高并发测试的场景,如电商大促、API 性能验证等。
    • 对于需要长时间运行的压力测试(如 7×24 小时稳定性测试),Gatling 的资源消耗较低,表现出色。

与其他工具对比

  • 与 JMeter 对比:
    • Gatling 基于代码编写脚本,灵活性更高;JMeter 使用 GUI 界面,适合不熟悉编程的用户。
    • Gatling 性能更强,适合高并发场景;JMeter 在低并发场景下更易用。
  • 与 Locust 对比:
    • Gatling 使用 Scala 编写,Locust 使用 Python 编写,选择取决于团队技术栈。
    • Gatling 的报告功能更强大,Locust 的分布式支持更简单。

总结

Gatling 是一款功能强大、性能卓越的负载测试工具,特别适合高并发场景下的性能测试。其基于代码的脚本编写方式、实时监控和分布式测试能力,使其成为现代性能测试的首选工具之一。无论是 Web 应用、API 还是微服务,Gatling 都能提供可靠的测试支持。

k6

注意:使用单机 wrk 和 k6 对比,发现 wrk 能够产生 18w QPS(CPU 未用满),k6 只能够产生 8w QPS(CPU 已经用满),所以暂时不使用 k6。

官方参考文档

介绍

K6 是一款现代化的开源性能测试工具,主要用于负载测试和性能评估,帮助开发者和测试人员验证系统在高并发场景下的稳定性、可靠性和性能表现。以下是对 K6 测试工具的详细介绍:


1. 主要特点

  • 开源免费:基于 Apache 2.0 许可证,用户可自由使用和修改。
  • 支持多协议:
    • HTTP/1.1、HTTP/2
    • WebSocket
    • gRPC(通过插件或扩展支持)
  • 脚本语言:使用 JavaScript/ES6 编写测试脚本,语法简洁,易于上手。
  • 高并发性能:基于 Go 语言 开发,单实例可模拟数千个虚拟用户(VUs)。
  • 实时监控与报告:
    • 提供实时性能指标(如响应时间、吞吐量、错误率等)。
    • 支持生成 HTML、JSON 等格式的详细报告。
  • 分布式测试:支持在多台机器上分布式运行测试,模拟更大规模的负载。
  • 扩展性强:提供丰富的插件和扩展机制,支持自定义指标、数据源和报告格式。

2. 使用场景

  • 负载测试:模拟高并发用户访问,测试系统的承载能力。
  • 性能基准测试:对比不同版本或配置下的性能差异。
  • 稳定性测试:长时间运行测试,检查系统在高负载下的稳定性。
  • API 测试:验证 API 的响应时间、吞吐量和正确性。
  • 微服务测试:测试微服务架构中的服务间调用性能。

3. 核心功能

  • 虚拟用户(VUs):
    • 模拟并发用户行为,支持动态调整 VUs 数量。
    • 支持阶段式负载(stages),例如逐步增加并发用户数。
  • 请求类型:
    • 支持 GET、POST、PUT、DELETE 等 HTTP 方法。
    • 支持 WebSocket 连接和消息发送。
  • 断言(Assertions):
    • 可设置请求响应时间、状态码等断言条件。
    • 支持自定义断言逻辑。
  • 指标收集:
    • 内置多种性能指标,如请求响应时间、吞吐量、错误率等。
    • 支持自定义指标收集。
  • 报告生成:
    • 生成详细的测试报告,包括图表和数据表格。
    • 支持将报告导出为 HTML、JSON 等格式。

4. 安装与使用

  • 安装:

    • 可通过包管理器安装(如 Homebrew、Chocolatey)或直接下载二进制文件。
    • 支持在 macOS、Windows、Linux 等操作系统上运行。
  • 编写测试脚本:

    • 使用 JavaScript 编写测试逻辑,定义虚拟用户的行为。

    • 示例脚本:

      javascript
      import http from 'k6/http';
      import { sleep } from 'k6';
       
      export default function () {
        http.get('https://test.k6.io');
        sleep(1); // 模拟用户思考时间
      }
  • 运行测试:

    • 使用命令行运行测试脚本:

      bash
      k6 run script.js
    • 可指定并发用户数、持续时间等参数:

      bash
      k6 run --vus 10 --duration 30s script.js

5. 优势与局限性

  • 优势:
    • 简单易用:JavaScript 脚本语法,开发人员上手快。
    • 高性能:单实例可模拟高并发,适合大规模负载测试。
    • 灵活扩展:支持插件和自定义指标,满足不同测试需求。
    • 开源社区:活跃的社区支持,持续更新和改进。
  • 局限性:
    • 需要编写脚本,对新手有一定学习成本。
    • 原生不支持某些协议(如 gRPC),需要依赖插件或扩展。
    • 不支持图形化界面,所有操作需通过命令行完成。

6. 适用场景

  • Web 应用:测试网站在高并发下的响应速度和稳定性。
  • API 服务:验证 API 的性能和可靠性。
  • 微服务架构:测试服务间的调用性能和容错能力。
  • CI/CD 集成:与持续集成/持续部署工具集成,实现自动化性能测试。

7. 相关资源


总结

K6 是一款功能强大、灵活且易用的性能测试工具,特别适合需要模拟高并发场景的测试需求。其基于 JavaScript 的脚本语言和丰富的插件生态,使其能够适应各种复杂的测试场景。如果你需要一款高效的性能测试工具,K6 是一个值得考虑的选择。

安装

CentOS8

参考 链接

bash
sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6

编写测试 链接

javascript
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 2048,
  duration: '15s',
};
export default function () {
  http.get('http://192.168.1.185');
}

运行测试 链接

bash
k6 run test.js