[tm-bench] show basic stats

```
===
Avg block time: 1225.504 ms
Avg tx throughput: 905 per sec
Avg block latency: 6.121 ms
===
```
This commit is contained in:
Anton Kaliaev
2017-03-16 20:53:09 +04:00
parent da08d589b5
commit 8af2fe79e1
4 changed files with 54 additions and 41 deletions

26
tm-bench/glide.lock generated
View File

@ -1,5 +1,5 @@
hash: db5c45d85f63559c544e26ff73ef936faa98b80a9a48fa23a8170b42ea11f916 hash: 7b3982490e9c4cdc9467e849959fd8d6ccec8f8f9e81fc56f29e8e9c67bf3b53
updated: 2017-03-13T14:46:21.687902055Z updated: 2017-03-16T15:16:05.301074208Z
imports: imports:
- name: github.com/btcsuite/btcd - name: github.com/btcsuite/btcd
version: 583684b21bfbde9b5fc4403916fd7c807feb0289 version: 583684b21bfbde9b5fc4403916fd7c807feb0289
@ -7,6 +7,13 @@ imports:
- btcec - btcec
- name: github.com/BurntSushi/toml - name: github.com/BurntSushi/toml
version: e643e9ef00b049d75de26e61109c5ea01885cd21 version: e643e9ef00b049d75de26e61109c5ea01885cd21
- name: github.com/go-kit/kit
version: b6f30a2e0632f5722fb26d8765d726335b79d3e6
subpackages:
- log
- log/term
- name: github.com/go-logfmt/logfmt
version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5
- name: github.com/go-stack/stack - name: github.com/go-stack/stack
version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82 version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82
- name: github.com/golang/protobuf - name: github.com/golang/protobuf
@ -16,15 +23,17 @@ imports:
- name: github.com/golang/snappy - name: github.com/golang/snappy
version: 553a641470496b2327abcac10b36396bd98e45c9 version: 553a641470496b2327abcac10b36396bd98e45c9
- name: github.com/gorilla/websocket - name: github.com/gorilla/websocket
version: 3ab3a8b8831546bd18fd182c20687ca853b2bb13 version: b258b4fadb573ac412f187b9f31974ea99d32f50
- name: github.com/jmhodges/levigo - name: github.com/jmhodges/levigo
version: c42d9e0ca023e2198120196f842701bb4c55d7b9 version: c42d9e0ca023e2198120196f842701bb4c55d7b9
- name: github.com/kr/logfmt
version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0
- name: github.com/mattn/go-colorable - name: github.com/mattn/go-colorable
version: a392f450ea64cee2b268dfaacdc2502b50a22b18 version: a392f450ea64cee2b268dfaacdc2502b50a22b18
- name: github.com/mattn/go-isatty - name: github.com/mattn/go-isatty
version: 57fdcb988a5c543893cc61bce354a6e24ab70022 version: 57fdcb988a5c543893cc61bce354a6e24ab70022
- name: github.com/pkg/errors - name: github.com/pkg/errors
version: 645ef00459ed84a119197bfb8d8205042c6df63d version: bfd5150e4e41705ded2129ec33379de1cb90b513
- name: github.com/rcrowley/go-metrics - name: github.com/rcrowley/go-metrics
version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c
- name: github.com/syndtr/goleveldb - name: github.com/syndtr/goleveldb
@ -43,7 +52,7 @@ imports:
- leveldb/table - leveldb/table
- leveldb/util - leveldb/util
- name: github.com/tendermint/abci - name: github.com/tendermint/abci
version: 1236e8fb6eee3a63909f4014a8e84385ead7933d version: af792eac777de757cd496349a5f6b5313738fcbc
subpackages: subpackages:
- types - types
- name: github.com/tendermint/ed25519 - name: github.com/tendermint/ed25519
@ -76,7 +85,7 @@ imports:
subpackages: subpackages:
- upnp - upnp
- name: github.com/tendermint/go-rpc - name: github.com/tendermint/go-rpc
version: b54b9b4ecc2c444f7b11077f24e5abafdcc98676 version: fcea0cda21f64889be00a0f4b6d13266b1a76ee7
subpackages: subpackages:
- client - client
- server - server
@ -93,10 +102,11 @@ imports:
- rpc/core/types - rpc/core/types
- types - types
- name: github.com/tendermint/tools - name: github.com/tendermint/tools
version: ce69eaa75eb08b21d22b6ecd3cf5a20d38ec57e2 version: fb28fd4c13759026de23d98bb494a022840278c1
subpackages: subpackages:
- tm-monitor - tm-monitor
- tm-monitor/eventmeter - tm-monitor/eventmeter
- tm-monitor/monitor
- name: golang.org/x/crypto - name: golang.org/x/crypto
version: 728b753d0135da6801d45a38e6f43ff55779c5c2 version: 728b753d0135da6801d45a38e6f43ff55779c5c2
subpackages: subpackages:
@ -123,7 +133,7 @@ imports:
subpackages: subpackages:
- unix - unix
- name: google.golang.org/grpc - name: google.golang.org/grpc
version: d50cf2db166eaff3f2429425758d12205085eb5b version: cdee119ee21e61eef7093a41ba148fa83585e143
subpackages: subpackages:
- codes - codes
- credentials - credentials

View File

@ -7,4 +7,4 @@ import:
- types - types
- package: github.com/tendermint/tools - package: github.com/tendermint/tools
subpackages: subpackages:
- tm-monitor - tm-monitor/monitor

View File

@ -1,4 +1,4 @@
package bench package main
import ( import (
"flag" "flag"
@ -7,14 +7,14 @@ import (
"strings" "strings"
"time" "time"
monitor "github.com/tendermint/tools/tm-monitor" "github.com/tendermint/tools/tm-monitor/monitor"
) )
var version = "0.1.0.pre" var version = "0.1.0.pre"
func main() { func main() {
var listenAddr string var listenAddr string
var connections, duration, txsRate int var duration, txsRate int
flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:46670", "HTTP and Websocket server listen address") flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:46670", "HTTP and Websocket server listen address")
flag.IntVar(&duration, "T", 10, "Exit after the specified amount of time in seconds") flag.IntVar(&duration, "T", 10, "Exit after the specified amount of time in seconds")
@ -43,32 +43,24 @@ Examples:
m := startMonitor(flag.Arg(0)) m := startMonitor(flag.Arg(0))
transacters := make([]*Transacter, len(endpoints)) endpoints := strings.Split(flag.Arg(0), ",")
for _, e := range strings.Split(endpoints, ",") { transacters := make([]*transacter, len(endpoints))
t := &transacter{e, txsRate} for i, e := range endpoints {
t := newTransacter(e, txsRate)
if err := t.Start(); err != nil { if err := t.Start(); err != nil {
fmt.Println(err.Error()) panic(err)
os.Exit(1)
} }
append(transacters, t) transacters[i] = t
} }
select { select {
case time.After(duration * time.Second): case <-time.After(time.Duration(duration) * time.Second):
for _, t := range transacters { for _, t := range transacters {
t.Stop() t.Stop()
} }
collectAndPrintResults(m) collectAndPrintResults(m)
m.Stop() m.Stop()
} }
cmn.TrapSignal(func() {
for _, t := range transacters {
t.Stop()
}
collectAndPrintResults(m)
m.Stop()
})
} }
func startMonitor(endpoints string) *monitor.Monitor { func startMonitor(endpoints string) *monitor.Monitor {
@ -76,19 +68,22 @@ func startMonitor(endpoints string) *monitor.Monitor {
for _, e := range strings.Split(endpoints, ",") { for _, e := range strings.Split(endpoints, ",") {
if err := m.Monitor(monitor.NewNode(e)); err != nil { if err := m.Monitor(monitor.NewNode(e)); err != nil {
fmt.Println(err.Error()) panic(err)
os.Exit(1)
} }
} }
if err := m.Start(); err != nil { if err := m.Start(); err != nil {
fmt.Println(err.Error()) panic(err)
os.Exit(1)
} }
return m return m
} }
func collectAndPrintResults(m *Monitor) { func collectAndPrintResults(m *monitor.Monitor) {
fmt.Printf("%d", m.Network.Height) n := m.Network
fmt.Println("===")
fmt.Printf("Avg block time: %.3f ms\n", n.AvgBlockTime)
fmt.Printf("Avg tx throughput: %.0f per sec\n", n.AvgTxThroughput)
fmt.Printf("Avg block latency: %.3f ms\n", n.AvgBlockLatency)
fmt.Println("===")
} }

View File

@ -1,4 +1,4 @@
package bench package main
import ( import (
"crypto/rand" "crypto/rand"
@ -23,19 +23,27 @@ type transacter struct {
wg sync.WaitGroup wg sync.WaitGroup
} }
func newTransacter(target string, rate int) *transacter {
return &transacter{
Target: target,
Rate: rate,
wsc: rpcclient.NewWSClient(target, "/websocket"),
}
}
func (t *transacter) Start() error { func (t *transacter) Start() error {
t.wsc = rpcclient.NewWSClient(t.Target, "/websocket") t.stopped = false
if _, err := t.wsc.Start(); err != nil { if _, err := t.wsc.Start(); err != nil {
return err return err
} }
wg.Add(1) t.wg.Add(1)
go t.sendLoop() go t.sendLoop()
return nil return nil
} }
func (t *transacter) Stop() { func (t *transacter) Stop() {
t.stopped = true t.stopped = true
wg.Wait() t.wg.Wait()
t.wsc.Stop() t.wsc.Stop()
} }
@ -59,18 +67,18 @@ func (t *transacter) sendLoop() {
} }
if t.stopped { if t.stopped {
wg.Done() t.wg.Done()
return return
} }
timeToSend := time.Now() - startTime timeToSend := time.Now().Sub(startTime)
timer.Sleep(time.Second - timeToSend) time.Sleep(time.Second - timeToSend)
} }
} }
// generateTx returns a random byte sequence where first 8 bytes are the number // generateTx returns a random byte sequence where first 8 bytes are the number
// of transaction. // of transaction.
func generateTx(num) []byte { func generateTx(num int) []byte {
tx := make([]byte, 250) tx := make([]byte, 250)
binary.PutUvarint(tx[:32], uint64(num)) binary.PutUvarint(tx[:32], uint64(num))
if _, err := rand.Read(tx[234:]); err != nil { if _, err := rand.Read(tx[234:]); err != nil {