Go 性能压测工具之wrk介绍与使用

在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug;压力测试(压测)是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景,可以评估系统的性能瓶颈、可靠性和稳定性,进而优化系统架构和资源配置。

一、压力测试相关术语

  • 响应时间 (RT):指系统对请求作出响应的时间。

  • 吞吐量 (Throughput):指系统在单位时间内处理请求的数量。

  • QPS(每秒查询率,Query Per Second):“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

  • TPS(Transaction Per Second):每秒钟系统能够处理的交易或事务的数量。

  • 并发连接数:某个时刻服务器所接受的请求总数。

二、安装wrk

2.1 使用Homebrew 安装

brew install wrk

2.2 编译安装

使用Git 下载源码

# 1. 切换到待安装的目录
cd /usr/local/src

# 2. 免提示(-y), 安装 git
yum install git -y

# 3. 下载 wrk 源码
git clone https://github.com/wg/wrk.git

克隆完成后,进入wrk目录并执行make命令进行编译。这个命令会编译wrk并生成可执行文件:

# 4. 进入安装文件夹
cd wrk

# 5. 下载 gcc 编译器, 并编译
yum -y install gcc
make

编译成功后,你会得到一个名为wrk的可执行文件。为了能够在任何目录下运行wrk,你可以将其移动到系统的PATH环境变量中的某个目录,或者直接将wrk的目录添加到PATH环境变量中。如果你不确定如何操作,可以查阅相关的操作系统文档。

在Linux系统中,你可以使用以下命令将wrk添加到PATH环境变量(假设你的当前用户是user):

# 6. 创建软连接, 方便全局调用
ln -s /usr/local/src/wrk/wrk /usr/local/bin

2.3 测试是否安装成功

在使用 wrk 之前,你可以通过 wrk --help 命令来查看所有可用的命令行选项。这个命令会输出 wrk 的使用说明和所有支持的参数。

三、wrk 命令基本使用

3.1 常用命令参数

  • -c, --connections: 每个线程建立的连接数(并发数)。默认值为 200。
  • -d, --duration: 测试持续时间,例如 2s2m2h。默认值为 10 秒。
  • -t, --threads: 用于执行测试的线程数。默认值为 2。
  • -s, --script: 指定一个 Lua 脚本来处理自定义请求或响应。
  • -H, --header: 添加 HTTP 请求头,可以多次使用此参数来添加多个头部。
  • --latency: 打印详细的延迟统计信息。
  • --timeout: 设置请求超时时间,默认为无穷大。
  • --body: 指定请求体,可以是一个文件路径或直接的数据。
  • --rate: 限制请求速率(每秒请求数),默认不限速。

3.2 执行测试

执行如下命令:

wrk -t1 -d1s -c2 -s ./scripts/wrk/signup.lua http://localhost:8080/users/signup

这个命令是使用 wrk 这个 HTTP 压力测试工具来对本地主机上的一个用户注册接口进行测试。下面是命令中每个部分的解释:

  • wrk: 命令的名称,表示执行 wrk 工具。
  • -t1: -t 选项后面跟着的 1 表示使用 1 个线程来进行测试。
  • -d1s: -d 选项后面跟着的 1s 表示测试的持续时间是 1 秒。
  • -c2: -c 选项后面跟着的 2 表示每个线程保持 2 个连接打开。
  • -s ./scripts/wrk/signup.lua: -s 选项后面跟着的路径 ./scripts/wrk/signup.lua 表示加载一个 Lua 脚本,这个脚本用于自定义请求或处理响应。在这个例子中,脚本可能是用来模拟用户注册的请求。
  • http://localhost:8080/users/signup: 这是测试的目标 URL,即本地主机上的用户注册接口,监听在 8080 端口。
    综合来看,这个命令会使用 1 个线程在 1 秒内对 http://localhost:8080/users/signup 接口发起压力测试,每个线程保持 2 个连接,并且使用 ./scripts/wrk/signup.lua 脚本来自定义请求的内容,可能是模拟用户注册的行为。

3.3 输出结果

输出结果如下:

Running 1s test @ http://localhost:8080/users/signup
  1 threads and 2 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    64.63ms  711.72us  67.28ms   90.00%
    Req/Sec    29.80     10.76    40.00     80.00%
  30 requests in 1.01s, 3.78KB read
Requests/sec:     29.81
Transfer/sec:      3.76KB

这个输出是 wrk 执行完压力测试后的统计结果。下面是对每个部分的解释:

  • Running 1s test @ http://localhost:8080/users/signup: 这行显示的是测试的配置,包括测试持续时间(1秒)和测试的目标 URL(本地主机的用户注册接口)。
  • 1 threads and 2 connections: 这行显示的是测试使用的线程数(1个线程)和每个线程建立的连接数(2个连接)。
  • Thread Stats: 这部分显示的是线程级别的统计信息,包括平均延迟、延迟的标准差、最大延迟以及延迟分布在平均值正负一个标准差内的百分比。
    • Avg: 平均延迟,这里是 64.63 毫秒。
    • Stdev: 延迟的标准差,这里是 711.72 微秒。
    • Max: 最大延迟,这里是 67.28 毫秒。
    • +/- Stdev: 延迟分布在平均值正负一个标准差内的百分比,这里是 90.00%。
  • Req/Sec: 这部分显示的是每秒请求数的统计信息,包括平均请求数、请求数的标准差、最大请求数以及请求数分布在平均值正负一个标准差内的百分比。
    • Avg: 平均每秒请求数,这里是 29.80。
    • Stdev: 每秒请求数的标准差,这里是 10.76。
    • Max: 最大每秒请求数,这里是 40.00。
    • +/- Stdev: 每秒请求数分布在平均值正负一个标准差内的百分比,这里是 80.00%。
  • 30 requests in 1.01s, 3.78KB read: 这行显示的是在测试期间总共完成了 30 个请求,耗时 1.01 秒,读取了 3.78KB 的数据。
  • Requests/sec: 这显示的是平均每秒完成的请求数,这里是 29.81。
  • Transfer/sec: 这显示的是平均每秒读取的数据量,这里是 3.76KB。
    总结来说,这个测试在 1 秒内使用 1 个线程和 2 个连接对本地主机的用户注册接口进行了压力测试,平均每秒可以完成大约 29.81 个请求,平均延迟大约为 64.63 毫秒。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容