Package: wnpp
Severity: wishlist

* Package name    : golang-bombardier
  Version         : 1.2.4
  Upstream Author : Максим Федосеев
* URL             : https://github.com/codesenberg/bombardier
* License         : MIT/X
  Programming Lang: Golang
  Description     : Fast cross-platform HTTP benchmarking tool written in Go

bombardier is a HTTP(S) benchmarking tool. It is written in Go
programming language and uses excellent fasthttp instead of Go's
default http library, because of its lightning fast performance.

With bombardier v1.1 and higher you can now use net/http client if you
need to test HTTP/2.x services or want to use a more RFC-compliant
HTTP client.

====

There are many HTTP benchmarking tools in Debian, but many suffer from
significant bitrot. Tools like `siege` or `ab` (part fo apache2-utils)
do not support HTTP/2, for example. Both of those also suffer from
significant performance limitations when compared to bombardier. A
simple benchmark of the three, for example, shows bombardier performs
much better on a minimalist Hetzner virtual machine (CX11):

Siege:

    root@cache-02:~# siege
    ** SIEGE 4.0.4
    ** Preparing 100 concurrent users for battle.
    The server is now under siege...
    Lifting the server siege...
    Transactions:                      28895 hits
    Availability:                     100.00 %
    Elapsed time:                     119.73 secs
    Data transferred:         285.18 MB
    Response time:                      0.40 secs
    Transaction rate:         241.33 trans/sec
    Throughput:                 2.38 MB/sec
    Concurrency:                       96.77
    Successful transactions:       28895
    Failed transactions:                   0
    Longest transaction:                1.26
    Shortest transaction:               0.05

Load went to about 2 (`Load average: 1.65 0.80 0.36` after test), with
one CPU constantly busy and the other at about 50%, memory usage was
low (~800M).

ab:

    # ab -c 100 -n 1000 https://blog.torproject.org/
    [...]
    Server Software:        ATS/8.0.2
    Server Hostname:        blog.torproject.org
    Server Port:            443
    SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,4096,256
    Server Temp Key:        X25519 253 bits
    TLS Server Name:        blog.torproject.org

    Document Path:          /
    Document Length:        53320 bytes

    Concurrency Level:      100
    Time taken for tests:   4.010 seconds
    Complete requests:      1000
    Failed requests:        0
    Total transferred:      54421000 bytes
    HTML transferred:       53320000 bytes
    Requests per second:    249.37 [#/sec] (mean)
    Time per request:       401.013 [ms] (mean)
    Time per request:       4.010 [ms] (mean, across all concurrent requests)
    Transfer rate:          13252.82 [Kbytes/sec] received

    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:       23  254 150.0    303     549
    Processing:    14  119  89.3    122     361
    Waiting:        5  105  89.7    105     356
    Total:         37  373 214.9    464     738

    Percentage of the requests served within a certain time (ms)
      50%    464
      66%    515
      75%    549
      80%    566
      90%    600
      95%    633
      98%    659
      99%    675
     100%    738 (longest request)

Bombardier results are much better and pretty much max out the gigabit
connexion:

    $ ./go/bin/bombardier --duration=2m --latencies https://blog.torproject.org/
    Bombarding https://blog.torproject.org:443/ for 2m0s using 125 connection(s)
    [=========================================================================] 
2m0s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec      2021.18     572.50    5462.41
      Latency       62.82ms    22.98ms      1.62s
      Latency Distribution
         50%    60.43ms
         75%    69.43ms
         90%    80.59ms
         95%    91.31ms
         99%   156.62ms
      HTTP codes:
        1xx - 0, 2xx - 238797, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:   103.73MB/s

It might be because it supports doing HTTP/2 requests and, indeed, the
`Throughput` drops down to `14MB/s` when we use the `--http1` flag,
along with rates closer to ab:

    anarcat@cache-02:~$ ./go/bin/bombardier --duration=2m --latencies 
https://blog.torproject.org/ --http1
    Bombarding https://blog.torproject.org:443/ for 2m0s using 125 connection(s)
    [=========================================================================] 
2m0s
    Done!
    Statistics        Avg      Stdev        Max
      Reqs/sec      1320.90     200.04    1820.33
      Latency       96.15ms    21.39ms   671.40ms
      Latency Distribution
         50%    92.86ms
         75%   104.60ms
         90%   118.41ms
         95%   128.01ms
         99%   160.40ms
      HTTP codes:
        1xx - 0, 2xx - 156265, 3xx - 0, 4xx - 0, 5xx - 0
        others - 0
      Throughput:    14.49MB/s

So I think this would be a great addition to Debian.

Upstream's package name is "bombardier" which, unfortunately, conflict
with the "bombardier" source package already present in Debian. I
suggest the "bombardier-go" source (and binary?) package,

I would also suggest that the binary package ships a `bombardier`
commandline package and conflict with the `bombardier` package. I
don't see both packages being usefully installed at once, but I could
be convinced otherwise.

Not sure how else to handle this conflict. The source package, at
least, could be named like other golang packages, with the mouthful of
golang-github-codesenberg-bombardier, but I think the binary package
should still be more meaningful, hence bombardier-go.

Other ideas:

golang-bombardier
go-bombardier
bombardier-bench
bombardier-http

?

Reply via email to