boomer 完整地实现了 locust 的通讯协议,运行在 slave 模式下,用 goroutine 来执行用户提供的测试函数,然后将测试结果上报给运行在 master 模式下的 locust。
与 locust 原生的实现相比,解决了两个问题。一是单台施压机上,能充分利用多个 CPU 核心来施压,二是再也不用提防阻塞 IO 操作导致 gevent 阻塞。
go get github.com/myzhan/boomer
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 "github.com/myzhan/boomer"
import "time"
func foo(){
start := boomer.Now()
time.Sleep(100 * time.Millisecond)
elapsed := boomer.Now() - start
/*
汇报一个成功的结果,实际使用时,根据实际场景,自行判断成功还是失败
*/
boomer.Events.Publish("request_success", "http", "foo", elapsed, int64(10))
}
func bar(){
start := boomer.Now()
time.Sleep(100 * time.Millisecond)
elapsed := boomer.Now() - start
/*
汇报一个失败的结果,实际使用时,根据实际场景,自行判断成功还是失败
*/
boomer.Events.Publish("request_failure", "udp", "bar", elapsed, "udp error")
}
func main(){
task1 := &boomer.Task{
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.Events.Publish("request_success"),那么统计到的 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).