bench: Adding a simple benchmarking setup
This commit is contained in:
parent
01e085cc64
commit
1aabbb5542
|
@ -0,0 +1,24 @@
|
|||
REQ=20480
|
||||
CLIENTS=64
|
||||
ADDR=http://localhost:8500/v1/kv/bench
|
||||
DATA="74a31e96-1d0f-4fa7-aa14-7212a326986e"
|
||||
MAXPROCS=4
|
||||
|
||||
all: put get-default get-stale get-consistent
|
||||
|
||||
put:
|
||||
@echo "===== PUT test ====="
|
||||
GOMAXPROCS=${MAXPROCS} boom -m PUT -d ${DATA} -n ${REQ} -c ${CLIENTS} ${ADDR}
|
||||
|
||||
get-default:
|
||||
@echo "===== GET default test ====="
|
||||
GOMAXPROCS=${MAXPROCS} boom -n ${REQ} -c ${CLIENTS} ${ADDR}
|
||||
|
||||
get-stale:
|
||||
@echo "===== GET stale test ====="
|
||||
GOMAXPROCS=${MAXPROCS} boom -n ${REQ} -c ${CLIENTS} ${ADDR}?stale
|
||||
|
||||
get-consistent:
|
||||
@echo "===== GET consistent test ====="
|
||||
GOMAXPROCS=${MAXPROCS} boom -n ${REQ} -c ${CLIENTS} ${ADDR}?consistent
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
Consul Benchmark
|
||||
================
|
||||
|
||||
This repo contains the Packer automation necessary for the Consul benchmarks.
|
||||
|
||||
There is a single main Packer file `bench.json`. To use it, the variables
|
||||
for `do_client_id` and `do_api_key` must be provided. There correspond to
|
||||
your DigitalOcean client id and API key.
|
||||
|
||||
When Packer runs, it will generate 3 images:
|
||||
* bench-bootstrap - Consul server in bootstrap mode
|
||||
* bench-server - Consul server
|
||||
* bench-worker - Worker node
|
||||
|
||||
For the benchmark you should start 1 bootstrap instance, and 2 normal
|
||||
servers. As many workers as desired can be started. Once the nodes are
|
||||
up, you must SSH into one of the Consul servers.
|
||||
|
||||
Connect all the nodes with:
|
||||
|
||||
$ consul join <n1> ... <n5>
|
||||
|
||||
This will connect all the nodes within the same datacenter.
|
||||
|
||||
To run the benchmarks, use the Makefile:
|
||||
|
||||
$ cd /
|
||||
$ make # Runs all the benchmarks
|
||||
$ make put # Runs only the PUT benchmarks
|
||||
|
||||
There is no good way to currently cause multiple workers to run at the same
|
||||
time, so I just type in the make command and rapidly start the test on all
|
||||
workers. It is not perfect, but the test runs long enough that the calls
|
||||
overlap.
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
{
|
||||
"variables": {
|
||||
"do_client_id": "",
|
||||
"do_api_key": ""
|
||||
},
|
||||
"builders": [
|
||||
{
|
||||
"type": "digitalocean",
|
||||
"api_key": "{{ user `do_api_key` }}",
|
||||
"client_id": "{{ user `do_client_id` }}",
|
||||
"region_id": "1",
|
||||
"size_id": "61",
|
||||
"image_id": "3101045",
|
||||
"snapshot_name": "bench-bootstrap-{{ isotime }}",
|
||||
"name": "bootstrap"
|
||||
},
|
||||
{
|
||||
"type": "digitalocean",
|
||||
"api_key": "{{ user `do_api_key` }}",
|
||||
"client_id": "{{ user `do_client_id` }}",
|
||||
"region_id": "1",
|
||||
"size_id": "61",
|
||||
"image_id": "3101045",
|
||||
"snapshot_name": "bench-server-{{ isotime }}",
|
||||
"name": "server"
|
||||
},
|
||||
{
|
||||
"type": "digitalocean",
|
||||
"api_key": "{{ user `do_api_key` }}",
|
||||
"client_id": "{{ user `do_client_id` }}",
|
||||
"region_id": "1",
|
||||
"size_id": "61",
|
||||
"image_id": "3101045",
|
||||
"snapshot_name": "bench-worker-{{ isotime }}",
|
||||
"name": "worker"
|
||||
}
|
||||
],
|
||||
"provisioners":[
|
||||
{
|
||||
"type": "file",
|
||||
"source": "conf/upstart.conf",
|
||||
"destination": "/etc/init/consul.conf"
|
||||
},
|
||||
{
|
||||
"type": "shell",
|
||||
"inline": [
|
||||
"mkdir /etc/consul.d",
|
||||
"apt-get update",
|
||||
"apt-get install unzip make",
|
||||
"wget https://dl.bintray.com/mitchellh/consul/0.2.0_linux_amd64.zip",
|
||||
"unzip 0.2.0_linux_amd64.zip",
|
||||
"mv consul /usr/local/bin/consul",
|
||||
"chmod +x /usr/local/bin/consul"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"source": "conf/common.json",
|
||||
"destination": "/etc/consul.d/common.json"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"source": "conf/bootstrap.json",
|
||||
"destination": "/etc/consul.d/bootstrap.json",
|
||||
"only": ["bootstrap"]
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"source": "conf/server.json",
|
||||
"destination": "/etc/consul.d/server.json",
|
||||
"only": ["server"]
|
||||
},
|
||||
{
|
||||
"type": "shell",
|
||||
"inline": [
|
||||
"curl https://s3.amazonaws.com/hc-ops/boom_linux_amd64 -o /usr/bin/boom",
|
||||
"chmod +x /usr/bin/boom"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"source": "Makefile",
|
||||
"destination": "/Makefile"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"bootstrap": true,
|
||||
"server": true
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"data_dir": "/var/lib/consul",
|
||||
"log_level": "info"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"server": true
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
description "Consul agent"
|
||||
|
||||
start on runlevel [2345]
|
||||
stop on runlevel [!2345]
|
||||
|
||||
respawn
|
||||
|
||||
script
|
||||
if [ -f "/etc/service/consul" ]; then
|
||||
. /etc/service/consul
|
||||
fi
|
||||
|
||||
# Make sure to use all our CPUs, because Consul can block a scheduler thread
|
||||
export GOMAXPROCS=`nproc`
|
||||
|
||||
# Get the public IP
|
||||
BIND=`ifconfig eth0 | grep "inet addr" | awk '{ print substr($2,6) }'`
|
||||
|
||||
exec /usr/local/bin/consul agent \
|
||||
-config-dir="/etc/consul.d" \
|
||||
-bind=$BIND \
|
||||
${CONSUL_FLAGS} \
|
||||
>>/var/log/consul.log 2>&1
|
||||
end script
|
|
@ -0,0 +1,178 @@
|
|||
# Consul Benchmark Results
|
||||
|
||||
As part of a benchmark, we started a 5 node DigitalOcean cluster to do.
|
||||
There are 3 servers, meaning writes must commit to at least 2 servers.
|
||||
The cluster uses the 16GB DigitalOcean droplet which has the following specs:
|
||||
|
||||
* 8 CPU Cores, 2Ghz
|
||||
* 16GB RAM
|
||||
* 160GB SSD disk
|
||||
* 1Gbps NIC
|
||||
|
||||
We used `bonnie++` to benchmark the disk, and the key metrics are:
|
||||
|
||||
* 188MB/s sequential write
|
||||
* 86MB/s sequential read-write-flush
|
||||
* 840MB/s sequential read
|
||||
* 2636 random seeks per second
|
||||
|
||||
# Output
|
||||
|
||||
Below is the output for a test run on a benchmark cluster. We ran the benchmark
|
||||
several times to warm up the nodes, and this is just a single representative sample.
|
||||
|
||||
Note, that a single worker was running the benchmark. This means the "stale" test is
|
||||
not representative of total throughput, as the client was only routing to a single server.
|
||||
|
||||
===== PUT test =====
|
||||
GOMAXPROCS=4 boom -m PUT -d "74a31e96-1d0f-4fa7-aa14-7212a326986e" -n 20480 -c 64 http://localhost:8500/v1/kv/bench
|
||||
20480 / 20480 Booooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo! 100.00 %
|
||||
|
||||
Summary:
|
||||
Total: 19.4302 secs.
|
||||
Slowest: 0.1715 secs.
|
||||
Fastest: 0.0157 secs.
|
||||
Average: 0.0606 secs.
|
||||
Requests/sec: 1054.0313
|
||||
Total Data Received: 102400 bytes.
|
||||
Response Size per Request: 5 bytes.
|
||||
|
||||
Status code distribution:
|
||||
[200] 20480 responses
|
||||
|
||||
Response time histogram:
|
||||
0.016 [1] |
|
||||
0.031 [233] |∎
|
||||
0.047 [4120] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.062 [8079] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.078 [5082] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.094 [2045] |∎∎∎∎∎∎∎∎∎∎
|
||||
0.109 [656] |∎∎∎
|
||||
0.125 [200] |
|
||||
0.140 [12] |
|
||||
0.156 [31] |
|
||||
0.172 [21] |
|
||||
|
||||
Latency distribution:
|
||||
10% in 0.0416 secs.
|
||||
25% in 0.0484 secs.
|
||||
50% in 0.0579 secs.
|
||||
75% in 0.0697 secs.
|
||||
90% in 0.0835 secs.
|
||||
95% in 0.0919 secs.
|
||||
99% in 0.1113 secs.
|
||||
|
||||
===== GET default test =====
|
||||
GOMAXPROCS=4 boom -n 20480 -c 64 http://localhost:8500/v1/kv/bench
|
||||
20480 / 20480 Booooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo! 100.00 %
|
||||
|
||||
Summary:
|
||||
Total: 9.6804 secs.
|
||||
Slowest: 0.0830 secs.
|
||||
Fastest: 0.0023 secs.
|
||||
Average: 0.0302 secs.
|
||||
Requests/sec: 2115.6096
|
||||
Total Data Received: 2560000 bytes.
|
||||
Response Size per Request: 125 bytes.
|
||||
|
||||
Status code distribution:
|
||||
[200] 20480 responses
|
||||
|
||||
Response time histogram:
|
||||
0.002 [1] |
|
||||
0.010 [143] |
|
||||
0.018 [1666] |∎∎∎∎∎∎∎∎∎
|
||||
0.026 [6009] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.035 [6732] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.043 [3857] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.051 [1389] |∎∎∎∎∎∎∎∎
|
||||
0.059 [459] |∎∎
|
||||
0.067 [154] |
|
||||
0.075 [53] |
|
||||
0.083 [17] |
|
||||
|
||||
Latency distribution:
|
||||
10% in 0.0189 secs.
|
||||
25% in 0.0233 secs.
|
||||
50% in 0.0291 secs.
|
||||
75% in 0.0358 secs.
|
||||
90% in 0.0427 secs.
|
||||
95% in 0.0476 secs.
|
||||
99% in 0.0597 secs.
|
||||
|
||||
===== GET stale test =====
|
||||
GOMAXPROCS=4 boom -n 20480 -c 64 http://localhost:8500/v1/kv/bench?stale
|
||||
20480 / 20480 Booooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo! 100.00 %
|
||||
|
||||
Summary:
|
||||
Total: 10.3082 secs.
|
||||
Slowest: 0.0972 secs.
|
||||
Fastest: 0.0015 secs.
|
||||
Average: 0.0322 secs.
|
||||
Requests/sec: 1986.7714
|
||||
Total Data Received: 2560000 bytes.
|
||||
Response Size per Request: 125 bytes.
|
||||
|
||||
Status code distribution:
|
||||
[200] 20480 responses
|
||||
|
||||
Response time histogram:
|
||||
0.002 [1] |
|
||||
0.011 [320] |∎
|
||||
0.021 [2558] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.030 [6247] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.040 [6895] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.049 [3174] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.059 [971] |∎∎∎∎∎
|
||||
0.068 [249] |∎
|
||||
0.078 [52] |
|
||||
0.088 [11] |
|
||||
0.097 [2] |
|
||||
|
||||
Latency distribution:
|
||||
10% in 0.0187 secs.
|
||||
25% in 0.0246 secs.
|
||||
50% in 0.0317 secs.
|
||||
75% in 0.0387 secs.
|
||||
90% in 0.0461 secs.
|
||||
95% in 0.0511 secs.
|
||||
99% in 0.0618 secs.
|
||||
|
||||
===== GET consistent test =====
|
||||
GOMAXPROCS=4 boom -n 20480 -c 64 http://localhost:8500/v1/kv/bench?consistent
|
||||
20480 / 20480 Booooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo! 100.00 %
|
||||
|
||||
Summary:
|
||||
Total: 10.4835 secs.
|
||||
Slowest: 0.0991 secs.
|
||||
Fastest: 0.0024 secs.
|
||||
Average: 0.0327 secs.
|
||||
Requests/sec: 1953.5549
|
||||
Total Data Received: 2560000 bytes.
|
||||
Response Size per Request: 125 bytes.
|
||||
|
||||
Status code distribution:
|
||||
[200] 20480 responses
|
||||
|
||||
Response time histogram:
|
||||
0.002 [1] |
|
||||
0.012 [137] |
|
||||
0.022 [2405] |∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.031 [7754] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.041 [6382] |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.051 [2629] |∎∎∎∎∎∎∎∎∎∎∎∎∎
|
||||
0.060 [826] |∎∎∎∎
|
||||
0.070 [245] |∎
|
||||
0.080 [81] |
|
||||
0.089 [17] |
|
||||
0.099 [3] |
|
||||
|
||||
Latency distribution:
|
||||
10% in 0.0208 secs.
|
||||
25% in 0.0254 secs.
|
||||
50% in 0.0314 secs.
|
||||
75% in 0.0384 secs.
|
||||
90% in 0.0463 secs.
|
||||
95% in 0.0518 secs.
|
||||
99% in 0.0645 secs.
|
||||
|
Loading…
Reference in New Issue