goben is a golang tool to measure TCP/UDP transport layer throughput between hosts.
Clone or download
udhos
udhos Clean-up.
Latest commit 5db5541 Dec 12, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
goben Clean-up. Dec 12, 2018
.gitignore Initial commit Feb 2, 2018
LICENSE Initial commit Feb 2, 2018
README.md TLS hints. Dec 12, 2018
build.sh Remove stale lines. Dec 11, 2018
go.mod Update deps. Dec 11, 2018
go.sum Update deps. Dec 11, 2018

README.md

license Go Report Card GolangCI

asciicast

goben

goben is a golang tool to measure TCP/UDP transport layer throughput between hosts.

Created by gh-md-toc

Features

  • Support for TCP, UDP, TLS.
  • Can limit maximum bandwidth.
  • Written in Go. Single executable file. No runtime dependency.
  • Simple usage: start the server then launch the client pointing to server's address.
  • Spawns multiple concurrent lightweight goroutines to handle multiple parallel traffic streams.
  • Can save test results as PNG chart.
  • Can export test results as YAML or CSV.

History

  • Years ago out of frustration with iperf2 limitations, I wrote the nepim tool. One can find some known iperf problems here: iperf caveats. Nepim was more customizable, easier to use, reported simpler to understand results, was lighter on CPU.
  • Later I found another amazing tool called nuttcp. One can read about nepim and nuttcp here: nepim and nuttcp.
  • goben is intended to fix shortcomings of nepim: (1) Take advantage of multiple CPUs while not wasting processing power. Nepim was single-threaded. (2) Be easily portable to multiple platforms. Nepim was heavily tied to UNIX-like world. (3) Use a simpler synchronous code flow. Nepim used hard-to-follow asynchronous architecture.

Requirements

Install

With Go Modules (since Go 1.11)

git clone https://github.com/udhos/goben ;# clone outside GOPATH
cd goben
go test ./goben
go install ./goben

Without Go Modules (before Go 1.11)

go get github.com/wcharczuk/go-chart
go get gopkg.in/yaml.v2
go get github.com/udhos/goben
go install github.com/udhos/goben/goben

Usage

Make sure ~/go/bin is in your shell PATH.

Start server:

server$ goben

Start client:

client$ goben -hosts 1.1.1.1 ;# 1.1.1.1 is server's address

Command-line Options

Find several supported command-line switches by running 'goben -h':

$ goben -h
Usage of goben:
  -ascii
        plot ascii chart (default true)
  -chart string
        output filename for rendering chart on client
        '%d' is parallel connection index to host
        '%s' is hostname:port
        example: -chart chart-%d-%s.png
  -connections int
        number of parallel connections (default 1)
  -csv string
        output filename for CSV exporting test results on client
        '%d' is parallel connection index to host
        '%s' is hostname:port
        example: -csv export-%d-%s.csv
  -defaultPort string
        default port (default ":8080")
  -export string
        output filename for YAML exporting test results on client
        '%d' is parallel connection index to host
        '%s' is hostname:port
        example: -export export-%d-%s.yaml
  -hosts value
        comma-separated list of hosts
        you may append an optional port to every host: host[:port]
  -listeners value
        comma-separated list of listen addresses
        you may prepend an optional host to every port: [host]:port
  -maxSpeed float
        bandwidth limit in mbps (0 means unlimited)
  -passiveClient
        suppress client writes
  -passiveServer
        suppress server writes
  -readSize int
        read buffer size in bytes (default 50000)
  -reportInterval string
        periodic report interval
        unspecified time unit defaults to second (default "2s")
  -totalDuration string
        test total duration
        unspecified time unit defaults to second (default "10s")
  -udp
        run client in UDP mode
  -writeSize int
        write buffer size in bytes (default 50000)

Example

Server side:

$ goben
2018/06/28 15:04:26 goben version 0.3 runtime go1.11beta1 GOMAXPROCS=1
2018/06/28 15:04:26 connections=1 defaultPort=:8080 listeners=[":8080"] hosts=[]
2018/06/28 15:04:26 reportInterval=2s totalDuration=10s
2018/06/28 15:04:26 server mode (use -hosts to switch to client mode)
2018/06/28 15:04:26 serve: spawning TCP listener: :8080
2018/06/28 15:04:26 serve: spawning UDP listener: :8080

Client side:

$ goben -hosts localhost
2018/06/28 15:04:28 goben version 0.3 runtime go1.11beta1 GOMAXPROCS=1
2018/06/28 15:04:28 connections=1 defaultPort=:8080 listeners=[":8080"] hosts=["localhost"]
2018/06/28 15:04:28 reportInterval=2s totalDuration=10s
2018/06/28 15:04:28 client mode, tcp protocol
2018/06/28 15:04:28 open: opening tcp 0/1: localhost:8080
2018/06/28 15:04:28 handleConnectionClient: starting 0/1 [::1]:8080
2018/06/28 15:04:28 handleConnectionClient: options sent: {2s 10s 50000 50000 false 0}
2018/06/28 15:04:28 clientReader: starting: 0/1 [::1]:8080
2018/06/28 15:04:28 clientWriter: starting: 0/1 [::1]:8080
2018/06/28 15:04:30 0/1  report   clientReader rate:  13917 Mbps  34793 rcv/s
2018/06/28 15:04:30 0/1  report   clientWriter rate:  13468 Mbps  33670 snd/s
2018/06/28 15:04:32 0/1  report   clientReader rate:  14044 Mbps  35111 rcv/s
2018/06/28 15:04:32 0/1  report   clientWriter rate:  13591 Mbps  33978 snd/s
2018/06/28 15:04:34 0/1  report   clientReader rate:  12934 Mbps  32337 rcv/s
2018/06/28 15:04:34 0/1  report   clientWriter rate:  12517 Mbps  31294 snd/s
2018/06/28 15:04:36 0/1  report   clientReader rate:  13307 Mbps  33269 rcv/s
2018/06/28 15:04:36 0/1  report   clientWriter rate:  12878 Mbps  32196 snd/s
2018/06/28 15:04:38 0/1  report   clientWriter rate:  13330 Mbps  33325 snd/s
2018/06/28 15:04:38 0/1  report   clientReader rate:  13774 Mbps  34436 rcv/s
2018/06/28 15:04:38 handleConnectionClient: 10s timer
2018/06/28 15:04:38 workLoop: 0/1 clientWriter: write tcp [::1]:42130->[::1]:8080: use of closed network connection
2018/06/28 15:04:38 0/1 average   clientWriter rate:  13157 Mbps  32892 snd/s
2018/06/28 15:04:38 clientWriter: exiting: 0/1 [::1]:8080
2018/06/28 15:04:38 workLoop: 0/1 clientReader: read tcp [::1]:42130->[::1]:8080: use of closed network connection
2018/06/28 15:04:38 0/1 average   clientReader rate:  13595 Mbps  33989 rcv/s
2018/06/28 15:04:38 clientReader: exiting: 0/1 [::1]:8080
2018/06/28 15:04:38 input:
 14038 ┤          ╭────╮
 13939 ┤──────────╯    ╰╮
 13840 ┼                ╰─╮
 13741 ┤                  ╰╮                                    ╭──
 13641 ┤                   ╰╮                               ╭───╯
 13542 ┤                    ╰─╮                          ╭──╯
 13443 ┤                      ╰╮                     ╭───╯
 13344 ┤                       ╰─╮               ╭───╯
 13245 ┤                         ╰╮          ╭───╯
 13146 ┤                          ╰─╮    ╭───╯
 13047 ┤                            ╰────╯
 12948 ┤
2018/06/28 15:04:38 output:
 13585 ┤          ╭────╮
 13489 ┤──────────╯    ╰╮
 13393 ┼                ╰─╮
 13297 ┤                  ╰╮                                    ╭──
 13201 ┤                   ╰╮                               ╭───╯
 13105 ┤                    ╰─╮                          ╭──╯
 13009 ┤                      ╰╮                     ╭───╯
 12914 ┤                       ╰─╮               ╭───╯
 12818 ┤                         ╰╮          ╭───╯
 12722 ┤                          ╰─╮    ╭───╯
 12626 ┤                            ╰────╯
 12530 ┤
2018/06/28 15:04:38 handleConnectionClient: closing: 0/1 [::1]:8080

TLS

For TLS, a server-side certificate is required:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem

If the certificate is available, goben server listens on TLS socket. Otherwise, it falls back to plain TCP.

--x--