Boomer

A better load generator for locust, written in golang.
Alternatives To Boomer
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Leveldb32,73139 days ago1February 27, 2018280bsd-3-clauseC++
LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.
Fastify27,4781,1311,76416 hours ago235September 14, 202289otherJavaScript
Fast and low overhead web framework, for Node.js
Fasthttp19,6326451,9576 days ago175September 03, 202271mitGo
Fast HTTP package for Go. Tuned for high performance. Zero memory allocations in hot paths. Up to 10x faster than net/http
Benchmarkdotnet9,0521,125942 days ago57August 26, 2022210mitC#
Powerful .NET library for benchmarking
Frameworkbenchmarks6,978
a day ago121otherJava
Source for the TechEmpower Framework Benchmarks project
Web Frameworks6,674
14 hours ago13April 27, 2021192mitPHP
Which is the fastest web framework?
Bigcache6,50120649520 days ago34April 04, 202279apache-2.0Go
Efficient cache for gigabytes of data written in Go.
Criterion.rs3,4692453,1266 days ago23September 10, 2022119apache-2.0Rust
Statistics-driven benchmarking library for Rust
Jquery Dynatable2,788
4 years ago1March 31, 2015232otherJavaScript
A more-fun, semantic, alternative to datatables
Tsung2,397
3 months ago1February 27, 2018123gpl-2.0Erlang
Tsung is a high-performance benchmark framework for various protocols including HTTP, XMPP, LDAP, etc.
Alternatives To Boomer
Select To Compare


Alternative Project Comparisons
Readme

boomer Build Status Go Report Card Coverage Status Documentation Status

Links

Description

Boomer is a better load generator for locust, written in golang. It can spawn thousands of goroutines to run your code concurrently.

It will listen and report to the locust master automatically, your test results will be displayed on the master's web UI.

Use it as a library, not a general-purpose benchmarking tool.

Versioning

Boomer used to support all versions of locust, even if locust didn't keep backward compatibility.

Now boomer follows locust's versioning, and the master branch works with locust's master branch.

If locust introduces breaking changes, boomer will have a tagged version that works previous version of locust.

Install

# Install the master branch
$ go get github.com/myzhan/[email protected]
# Install a tagged version that works with locust 1.6.0
$ go get github.com/myzhan/[email protected]

Build

Boomer use gomq by default, which is a pure Go implementation of the ZeroMQ protocol.

Because of the instability of gomq, you can switch to goczmq.

# use gomq
$ go build -o a.out main.go
# use goczmq
$ go build -tags 'goczmq' -o a.out main.go

If you fail to compile boomer with gomq, try to update gomq first.

$ go get -u github.com/myzhan/gomq

Examples(main.go)

This is a example of boomer's API. You can find more in the "examples" directory.

package main

import "time"
import "github.com/myzhan/boomer"

func foo(){
    start := time.Now()
    time.Sleep(100 * time.Millisecond)
    elapsed := time.Since(start)

    /*
    Report your test result as a success, if you write it in locust, it will looks like this
    events.request_success.fire(request_type="http", name="foo", response_time=100, response_length=10)
    */
    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)

    /*
    Report your test result as a failure, if you write it in locust, it will looks like this
    events.request_failure.fire(request_type="udp", name="bar", response_time=100, exception=Exception("udp error"))
    */
    boomer.RecordFailure("udp", "bar", elapsed.Nanoseconds()/int64(time.Millisecond), "udp error")
}

func main(){
    task1 := &boomer.Task{
        Name: "foo",
        // The weight is used to distribute goroutines over multiple tasks.
        Weight: 10,
        Fn: foo,
    }

    task2 := &boomer.Task{
        Name: "bar",
        Weight: 20,
        Fn: bar,
    }

    boomer.Run(task1, task2)
}

Run

For debug purpose, you can run tasks without connecting to the master.

$ go build -o a.out main.go
./a.out --run-tasks foo,bar

Otherwise, start the master using the included dummy.py.

$ locust --master -f dummy.py

--max-rps means the max count that all the Task.Fn can be called in one second.

The result may be misleading if you call boomer.RecordSuccess() more than once in Task.Fn.

$ go build -o a.out main.go
$ ./a.out --max-rps 10000

If you want the RPS increase from zero to max-rps or infinity.

$ go build -o a.out main.go
# The default interval is 1 second
$ ./a.out --request-increase-rate 10
# Change the interval to 1 minute
# Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h"
$ ./a.out --request-increase-rate 10/1m

So far, dummy.py is necessary when starting a master, because locust needs such a file.

Don't worry, dummy.py has nothing to do with your test.

Profiling

You may think there are bottlenecks in your load generator, don't hesitate to do profiling.

Both CPU and memory profiling are supported.

It's not suggested to run CPU profiling and memory profiling at the same time.

CPU Profiling

# 1. run locust master.
# 2. run boomer with cpu profiling for 30 seconds.
$ go run main.go -cpu-profile cpu.pprof -cpu-profile-duration 30s
# 3. start test in the WebUI.
# 4. run 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

Memory Profiling

# 1. run locust master.
# 2. run boomer with memory profiling for 30 seconds.
$ go run main.go -mem-profile mem.pprof -mem-profile-duration 30s
# 3. start test in the WebUI.
# 4. run pprof and try 'go tool pprof --help' to learn more.
$ 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

Exporter

If you are not satisfied with the build-in web monitor in Locust, you can run prometheus_exporter.py instead of dummy.py as your master.

Try this

$ locust --master -f prometheus_exporter.py

Thanks to Prometheus and Grafana, you will get an awesome dashboard: Locust for Prometheus

Contributing

If you are enjoying boomer and willing to add new features to it, you are welcome.

Also, good examples are welcome!!!

License

Open source licensed under the MIT license (see LICENSE file for details).

Popular Benchmark Projects
Popular Performance Projects
Popular Software Performance Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Golang
Benchmark
Performance
Cpu
Prometheus
Profiling
Performance Testing