boomer 完整地实现了 locust 的通讯协议,运行在 slave 模式下,用 goroutine 来执行用户提供的测试函数,然后将测试结果上报给运行在 master 模式下的 locust。
与 locust 原生的实现相比,解决了两个问题。一是单台施压机上,能充分利用多个 CPU 核心来施压,二是再也不用提防阻塞 IO 操作导致 gevent 阻塞。
boomer 的版本号跟随 locust 的版本,如果 locust 引入不兼容的改动,master 分支会跟随着 locust 做不兼容的改动。同时,当前版本会打上 tag,以便用户继续使用旧版本。
# 安装 master 分支
$ go get github.com/myzhan/boomer
# 安装 v1.6.0 版本
$ go get github.com/myzhan/[email protected]
boomer 默认使用 gomq,一个纯 Go 语言实现的 ZeroMQ 客户端。
由于 gomq 还不稳定,可以改用 goczmq。
# 默认使用 gomq
$ go build -o a.out main.go
# 使用 goczmq
$ go build -tags 'goczmq' -o a.out main.go
如果使用 gomq 编译失败,先尝试更新 gomq 的版本。
$ go get -u github.com/zeromq/gomq
下面演示一下 boomer 的 API,可以在 examples 目录下找到更多的例子。
package main
import "time"
import "github.com/myzhan/boomer"
func foo(){
start := time.Now()
time.Sleep(100 * time.Millisecond)
elapsed := time.Since(start)
/*
汇报一个成功的结果,实际使用时,根据实际场景,自行判断成功还是失败
*/
boomer.RecordSuccess("http", "foo", elapsed.Nanoseconds()/int64(time.Millisecond), int64(10))
}
func bar(){
start := time.Now()
time.Sleep(100 * time.Millisecond)
elapsed := time.Since(start)
/*
汇报一个失败的结果,实际使用时,根据实际场景,自行判断成功还是失败
*/
boomer.RecordFailure("udp", "bar", elapsed.Nanoseconds()/int64(time.Millisecond), "udp error")
}
func main(){
task1 := &boomer.Task{
// 同时跑多个 tasks 的时候,Weight 字段用于分配 goroutines
Weight: 10,
Fn: foo,
}
task2 := &boomer.Task{
Weight: 20,
Fn: bar,
}
// 连接到 master,等待页面上下发指令,支持多个 Task
boomer.Run(task1, task2)
}
为了方便调试,可以单独运行 task,不必连接到 master。
$ go build -o a.out main.go
$ ./a.out --run-tasks foo,bar
--max-rps 表示一秒内所有 Task.Fn 函数能被调用的最多次数。
下面这种情况,如果在同一个 Task.Fn 函数里面多次调用 boomer.RecordSuccess(),那么统计到的 RPS 会超过 10000。
$ go build -o a.out main.go
$ ./a.out --max-rps 10000
线性增长的 RPS,从 0 开始,每秒增加 10 个请求。
$ go build -o a.out main.go
# 默认间隔 1 秒增加 1 次
$ ./a.out --request-increase-rate 10
# 间隔 1 分钟增加 1 次
# 有效的时间单位 "ns", "us" (or "µs"), "ms", "s", "m", "h"
$ ./a.out --request-increase-rate 10/1m
locust 启动时,需要一个 locustfile,随便一个符合它要求的即可,这里提供了一个 dummy.py。
由于我们实际上使用 boomer 来施压,这个文件并不会影响到测试。
如果你觉得压测工具有性能问题,可以使用内置的 pprof 来获取运行时的 CPU 和内存信息,进行排查和调优。
虽然支持,但是不建议同时运行 CPU 和内存信息采样。
# 1. 启动 locust。
# 2. 启动 boomer,进行 30 秒的 CPU 信息采样。
$ go run main.go -cpu-profile cpu.pprof -cpu-profile-duration 30s
# 3. 在 Web 界面上启动测试。
# 4. 运行 pprof。
$ go tool pprof cpu.pprof
Type: cpu
Time: Nov 14, 2018 at 8:04pm (CST)
Duration: 30.17s, Total samples = 12.07s (40.01%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web
# 1. 启动 locust。
# 2. 启动 boomer,进行 30 秒的内存信息采样。
$ go run main.go -mem-profile mem.pprof -mem-profile-duration 30s
# 3. 在 Web 界面上启动测试。
# 4. 运行 pprof。
$ go tool pprof -alloc_space mem.pprof
Type: alloc_space
Time: Nov 14, 2018 at 8:26pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
欢迎给 boomer 提交 PR,无论是新增功能或者是补充使用例子。
Open source licensed under the MIT license (see LICENSE file for details).