传统压力测试工具操作复杂,对于一些简单的场景想要快速知道服务器的性能极限,为扩容或者选购服务器提供一些数据参考我开发了这款工具。这个工具已经在以往的很多小项目中为我快速定位系统瓶颈提供了不少帮助。现在我将它开源出来,希望也能帮助到在接单做外包的小伙伴。
项目简介
loadtest 是一个用 Go 语言编写的轻量级负载测试工具,它可以根据目标 URL 的响应时间自动调整并发数,对目标网站进行高效的压力测试。
功能特点
- 自动调整并发数:根据目标 URL 的响应时间自动增加或减少并发数,确保测试结果更加准确。
- 实时统计监控:每 5 秒输出一次测试统计信息,包括请求数、成功数、失败数和平均响应时间。
- 灵活的配置选项:支持自定义初始并发数、最大并发数和目标延迟时间。
- 多平台支持:提供了 Windows、macOS 和 Linux 等多个平台的可执行文件。
- 详细的日志记录:所有测试数据都会记录到日志文件中,方便后续分析。
安装方法
从预编译二进制文件安装
可以从项目的 release 页面直接下载对应平台的可执行文件:
- Windows:
loadtest-windows-amd64.exe或loadtest-windows-arm64.exe - macOS:
loadtest-darwin-amd64或loadtest-darwin-arm64 - Linux:
loadtest-linux-amd64、loadtest-linux-arm64或loadtest-linux-armv7
从源代码编译
- 确保已安装 Go 1.16 或更高版本
- 克隆代码仓库
- 执行
make命令编译
git clone <仓库地址>
cd loadtest
make
使用方法
基本用法
./loadtest -url=<目标URL> [选项]
命令行参数说明
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
-url | string | 空 | 目标 URL(必填) |
-initial-concurrency | int | 10 | 初始并发数 |
-max-concurrency | int | 1000 | 最大并发数 |
-target-latency | duration | 100ms | 目标延迟时间 |
-log | string | loadtest.log | 日志文件路径 |
示例
- 基本测试
./loadtest -url=https://www.baidu.com
- 自定义配置
./loadtest -url=https://www.baidu.com -initial-concurrency=20 -max-concurrency=500 -target-latency=200ms
- 自定义日志文件
./loadtest -url=https://www.baidu.com -log=my_test.log
测试输出
运行测试后,会在控制台显示以下信息:
Load testing started. Logs are written to loadtest.log
Initial concurrency: 10, Max concurrency: 1000, Target latency: 100ms
Press Ctrl+C to stop
按下 Ctrl+C 停止测试后,会输出最终统计结果:
Final Results:
Total Requests: 12345
Successful: 12300
Failed: 45
Average Response Time: 85.23ms
Success Rate: 99.63%
Final Concurrency Level: 150
日志文件
所有测试数据都会记录到指定的日志文件中,每 5 秒输出一次统计信息,格式如下:
2023/01/01 12:00:00 Total - Requests: 1000, Success: 995, Failures: 5, Avg Time: 80ms
2023/01/01 12:00:00 Recent - Requests: 200, Success: 199, Failures: 1, Avg Time: 78ms
技术实现
核心架构
- 采用工作协程池的设计模式,通过调整协程数量来控制并发数
- 使用上下文(Context)来管理协程的生命周期
- 使用读写锁保证统计数据的准确性
自动调整算法
- 如果响应时间低于目标延迟的一半,就会增加 10% 的并发数
- 如果响应时间过高,就会保持当前并发数(未来可以扩展为减少并发数)
- 并发数不会超过设定的最大值