一款简单易用、多平台支持的开源HTTP压测工具

时间:2024-12-07 17:56:23

大家好,今天给大家分享一个多功能的 HTTP 负载测试工具和库Vegeta,它用于对 HTTP 服务进行负载测试,可模拟持续的请求速率,以评估服务在不同负载下的性能表现,帮助开发人员和运维人员发现系统瓶颈、优化资源配置和确保服务的可靠性。

项目介绍

Vegeta是一款专为HTTP负载测试设计的强大工具,支持通过命令行界面直接操作以及作为开发包集成进项目中。

Vegeta设计初衷是为了以恒定的请求速率对HTTP服务进行压力测试。它以其极高的灵活性和易用性脱颖而出,被誉为”超过9000”的力量象征。

核心特性

命令行与库双重功能:既可以作为命令行工具直接使用,也能作为 Go 库集成到其他项目中,提供了灵活的使用方式,满足不同场景下的需求。

UNIX 风格设计:命令行设计遵循 UNIX 的组合性原则,方便与其他 UNIX 工具配合使用,提高工作效率。

避免协调遗漏(Coordinated Omission):在测试过程中能够更准确地模拟实际情况,减少因测试方法不当导致的结果偏差。

丰富的报告功能:可以生成多种格式(如文本、JSON、直方图等)的详细报告,包括请求总数、速率、吞吐量、延迟(最小值、平均值、百分位数、最大值)、字节输入输出、成功率、状态码分布、错误集合等信息,帮助用户全面了解测试结果。

分布式测试支持:易于进行分布式负载测试,通过简单的配置和组合多个测试节点,可实现大规模的负载模拟,适用于对高并发场景的测试需求。

易于安装与运行:提供预编译的可执行文件,支持多种操作系统(如 macOS、Arch Linux、FreeBSD 等)的包管理器安装方式,也可以从源代码编译安装,同时还支持静态二进制文件部署,方便在不同环境中快速部署和使用。

应用场景

网站性能评估:在新功能上线前进行压力测试,确保系统稳定。

微服务架构测试:针对分布式系统的API接口进行压力测试,检验其扩展性和容错性。

云环境优化:评估不同云提供商的服务质量和资源利用率。

监控系统集成:通过Prometheus导出接口集成到监控系统中,实时监测系统性能。

安装使用

安装

可从项目官方网站获取适用于不同操作系统的预编译版本。

部分系统也可通过包管理器安装。

macOS

可使用 Homebrew

brew update && brew install vegeta

或 MacPorts

port install vegeta

Arch Linux

pacman -S vegeta

FreeBSD

利用内置包管理器安装

pkg install vegeta

源代码编译

git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
mv vegeta ~/bin # Or elsewhere, up to you.

使用

基本测试

echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report

进行简单的 5 秒攻击测试,将结果保存到results.bin并生成报告。

生成 JSON 报告

vegeta report -type=json results.bin > metrics.json

将测试结果转换为 JSON 格式报告。

生成延迟图表

cat results.bin | vegeta plot > plot.html

根据测试结果生成延迟图表。

分布式测试

在多台机器上进行分布式测试时,先确保每台机器的文件描述符和进程限制设置较高,然后在每台机器上执行相应的攻击命令:

echo "GET http://target/" | vegeta attack -rate=20000 -duration=60s > result.bin

最后收集结果文件并使用命令:

vegeta report *.bin

生成报告。

实时分析

需结合其他工具一起使用,在 iTerm 中与jplot和jaggr结合,执行命令:

echo 'GET http://localhost:8080' | \
    vegeta attack -rate 5000 -duration 10m | vegeta encode | \
    jaggr @count=rps \
          hist\[100,200,300,400,500\]:code \
          p25,p50,p95:latency \
          sum:bytes_in \
          sum:bytes_out | \
    jplot rps+code.hist.100+code.hist.200+code.hist.300+code.hist.400+code.hist.500 \
          latency.p95+latency.p50+latency.p25 \
          bytes_in.sum+bytes_out.sum

作为Golang库使用

package main

import (
  "fmt"
  "time"

  vegeta "github.com/tsenart/vegeta/v12/lib"
)

func main() {
  rate := vegeta.Rate{Freq: 100, Per: time.Second}
  duration := 4 * time.Second
  targeter := vegeta.NewStaticTargeter(vegeta.Target{
    Method: "GET",
    URL:    "http://localhost:9100/",
  })
  attacker := vegeta.NewAttacker()

  var metrics vegeta.Metrics
  for res := range attacker.Attack(targeter, rate, duration, "Big Bang!") {
    metrics.Add(res)
  }
  metrics.Close()

  fmt.Printf("99th percentile: %s\n", metrics.Latencies.P99)
}

示例代码展示了如何创建静态目标、攻击者,设置攻击速率和持续时间,收集和处理攻击结果(如计算 99 百分位延迟)。

更多使用方法,请阅读项目文档

总结

无论是对于初学者还是资深工程师而言,Vegeta都提供了从基础到高级应用所需的全部功能。它不仅仅是一个简单的命令行工具,更是一个能够深度集成到开发流程中的强大武器。

通过Vegeta灵活的命令行界面,用户可以轻松地执行各种类型的负载测试,从简单的GET请求到复杂的POST操作,Vegeta都能胜任。而对于那些寻求更高层次定制化需求的开发者,Vegeta作为Go语言库的形式出现,更是为其实现了无缝集成与高度个性化的测试方案。

总之,Vegeta以其卓越的性能和广泛的适用性,成为了现代Web应用性能测试领域中一颗耀眼的明星。

项目地址

https://github.com/tsenart/vegeta

一款简单易用、多平台支持的开源HTTP压测工具 - BTool博客 - 在线工具软件,为开发者提供方便