From f873157c1cdbf606d5616974020fd5748af6eab4 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 6 Feb 2017 08:45:40 -0800 Subject: [PATCH 1/3] *: new results, clean up everything --- .gitignore | 2 - agent/agent_cetcd.go | 6 +- agent/agent_consul.go | 12 +- agent/agent_etcd.go | 16 +- agent/agent_zetcd.go | 6 +- agent/agent_zookeeper.go | 66 +- agent/agentpb/message.pb.go | 1146 ------------ agent/agentpb/message.proto | 86 - agent/command.go | 10 +- agent/server.go | 92 +- agent/server_system_metrics.go | 4 +- agent/upload_log.go | 54 +- analyze/analyze_config.go | 63 - analyze/analyze_config.yaml | 201 -- analyze/analyze_config_test.go | 86 - analyze/analyze_data_2_analyze_data.go | 2 +- analyze/analyze_data_4_aggregate_all.go | 4 +- .../analyze_data_4_aggregate_timeseries.go | 2 +- analyze/analyze_data_5_plot.go | 96 +- analyze/analyze_data_6_readme.go | 65 - ...e_everything.go => finalize_everything.go} | 478 ++--- analyze/util.go | 4 + .../01-etcd-v3.1.yaml | 58 - .../02-zookeeper-r3.4.9.yaml | 58 - .../03-consul-v0.7.3.yaml | 58 - .../analyze.yaml | 216 --- .../01-etcd-v3.1.yaml | 57 - .../02-zookeeper-r3.4.9.yaml | 57 - .../03-consul-v0.7.3.yaml | 57 - .../analyze.yaml | 216 --- .../01-etcd-v3.1.yaml | 57 - .../02-zookeeper-r3.4.9.yaml | 57 - .../03-consul-v0.7.3.yaml | 57 - .../03-write-1M-keys-1000-client/analyze.yaml | 216 --- .../04-write-too-many-keys/01-etcd-v3.1.yaml | 56 - .../02-zookeeper-r3.4.9.yaml | 56 - .../03-consul-v0.7.3.yaml | 56 - .../04-write-too-many-keys/analyze.yaml | 215 --- .../01-write-1M-keys/01-etcd-v3.1.yaml | 47 - .../01-write-1M-keys/02-zookeeper-r3.4.9.yaml | 47 - .../01-write-1M-keys/03-consul-v0.7.2.yaml | 47 - .../01-write-1M-keys/analyze.yaml | 185 -- .../01-etcd-v3.1.yaml | 47 - .../02-zookeeper-r3.4.9.yaml | 47 - .../03-consul-v0.7.2.yaml | 47 - .../analyze.yaml | 185 -- .../01-etcd-v3.1.yaml | 48 - .../02-zookeeper-r3.4.9.yaml | 48 - .../03-consul-v0.7.2.yaml | 48 - .../analyze.yaml | 185 -- .../04-write-1M-keys/01-etcd-v3.1.yaml | 47 - .../04-write-1M-keys/02-zookeeper-r3.4.9.yaml | 47 - .../04-write-1M-keys/03-consul-v0.7.2.yaml | 47 - .../04-write-1M-keys/analyze.yaml | 185 -- .../01-etcd-v3.1.yaml | 47 - .../02-zookeeper-r3.4.9.yaml | 47 - .../03-consul-v0.7.2.yaml | 47 - .../analyze.yaml | 185 -- .../01-etcd-v3.1.yaml | 48 - .../02-zookeeper-r3.4.9.yaml | 48 - .../03-consul-v0.7.2.yaml | 48 - .../analyze.yaml | 185 -- .../01-etcd-v3.1.yaml | 47 - .../02-zookeeper-r3.4.9.yaml | 47 - .../03-consul-v0.7.2.yaml | 47 - .../2017Q1-01-etcd-zookeeper-consul/README.md | 425 ----- .../VM_WRITE_1M_CPU_BY_CLIENTS_BAR_CHARTS.png | Bin 40188 -> 0 bytes ..._1M_DATA_RECEIVE_BY_CLIENTS_BAR_CHARTS.png | Bin 46672 -> 0 bytes ...1M_DATA_TRANSMIT_BY_CLIENTS_BAR_CHARTS.png | Bin 48383 -> 0 bytes ...E_1M_DISK_WRITES_BY_CLIENTS_BAR_CHARTS.png | Bin 38819 -> 0 bytes ...ATENCY_1000QPS_LINE_CHARTS_LOGARITHMIC.png | Bin 99844 -> 0 bytes .../VM_WRITE_1M_LATENCY_BOX_PLOTS.png | Bin 68442 -> 0 bytes ...WRITE_1M_LATENCY_BY_CLIENTS_BAR_CHARTS.png | Bin 43939 -> 0 bytes ...VM_WRITE_1M_MEMORY_1000QPS_LINE_CHARTS.png | Bin 78476 -> 0 bytes .../VM_WRITE_1M_MEMORY_BAR_CHARTS.png | Bin 63052 -> 0 bytes ..._WRITE_1M_MEMORY_BY_CLIENTS_BAR_CHARTS.png | Bin 40308 -> 0 bytes ...1M_SECTOR_WRITES_BY_CLIENTS_BAR_CHARTS.png | Bin 39627 -> 0 bytes .../VM_WRITE_1M_THROUGHPUT_BAR_CHARTS.png | Bin 45507 -> 0 bytes ...TE_1M_THROUGHPUT_BY_CLIENTS_BAR_CHARTS.png | Bin 46362 -> 0 bytes .../VM_WRITE_1M_THROUGHPUT_LINE_CHARTS.png | Bin 58763 -> 0 bytes .../2017Q1-02-etcd-zookeeper-consul/README.md | 88 - main.go => cmd/dbtester/main.go | 4 +- config-dbtester-gcloud-key.json | 1 + control/doc.go => config_cetcd.go | 9 +- config_consul.go | 21 + config_dbtester.go | 347 ++++ config_dbtester_test.go | 501 +++++ config_dbtester_test.yaml | 340 ++++ config_etcdv2.go | 21 + config_etcdv3.go | 22 + config_zetcd.go | 21 + config_zookeeper.go | 25 + control/command.go | 138 +- control/config.go | 179 -- control/config_test.go | 140 -- control/config_test.yaml | 56 - control/step1_start_database.go | 96 - control/step2_stress_client_conn.go | 234 --- control/step3_data_size_summary.go | 57 - control/step3_stop_database.go | 43 - control/step4_upload_logs.go | 85 - dbtesterpb/message.pb.go | 1631 +++++++++++++++++ dbtesterpb/message.proto | 70 + logger.go | 19 + readme.go | 37 + request.go | 89 + .../step2_stress_report.go => save_upload.go | 225 +-- scripts/genproto.sh | 2 +- scripts/tests.sh | 6 +- control/step2_stress.go => stress.go | 235 +-- ...ta_4_aggregate_util.go => stress_client.go | 23 +- stress_client_consul.go | 76 + stress_client_etcdv2.go | 87 + stress_client_etcdv3.go | 116 ++ ...client_io.go => stress_client_zookeeper.go | 95 +- stress_report.go | 158 ++ ...aggregate.go => stress_report_aggregate.go | 10 +- ...test.go => stress_report_aggregate_test.go | 2 +- .../01-write-1M-keys-client-variable.yaml | 339 ++++ .../02-write-1M-keys-best-throughput.yaml | 339 ++++ .../03-write-1M-keys-1000-client.yaml | 339 ++++ test-configs/04-write-too-many-keys.yaml | 339 ++++ .../install-cetcd.sh | 0 .../install-consul.sh | 0 .../install-dbtester.sh | 2 +- .../install-etcd.sh | 0 .../install-go.sh | 0 .../install-zetcd.sh | 0 .../install-zookeeper-ubuntu.sh | 0 .../run-dbtester.sh | 6 +- .../2017Q1-00-etcd-zookeeper-consul/README.md | 124 ++ control/util_math.go => util_math.go | 14 +- .../util_math_test.go => util_math_test.go | 10 +- control/util_os.go => util_os.go | 2 +- .../util_random_key.go => util_random_key.go | 18 +- control/util_sort.go => util_sort.go | 2 +- 136 files changed, 5879 insertions(+), 7540 deletions(-) delete mode 100644 .gitignore delete mode 100644 agent/agentpb/message.pb.go delete mode 100644 agent/agentpb/message.proto delete mode 100644 analyze/analyze_config.go delete mode 100644 analyze/analyze_config.yaml delete mode 100644 analyze/analyze_config_test.go delete mode 100644 analyze/analyze_data_6_readme.go rename analyze/{analyze_data_7_finalize_everything.go => finalize_everything.go} (65%) delete mode 100644 bench-configuration/01-write-1M-keys-client-variable/01-etcd-v3.1.yaml delete mode 100644 bench-configuration/01-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-configuration/01-write-1M-keys-client-variable/03-consul-v0.7.3.yaml delete mode 100644 bench-configuration/01-write-1M-keys-client-variable/analyze.yaml delete mode 100644 bench-configuration/02-write-1M-keys-best-throughput/01-etcd-v3.1.yaml delete mode 100644 bench-configuration/02-write-1M-keys-best-throughput/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-configuration/02-write-1M-keys-best-throughput/03-consul-v0.7.3.yaml delete mode 100644 bench-configuration/02-write-1M-keys-best-throughput/analyze.yaml delete mode 100644 bench-configuration/03-write-1M-keys-1000-client/01-etcd-v3.1.yaml delete mode 100644 bench-configuration/03-write-1M-keys-1000-client/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-configuration/03-write-1M-keys-1000-client/03-consul-v0.7.3.yaml delete mode 100644 bench-configuration/03-write-1M-keys-1000-client/analyze.yaml delete mode 100644 bench-configuration/04-write-too-many-keys/01-etcd-v3.1.yaml delete mode 100644 bench-configuration/04-write-too-many-keys/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-configuration/04-write-too-many-keys/03-consul-v0.7.3.yaml delete mode 100644 bench-configuration/04-write-too-many-keys/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/analyze.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/01-etcd-v3.1.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/02-zookeeper-r3.4.9.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/03-consul-v0.7.2.yaml delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/README.md delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_CPU_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_RECEIVE_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_TRANSMIT_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DISK_WRITES_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_1000QPS_LINE_CHARTS_LOGARITHMIC.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BOX_PLOTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_1000QPS_LINE_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_SECTOR_WRITES_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BY_CLIENTS_BAR_CHARTS.png delete mode 100644 bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_LINE_CHARTS.png delete mode 100755 bench-results/2017Q1-02-etcd-zookeeper-consul/README.md rename main.go => cmd/dbtester/main.go (91%) create mode 100644 config-dbtester-gcloud-key.json rename control/doc.go => config_cetcd.go (81%) create mode 100644 config_consul.go create mode 100644 config_dbtester.go create mode 100644 config_dbtester_test.go create mode 100644 config_dbtester_test.yaml create mode 100644 config_etcdv2.go create mode 100644 config_etcdv3.go create mode 100644 config_zetcd.go create mode 100644 config_zookeeper.go delete mode 100644 control/config.go delete mode 100644 control/config_test.go delete mode 100644 control/config_test.yaml delete mode 100644 control/step1_start_database.go delete mode 100644 control/step2_stress_client_conn.go delete mode 100644 control/step3_data_size_summary.go delete mode 100644 control/step3_stop_database.go delete mode 100644 control/step4_upload_logs.go create mode 100644 dbtesterpb/message.pb.go create mode 100644 dbtesterpb/message.proto create mode 100644 logger.go create mode 100644 readme.go create mode 100644 request.go rename control/step2_stress_report.go => save_upload.go (58%) rename control/step2_stress.go => stress.go (60%) rename analyze/analyze_data_4_aggregate_util.go => stress_client.go (57%) create mode 100644 stress_client_consul.go create mode 100644 stress_client_etcdv2.go create mode 100644 stress_client_etcdv3.go rename control/step2_stress_client_io.go => stress_client_zookeeper.go (51%) create mode 100644 stress_report.go rename control/step2_stress_report_aggregate.go => stress_report_aggregate.go (92%) rename control/step2_stress_report_aggregate_test.go => stress_report_aggregate_test.go (99%) create mode 100644 test-configs/01-write-1M-keys-client-variable.yaml create mode 100644 test-configs/02-write-1M-keys-best-throughput.yaml create mode 100644 test-configs/03-write-1M-keys-1000-client.yaml create mode 100644 test-configs/04-write-too-many-keys.yaml rename bench-configuration/02-install-cetcd.sh => test-configs/install-cetcd.sh (100%) rename bench-configuration/02-install-consul.sh => test-configs/install-consul.sh (100%) rename bench-configuration/03-install-dbtester.sh => test-configs/install-dbtester.sh (81%) rename bench-configuration/01-install-etcd.sh => test-configs/install-etcd.sh (100%) rename bench-configuration/00-install-go.sh => test-configs/install-go.sh (100%) rename bench-configuration/02-install-zetcd.sh => test-configs/install-zetcd.sh (100%) rename bench-configuration/02-install-zookeeper-ubuntu.sh => test-configs/install-zookeeper-ubuntu.sh (100%) rename bench-configuration/04-run-dbtester.sh => test-configs/run-dbtester.sh (63%) create mode 100644 test-results/2017Q1-00-etcd-zookeeper-consul/README.md rename control/util_math.go => util_math.go (82%) rename control/util_math_test.go => util_math_test.go (81%) rename control/util_os.go => util_os.go (99%) rename control/util_random_key.go => util_random_key.go (85%) rename control/util_sort.go => util_sort.go (97%) diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ba6d88ad..00000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# binary file -dbtester diff --git a/agent/agent_cetcd.go b/agent/agent_cetcd.go index 4c938eeb..ecd4a900 100644 --- a/agent/agent_cetcd.go +++ b/agent/agent_cetcd.go @@ -26,7 +26,7 @@ func startCetcd(fs *flags, t *transporterServer) error { return fmt.Errorf("cetcd binary %q does not exist", globalFlags.cetcdExec) } - peerIPs := strings.Split(t.req.PeerIPString, "___") + peerIPs := strings.Split(t.req.PeerIPsString, "___") clientURLs := make([]string, len(peerIPs)) for i, u := range peerIPs { clientURLs[i] = fmt.Sprintf("http://%s:2379", u) @@ -34,8 +34,8 @@ func startCetcd(fs *flags, t *transporterServer) error { flags := []string{ // "-consuladdr", "0.0.0.0:8500", - "-consuladdr", fmt.Sprintf("%s:8500", peerIPs[t.req.ServerIndex]), - "-etcd", clientURLs[t.req.ServerIndex], // etcd endpoint + "-consuladdr", fmt.Sprintf("%s:8500", peerIPs[t.req.IpIndex]), + "-etcd", clientURLs[t.req.IpIndex], // etcd endpoint } flagString := strings.Join(flags, " ") diff --git a/agent/agent_consul.go b/agent/agent_consul.go index d3226c98..dce29da8 100644 --- a/agent/agent_consul.go +++ b/agent/agent_consul.go @@ -31,17 +31,17 @@ func startConsul(fs *flags, t *transporterServer) error { return err } - peerIPs := strings.Split(t.req.PeerIPString, "___") + peerIPs := strings.Split(t.req.PeerIPsString, "___") var flags []string - switch t.req.ServerIndex { + switch t.req.IpIndex { case 0: // leader flags = []string{ "agent", "-server", "-data-dir", fs.consulDataDir, - "-bind", peerIPs[t.req.ServerIndex], - "-client", peerIPs[t.req.ServerIndex], + "-bind", peerIPs[t.req.IpIndex], + "-client", peerIPs[t.req.IpIndex], "-bootstrap-expect", "3", } @@ -50,8 +50,8 @@ func startConsul(fs *flags, t *transporterServer) error { "agent", "-server", "-data-dir", fs.consulDataDir, - "-bind", peerIPs[t.req.ServerIndex], - "-client", peerIPs[t.req.ServerIndex], + "-bind", peerIPs[t.req.IpIndex], + "-client", peerIPs[t.req.IpIndex], "-join", peerIPs[0], } } diff --git a/agent/agent_etcd.go b/agent/agent_etcd.go index 76ac25ae..4bf710b1 100644 --- a/agent/agent_etcd.go +++ b/agent/agent_etcd.go @@ -31,7 +31,7 @@ func startEtcd(fs *flags, t *transporterServer) error { return err } - peerIPs := strings.Split(t.req.PeerIPString, "___") + peerIPs := strings.Split(t.req.PeerIPsString, "___") names := make([]string, len(peerIPs)) clientURLs := make([]string, len(peerIPs)) @@ -44,23 +44,23 @@ func startEtcd(fs *flags, t *transporterServer) error { members[i] = fmt.Sprintf("%s=%s", names[i], peerURLs[i]) } - qv := t.req.EtcdQuotaSizeBytes + qv := t.req.Etcdv3Config.QuotaSizeBytes if qv > 8000000000 { plog.Warningf("maximum etcd quota is 8GB (got %d)... resetting to 8GB...", qv) qv = 8000000000 } flags := []string{ - "--name", names[t.req.ServerIndex], + "--name", names[t.req.IpIndex], "--data-dir", fs.etcdDataDir, "--quota-backend-bytes", fmt.Sprintf("%d", qv), - "--snapshot-count", fmt.Sprintf("%d", t.req.EtcdSnapCount), + "--snapshot-count", fmt.Sprintf("%d", t.req.Etcdv3Config.SnapCount), - "--listen-client-urls", clientURLs[t.req.ServerIndex], - "--advertise-client-urls", clientURLs[t.req.ServerIndex], + "--listen-client-urls", clientURLs[t.req.IpIndex], + "--advertise-client-urls", clientURLs[t.req.IpIndex], - "--listen-peer-urls", peerURLs[t.req.ServerIndex], - "--initial-advertise-peer-urls", peerURLs[t.req.ServerIndex], + "--listen-peer-urls", peerURLs[t.req.IpIndex], + "--initial-advertise-peer-urls", peerURLs[t.req.IpIndex], "--initial-cluster-token", "dbtester-etcd-token", "--initial-cluster", strings.Join(members, ","), diff --git a/agent/agent_zetcd.go b/agent/agent_zetcd.go index fffcea76..df5e3bf5 100644 --- a/agent/agent_zetcd.go +++ b/agent/agent_zetcd.go @@ -26,7 +26,7 @@ func startZetcd(fs *flags, t *transporterServer) error { return fmt.Errorf("zetcd binary %q does not exist", globalFlags.zetcdExec) } - peerIPs := strings.Split(t.req.PeerIPString, "___") + peerIPs := strings.Split(t.req.PeerIPsString, "___") clientURLs := make([]string, len(peerIPs)) for i, u := range peerIPs { clientURLs[i] = fmt.Sprintf("http://%s:2379", u) @@ -34,8 +34,8 @@ func startZetcd(fs *flags, t *transporterServer) error { flags := []string{ // "-zkaddr", "0.0.0.0:2181", - "-zkaddr", fmt.Sprintf("%s:2181", peerIPs[t.req.ServerIndex]), - "-endpoint", clientURLs[t.req.ServerIndex], + "-zkaddr", fmt.Sprintf("%s:2181", peerIPs[t.req.IpIndex]), + "-endpoint", clientURLs[t.req.IpIndex], } flagString := strings.Join(flags, " ") diff --git a/agent/agent_zookeeper.go b/agent/agent_zookeeper.go index 1a1edae3..438ee3c7 100644 --- a/agent/agent_zookeeper.go +++ b/agent/agent_zookeeper.go @@ -30,47 +30,32 @@ dataDir={{.DataDir}} clientPort={{.ClientPort}} initLimit={{.InitLimit}} syncLimit={{.SyncLimit}} -maxClientCnxns={{.MaxClientCnxns}} +maxClientCnxns={{.MaxClientConnections}} snapCount={{.SnapCount}} {{range .Peers}}server.{{.MyID}}={{.IP}}:2888:3888 {{end}} ` - - // this is Zookeeper default configuration - // http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html - zkConfigDefault = ZookeeperConfig{ - TickTime: 2000, - ClientPort: "2181", - InitLimit: 5, - SyncLimit: 5, - MaxClientCnxns: 60, - Peers: []ZookeeperPeer{ - {MyID: 1, IP: ""}, - {MyID: 2, IP: ""}, - {MyID: 3, IP: ""}, - }, - } ) +// ZookeeperConfig is zookeeper configuration. +// http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html +type ZookeeperConfig struct { + TickTime int64 + DataDir string + ClientPort int64 + InitLimit int64 + SyncLimit int64 + MaxClientConnections int64 + SnapCount int64 + Peers []ZookeeperPeer +} + // ZookeeperPeer defines Zookeeper peer configuration. type ZookeeperPeer struct { MyID int IP string } -// ZookeeperConfig is zookeeper configuration. -// http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html -type ZookeeperConfig struct { - TickTime int - DataDir string - ClientPort string - InitLimit int - SyncLimit int - MaxClientCnxns int64 - SnapCount int64 - Peers []ZookeeperPeer -} - var shell = os.Getenv("SHELL") func init() { @@ -99,23 +84,26 @@ func startZookeeper(fs *flags, t *transporterServer) error { } ipath := filepath.Join(fs.zkDataDir, "myid") - plog.Infof("writing Zookeeper myid file %d to %s", t.req.ZookeeperMyID, ipath) - if err := toFile(fmt.Sprintf("%d", t.req.ZookeeperMyID), ipath); err != nil { + plog.Infof("writing Zookeeper myid file %d to %s", t.req.ZookeeperConfig.MyID, ipath) + if err := toFile(fmt.Sprintf("%d", t.req.ZookeeperConfig.MyID), ipath); err != nil { return err } - peerIPs := strings.Split(t.req.PeerIPString, "___") + peerIPs := strings.Split(t.req.PeerIPsString, "___") peers := []ZookeeperPeer{} for i := range peerIPs { peers = append(peers, ZookeeperPeer{MyID: i + 1, IP: peerIPs[i]}) } - - cfg := zkConfigDefault - cfg.DataDir = fs.zkDataDir - cfg.Peers = peers - cfg.SnapCount = t.req.ZookeeperSnapCount - cfg.MaxClientCnxns = t.req.ZookeeperMaxClientCnxns - + cfg := ZookeeperConfig{ + TickTime: t.req.ZookeeperConfig.TickTime, + DataDir: fs.zkDataDir, + ClientPort: t.req.ZookeeperConfig.ClientPort, + InitLimit: t.req.ZookeeperConfig.InitLimit, + SyncLimit: t.req.ZookeeperConfig.SyncLimit, + MaxClientConnections: t.req.ZookeeperConfig.MaxClientConnections, + Peers: peers, + SnapCount: t.req.ZookeeperConfig.SnapCount, + } tpl := template.Must(template.New("zkTemplate").Parse(zkTemplate)) buf := new(bytes.Buffer) if err := tpl.Execute(buf, cfg); err != nil { diff --git a/agent/agentpb/message.pb.go b/agent/agentpb/message.pb.go deleted file mode 100644 index 3ee1270a..00000000 --- a/agent/agentpb/message.pb.go +++ /dev/null @@ -1,1146 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: agent/agentpb/message.proto -// DO NOT EDIT! - -/* - Package agentpb is a generated protocol buffer package. - - It is generated from these files: - agent/agentpb/message.proto - - It has these top-level messages: - Request - Response -*/ -package agentpb - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import _ "github.com/gogo/protobuf/gogoproto" - -import ( - context "golang.org/x/net/context" - grpc "google.golang.org/grpc" -) - -import io "io" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type Request_Operation int32 - -const ( - Request_Start Request_Operation = 0 - Request_Stop Request_Operation = 1 - Request_Heartbeat Request_Operation = 2 -) - -var Request_Operation_name = map[int32]string{ - 0: "Start", - 1: "Stop", - 2: "Heartbeat", -} -var Request_Operation_value = map[string]int32{ - "Start": 0, - "Stop": 1, - "Heartbeat": 2, -} - -func (x Request_Operation) String() string { - return proto.EnumName(Request_Operation_name, int32(x)) -} -func (Request_Operation) EnumDescriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0, 0} } - -type Request_Database int32 - -const ( - Request_etcdv2 Request_Database = 0 - Request_etcdv3 Request_Database = 1 - Request_ZooKeeper Request_Database = 2 - Request_Consul Request_Database = 3 - Request_zetcd Request_Database = 4 - Request_cetcd Request_Database = 5 -) - -var Request_Database_name = map[int32]string{ - 0: "etcdv2", - 1: "etcdv3", - 2: "ZooKeeper", - 3: "Consul", - 4: "zetcd", - 5: "cetcd", -} -var Request_Database_value = map[string]int32{ - "etcdv2": 0, - "etcdv3": 1, - "ZooKeeper": 2, - "Consul": 3, - "zetcd": 4, - "cetcd": 5, -} - -func (x Request_Database) String() string { - return proto.EnumName(Request_Database_name, int32(x)) -} -func (Request_Database) EnumDescriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0, 1} } - -type Request struct { - Operation Request_Operation `protobuf:"varint,1,opt,name=operation,proto3,enum=agentpb.Request_Operation" json:"operation,omitempty"` - Database Request_Database `protobuf:"varint,2,opt,name=database,proto3,enum=agentpb.Request_Database" json:"database,omitempty"` - PeerIPString string `protobuf:"bytes,3,opt,name=peerIPString,proto3" json:"peerIPString,omitempty"` - // ServerIPIndex is the index in peerIPs that points to the - // corresponding remote IP. - ServerIndex uint32 `protobuf:"varint,4,opt,name=serverIndex,proto3" json:"serverIndex,omitempty"` - // TestName prefixes all logs to be generated in agent. - TestName string `protobuf:"bytes,5,opt,name=testName,proto3" json:"testName,omitempty"` - // ZookeeperMyID is myid that needs to be stored as a file in the remote machine. - ZookeeperMyID uint32 `protobuf:"varint,6,opt,name=zookeeperMyID,proto3" json:"zookeeperMyID,omitempty"` - // EtcdSnapCount is 100,000 by default. - EtcdSnapCount int64 `protobuf:"varint,7,opt,name=etcdSnapCount,proto3" json:"etcdSnapCount,omitempty"` - // EtcdQuotaSizeBytes is the backend size limit in bytes. - // 0 defaults to low space quota (2 GB). - EtcdQuotaSizeBytes int64 `protobuf:"varint,8,opt,name=etcdQuotaSizeBytes,proto3" json:"etcdQuotaSizeBytes,omitempty"` - // ZookeeperSnapCount is 100,000 by default. - ZookeeperSnapCount int64 `protobuf:"varint,9,opt,name=zookeeperSnapCount,proto3" json:"zookeeperSnapCount,omitempty"` - // ZookeeperMaxClientCnxns limits the number of concurrent connections - // (at the socket level) that a single client, identified by IP address. - ZookeeperMaxClientCnxns int64 `protobuf:"varint,10,opt,name=zookeeperMaxClientCnxns,proto3" json:"zookeeperMaxClientCnxns,omitempty"` - // ClientNum is current number of clients. - ClientNum int64 `protobuf:"varint,11,opt,name=clientNum,proto3" json:"clientNum,omitempty"` - // UploadLogs is true if automatic log-uploading is needed. - // Currently only support Google Cloud Storage. - UploadLogs bool `protobuf:"varint,100,opt,name=uploadLogs,proto3" json:"uploadLogs,omitempty"` - // GoogleCloudProjectName is the project name to use - // to upload logs. - GoogleCloudProjectName string `protobuf:"bytes,101,opt,name=googleCloudProjectName,proto3" json:"googleCloudProjectName,omitempty"` - // GoogleCloudStorageKey is the key to be used to upload - // data and logs to Google Cloud Storage and others. - GoogleCloudStorageKey string `protobuf:"bytes,102,opt,name=googleCloudStorageKey,proto3" json:"googleCloudStorageKey,omitempty"` - // GoogleCloudStorageBucketName is the bucket name to store all data and logs. - GoogleCloudStorageBucketName string `protobuf:"bytes,103,opt,name=googleCloudStorageBucketName,proto3" json:"googleCloudStorageBucketName,omitempty"` - // GoogleCloudStorageSubDirectory is the sub-directory name to store data. - GoogleCloudStorageSubDirectory string `protobuf:"bytes,104,opt,name=googleCloudStorageSubDirectory,proto3" json:"googleCloudStorageSubDirectory,omitempty"` -} - -func (m *Request) Reset() { *m = Request{} } -func (m *Request) String() string { return proto.CompactTextString(m) } -func (*Request) ProtoMessage() {} -func (*Request) Descriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0} } - -type Response struct { - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - // Datasize is the data size of the database on disk. - // It measures after database is requested to stop. - Datasize int64 `protobuf:"varint,2,opt,name=datasize,proto3" json:"datasize,omitempty"` -} - -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { return fileDescriptorMessage, []int{1} } - -func init() { - proto.RegisterType((*Request)(nil), "agentpb.Request") - proto.RegisterType((*Response)(nil), "agentpb.Response") - proto.RegisterEnum("agentpb.Request_Operation", Request_Operation_name, Request_Operation_value) - proto.RegisterEnum("agentpb.Request_Database", Request_Database_name, Request_Database_value) -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// Client API for Transporter service - -type TransporterClient interface { - Transfer(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) -} - -type transporterClient struct { - cc *grpc.ClientConn -} - -func NewTransporterClient(cc *grpc.ClientConn) TransporterClient { - return &transporterClient{cc} -} - -func (c *transporterClient) Transfer(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) { - out := new(Response) - err := grpc.Invoke(ctx, "/agentpb.Transporter/Transfer", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Server API for Transporter service - -type TransporterServer interface { - Transfer(context.Context, *Request) (*Response, error) -} - -func RegisterTransporterServer(s *grpc.Server, srv TransporterServer) { - s.RegisterService(&_Transporter_serviceDesc, srv) -} - -func _Transporter_Transfer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TransporterServer).Transfer(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/agentpb.Transporter/Transfer", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TransporterServer).Transfer(ctx, req.(*Request)) - } - return interceptor(ctx, in, info, handler) -} - -var _Transporter_serviceDesc = grpc.ServiceDesc{ - ServiceName: "agentpb.Transporter", - HandlerType: (*TransporterServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Transfer", - Handler: _Transporter_Transfer_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "agent/agentpb/message.proto", -} - -func (m *Request) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Request) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if m.Operation != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.Operation)) - } - if m.Database != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.Database)) - } - if len(m.PeerIPString) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.PeerIPString))) - i += copy(dAtA[i:], m.PeerIPString) - } - if m.ServerIndex != 0 { - dAtA[i] = 0x20 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.ServerIndex)) - } - if len(m.TestName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.TestName))) - i += copy(dAtA[i:], m.TestName) - } - if m.ZookeeperMyID != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.ZookeeperMyID)) - } - if m.EtcdSnapCount != 0 { - dAtA[i] = 0x38 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.EtcdSnapCount)) - } - if m.EtcdQuotaSizeBytes != 0 { - dAtA[i] = 0x40 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.EtcdQuotaSizeBytes)) - } - if m.ZookeeperSnapCount != 0 { - dAtA[i] = 0x48 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.ZookeeperSnapCount)) - } - if m.ZookeeperMaxClientCnxns != 0 { - dAtA[i] = 0x50 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.ZookeeperMaxClientCnxns)) - } - if m.ClientNum != 0 { - dAtA[i] = 0x58 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.ClientNum)) - } - if m.UploadLogs { - dAtA[i] = 0xa0 - i++ - dAtA[i] = 0x6 - i++ - if m.UploadLogs { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if len(m.GoogleCloudProjectName) > 0 { - dAtA[i] = 0xaa - i++ - dAtA[i] = 0x6 - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudProjectName))) - i += copy(dAtA[i:], m.GoogleCloudProjectName) - } - if len(m.GoogleCloudStorageKey) > 0 { - dAtA[i] = 0xb2 - i++ - dAtA[i] = 0x6 - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageKey))) - i += copy(dAtA[i:], m.GoogleCloudStorageKey) - } - if len(m.GoogleCloudStorageBucketName) > 0 { - dAtA[i] = 0xba - i++ - dAtA[i] = 0x6 - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageBucketName))) - i += copy(dAtA[i:], m.GoogleCloudStorageBucketName) - } - if len(m.GoogleCloudStorageSubDirectory) > 0 { - dAtA[i] = 0xc2 - i++ - dAtA[i] = 0x6 - i++ - i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageSubDirectory))) - i += copy(dAtA[i:], m.GoogleCloudStorageSubDirectory) - } - return i, nil -} - -func (m *Response) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Response) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if m.Success { - dAtA[i] = 0x8 - i++ - if m.Success { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if m.Datasize != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintMessage(dAtA, i, uint64(m.Datasize)) - } - return i, nil -} - -func encodeFixed64Message(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Message(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} -func encodeVarintMessage(dAtA []byte, offset int, v uint64) int { - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return offset + 1 -} -func (m *Request) Size() (n int) { - var l int - _ = l - if m.Operation != 0 { - n += 1 + sovMessage(uint64(m.Operation)) - } - if m.Database != 0 { - n += 1 + sovMessage(uint64(m.Database)) - } - l = len(m.PeerIPString) - if l > 0 { - n += 1 + l + sovMessage(uint64(l)) - } - if m.ServerIndex != 0 { - n += 1 + sovMessage(uint64(m.ServerIndex)) - } - l = len(m.TestName) - if l > 0 { - n += 1 + l + sovMessage(uint64(l)) - } - if m.ZookeeperMyID != 0 { - n += 1 + sovMessage(uint64(m.ZookeeperMyID)) - } - if m.EtcdSnapCount != 0 { - n += 1 + sovMessage(uint64(m.EtcdSnapCount)) - } - if m.EtcdQuotaSizeBytes != 0 { - n += 1 + sovMessage(uint64(m.EtcdQuotaSizeBytes)) - } - if m.ZookeeperSnapCount != 0 { - n += 1 + sovMessage(uint64(m.ZookeeperSnapCount)) - } - if m.ZookeeperMaxClientCnxns != 0 { - n += 1 + sovMessage(uint64(m.ZookeeperMaxClientCnxns)) - } - if m.ClientNum != 0 { - n += 1 + sovMessage(uint64(m.ClientNum)) - } - if m.UploadLogs { - n += 3 - } - l = len(m.GoogleCloudProjectName) - if l > 0 { - n += 2 + l + sovMessage(uint64(l)) - } - l = len(m.GoogleCloudStorageKey) - if l > 0 { - n += 2 + l + sovMessage(uint64(l)) - } - l = len(m.GoogleCloudStorageBucketName) - if l > 0 { - n += 2 + l + sovMessage(uint64(l)) - } - l = len(m.GoogleCloudStorageSubDirectory) - if l > 0 { - n += 2 + l + sovMessage(uint64(l)) - } - return n -} - -func (m *Response) Size() (n int) { - var l int - _ = l - if m.Success { - n += 2 - } - if m.Datasize != 0 { - n += 1 + sovMessage(uint64(m.Datasize)) - } - return n -} - -func sovMessage(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} -func sozMessage(x uint64) (n int) { - return sovMessage(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Request) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Operation", wireType) - } - m.Operation = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Operation |= (Request_Operation(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Database", wireType) - } - m.Database = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Database |= (Request_Database(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PeerIPString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PeerIPString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ServerIndex", wireType) - } - m.ServerIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ServerIndex |= (uint32(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TestName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TestName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ZookeeperMyID", wireType) - } - m.ZookeeperMyID = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ZookeeperMyID |= (uint32(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EtcdSnapCount", wireType) - } - m.EtcdSnapCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EtcdSnapCount |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EtcdQuotaSizeBytes", wireType) - } - m.EtcdQuotaSizeBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EtcdQuotaSizeBytes |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ZookeeperSnapCount", wireType) - } - m.ZookeeperSnapCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ZookeeperSnapCount |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ZookeeperMaxClientCnxns", wireType) - } - m.ZookeeperMaxClientCnxns = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ZookeeperMaxClientCnxns |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientNum", wireType) - } - m.ClientNum = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ClientNum |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 100: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadLogs", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.UploadLogs = bool(v != 0) - case 101: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GoogleCloudProjectName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GoogleCloudProjectName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 102: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GoogleCloudStorageKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GoogleCloudStorageKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 103: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GoogleCloudStorageBucketName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GoogleCloudStorageBucketName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 104: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GoogleCloudStorageSubDirectory", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthMessage - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GoogleCloudStorageSubDirectory = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipMessage(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthMessage - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Response) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.Success = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Datasize", wireType) - } - m.Datasize = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowMessage - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Datasize |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipMessage(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthMessage - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipMessage(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - return iNdEx, nil - case 1: - iNdEx += 8 - return iNdEx, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - iNdEx += length - if length < 0 { - return 0, ErrInvalidLengthMessage - } - return iNdEx, nil - case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowMessage - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipMessage(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - } - return iNdEx, nil - case 4: - return iNdEx, nil - case 5: - iNdEx += 4 - return iNdEx, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} - -var ( - ErrInvalidLengthMessage = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowMessage = fmt.Errorf("proto: integer overflow") -) - -func init() { proto.RegisterFile("agent/agentpb/message.proto", fileDescriptorMessage) } - -var fileDescriptorMessage = []byte{ - // 596 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xcd, 0x6e, 0xd3, 0x4e, - 0x10, 0x8f, 0x9b, 0xb6, 0xb1, 0xa7, 0xff, 0xfe, 0x65, 0x56, 0x7c, 0x2c, 0xa1, 0xb2, 0xa2, 0x88, - 0x43, 0x2e, 0x24, 0xa2, 0x05, 0xd4, 0x63, 0x95, 0x54, 0x88, 0xaa, 0x50, 0x8a, 0xcd, 0x89, 0xdb, - 0xda, 0x99, 0xba, 0xa6, 0x89, 0xc7, 0xec, 0xae, 0xab, 0x26, 0x27, 0x1e, 0x83, 0x47, 0xea, 0x91, - 0x47, 0x80, 0xf2, 0x22, 0xc8, 0xeb, 0xd4, 0x49, 0x49, 0x0b, 0x97, 0x68, 0x7e, 0x5f, 0x33, 0xd1, - 0xee, 0x8e, 0xe1, 0x89, 0x88, 0x31, 0xd5, 0x3d, 0xf3, 0x9b, 0x85, 0xbd, 0x31, 0x2a, 0x25, 0x62, - 0xec, 0x66, 0x92, 0x34, 0xb1, 0xc6, 0x8c, 0x6e, 0x3e, 0x8b, 0x13, 0x7d, 0x9a, 0x87, 0xdd, 0x88, - 0xc6, 0xbd, 0x98, 0x62, 0xea, 0x19, 0x3d, 0xcc, 0x4f, 0x0c, 0x32, 0xc0, 0x54, 0x65, 0xae, 0xfd, - 0xb5, 0x01, 0x0d, 0x1f, 0xbf, 0xe4, 0xa8, 0x34, 0xdb, 0x05, 0x87, 0x32, 0x94, 0x42, 0x27, 0x94, - 0x72, 0xab, 0x65, 0x75, 0xfe, 0xdf, 0x6e, 0x76, 0x67, 0x7d, 0xbb, 0x33, 0x53, 0xf7, 0xfd, 0xb5, - 0xc3, 0x9f, 0x9b, 0xd9, 0x4b, 0xb0, 0x87, 0x42, 0x8b, 0x50, 0x28, 0xe4, 0x2b, 0x26, 0xf8, 0x78, - 0x29, 0xb8, 0x3f, 0x33, 0xf8, 0x95, 0x95, 0xb5, 0xe1, 0xbf, 0x0c, 0x51, 0x1e, 0x1c, 0x07, 0x5a, - 0x26, 0x69, 0xcc, 0xeb, 0x2d, 0xab, 0xe3, 0xf8, 0x37, 0x38, 0xd6, 0x82, 0x0d, 0x85, 0xf2, 0x1c, - 0xe5, 0x41, 0x3a, 0xc4, 0x0b, 0xbe, 0xda, 0xb2, 0x3a, 0x9b, 0xfe, 0x22, 0xc5, 0x9a, 0x60, 0x6b, - 0x54, 0xfa, 0x48, 0x8c, 0x91, 0xaf, 0x99, 0x0e, 0x15, 0x66, 0x4f, 0x61, 0x73, 0x4a, 0x74, 0x86, - 0x98, 0xa1, 0x7c, 0x37, 0x39, 0xd8, 0xe7, 0xeb, 0x26, 0x7f, 0x93, 0x2c, 0x5c, 0xa8, 0xa3, 0x61, - 0x90, 0x8a, 0x6c, 0x40, 0x79, 0xaa, 0x79, 0xa3, 0x65, 0x75, 0xea, 0xfe, 0x4d, 0x92, 0x75, 0x81, - 0x15, 0xc4, 0x87, 0x9c, 0xb4, 0x08, 0x92, 0x29, 0xf6, 0x27, 0x1a, 0x15, 0xb7, 0x8d, 0xf5, 0x16, - 0xa5, 0xf0, 0x57, 0x63, 0xe6, 0xad, 0x9d, 0xd2, 0xbf, 0xac, 0xb0, 0x5d, 0x78, 0x34, 0xff, 0x5b, - 0xe2, 0x62, 0x30, 0x4a, 0x30, 0xd5, 0x83, 0xf4, 0x22, 0x55, 0x1c, 0x4c, 0xe8, 0x2e, 0x99, 0x6d, - 0x81, 0x13, 0x19, 0x78, 0x94, 0x8f, 0xf9, 0x86, 0xf1, 0xce, 0x09, 0xe6, 0x01, 0xe4, 0xd9, 0x88, - 0xc4, 0xf0, 0x2d, 0xc5, 0x8a, 0x0f, 0x5b, 0x56, 0xc7, 0xf6, 0x17, 0x18, 0xf6, 0x0a, 0x1e, 0xc6, - 0x44, 0xf1, 0x08, 0x07, 0x23, 0xca, 0x87, 0xc7, 0x92, 0x3e, 0x63, 0x54, 0x9e, 0x26, 0x9a, 0xd3, - 0xbc, 0x43, 0x65, 0x2f, 0xe0, 0xc1, 0x82, 0x12, 0x68, 0x92, 0x22, 0xc6, 0x43, 0x9c, 0xf0, 0x13, - 0x13, 0xbb, 0x5d, 0x64, 0x7d, 0xd8, 0x5a, 0x16, 0xfa, 0x79, 0x74, 0x86, 0xe5, 0xcc, 0xd8, 0x84, - 0xff, 0xea, 0x61, 0xaf, 0xc1, 0x5b, 0xd6, 0x83, 0x3c, 0xdc, 0x4f, 0x24, 0x46, 0x9a, 0xe4, 0x84, - 0x9f, 0x9a, 0x2e, 0xff, 0x70, 0xb5, 0x7b, 0xe0, 0x54, 0xcf, 0x99, 0x39, 0xb0, 0x16, 0x68, 0x21, - 0xb5, 0x5b, 0x63, 0x36, 0xac, 0x06, 0x9a, 0x32, 0xd7, 0x62, 0x9b, 0xe0, 0xbc, 0x41, 0x21, 0x75, - 0x88, 0x42, 0xbb, 0x2b, 0xed, 0x00, 0xec, 0xeb, 0x67, 0xcc, 0x00, 0xd6, 0x8b, 0x4b, 0x3f, 0xdf, - 0x76, 0x6b, 0x55, 0xbd, 0x53, 0x46, 0x3e, 0x11, 0x1d, 0x9a, 0x7b, 0x72, 0x57, 0x0a, 0x69, 0x40, - 0xa9, 0xca, 0x47, 0x6e, 0xbd, 0x18, 0x31, 0x2d, 0x7c, 0xee, 0x6a, 0x51, 0x46, 0xa6, 0x5c, 0x6b, - 0xef, 0x81, 0xed, 0xa3, 0xca, 0x28, 0x55, 0xc8, 0x38, 0x34, 0x54, 0x1e, 0x45, 0xa8, 0x94, 0x59, - 0x40, 0xdb, 0xbf, 0x86, 0xc5, 0x2b, 0x2f, 0xf6, 0x46, 0x25, 0xd3, 0x72, 0xc5, 0xea, 0x7e, 0x85, - 0xb7, 0xf7, 0x60, 0xe3, 0xa3, 0x14, 0xa9, 0xca, 0x48, 0x6a, 0x94, 0xec, 0x39, 0xd8, 0x06, 0x9e, - 0xa0, 0x64, 0xee, 0x9f, 0x7b, 0xd8, 0xbc, 0xb7, 0xc0, 0x94, 0x53, 0xdb, 0xb5, 0xfe, 0xfd, 0xcb, - 0x9f, 0x5e, 0xed, 0xf2, 0xca, 0xb3, 0xbe, 0x5f, 0x79, 0xd6, 0x8f, 0x2b, 0xcf, 0xfa, 0xf6, 0xcb, - 0xab, 0x85, 0xeb, 0xe6, 0x1b, 0xb1, 0xf3, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x25, 0x00, 0x4e, - 0x7a, 0x04, 0x00, 0x00, -} diff --git a/agent/agentpb/message.proto b/agent/agentpb/message.proto deleted file mode 100644 index 7ea9bb51..00000000 --- a/agent/agentpb/message.proto +++ /dev/null @@ -1,86 +0,0 @@ -syntax = "proto3"; -package agentpb; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.marshaler_all) = true; -option (gogoproto.sizer_all) = true; -option (gogoproto.unmarshaler_all) = true; -option (gogoproto.goproto_getters_all) = false; - -service Transporter { - rpc Transfer(Request) returns (Response) {} -} - -message Request { - enum Operation { - Start = 0; - Stop = 1; - Heartbeat = 2; - } - enum Database { - etcdv2 = 0; - etcdv3 = 1; - ZooKeeper = 2; - Consul = 3; - zetcd = 4; - cetcd = 5; - } - - Operation operation = 1; - Database database = 2; - string peerIPString = 3; - - // ServerIPIndex is the index in peerIPs that points to the - // corresponding remote IP. - uint32 serverIndex = 4; - - // TestName prefixes all logs to be generated in agent. - string testName = 5; - - // ZookeeperMyID is myid that needs to be stored as a file in the remote machine. - uint32 zookeeperMyID = 6; - - // EtcdSnapCount is 100,000 by default. - int64 etcdSnapCount = 7; - - // EtcdQuotaSizeBytes is the backend size limit in bytes. - // 0 defaults to low space quota (2 GB). - int64 etcdQuotaSizeBytes = 8; - - // ZookeeperSnapCount is 100,000 by default. - int64 zookeeperSnapCount = 9; - - // ZookeeperMaxClientCnxns limits the number of concurrent connections - // (at the socket level) that a single client, identified by IP address. - int64 zookeeperMaxClientCnxns = 10; - - // ClientNum is current number of clients. - int64 clientNum = 11; - - // UploadLogs is true if automatic log-uploading is needed. - // Currently only support Google Cloud Storage. - bool uploadLogs = 100; - - // GoogleCloudProjectName is the project name to use - // to upload logs. - string googleCloudProjectName = 101; - - // GoogleCloudStorageKey is the key to be used to upload - // data and logs to Google Cloud Storage and others. - string googleCloudStorageKey = 102; - - // GoogleCloudStorageBucketName is the bucket name to store all data and logs. - string googleCloudStorageBucketName = 103; - - // GoogleCloudStorageSubDirectory is the sub-directory name to store data. - string googleCloudStorageSubDirectory = 104; -} - -message Response { - bool success = 1; - - // Datasize is the data size of the database on disk. - // It measures after database is requested to stop. - int64 datasize = 2; -} diff --git a/agent/command.go b/agent/command.go index 46460d30..a7696bb4 100644 --- a/agent/command.go +++ b/agent/command.go @@ -19,7 +19,7 @@ import ( "os" "path/filepath" - "github.com/coreos/dbtester/agent/agentpb" + "github.com/coreos/dbtester/dbtesterpb" "github.com/coreos/dbtester/pkg/netutil" "github.com/coreos/dbtester/pkg/ntp" "github.com/coreos/pkg/capnslog" @@ -71,8 +71,8 @@ func init() { Command.PersistentFlags().StringVar(&globalFlags.agentLog, "agent-log", filepath.Join(homeDir(), "agent.log"), "agent log path.") Command.PersistentFlags().StringVar(&globalFlags.databaseLog, "database-log", filepath.Join(homeDir(), "database.log"), "Database log path.") - Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSV, "system-metrics-csv", filepath.Join(homeDir(), "system-metrics.csv"), "Raw system metrics data path.") - Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSVInterpolated, "system-metrics-csv-interpolated", filepath.Join(homeDir(), "system-metrics-interpolated.csv"), "Interpolated system metrics data path.") + Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSV, "system-metrics-csv", filepath.Join(homeDir(), "server-system-metrics.csv"), "Raw system metrics data path.") + Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSVInterpolated, "system-metrics-csv-interpolated", filepath.Join(homeDir(), "server-system-metrics-interpolated.csv"), "Interpolated system metrics data path.") Command.PersistentFlags().StringVar(&globalFlags.javaExec, "java-exec", "/usr/bin/java", "Java executable binary path (needed for Zookeeper).") Command.PersistentFlags().StringVar(&globalFlags.etcdExec, "etcd-exec", filepath.Join(os.Getenv("GOPATH"), "bin/etcd"), "etcd executable binary path.") @@ -95,7 +95,7 @@ func init() { // Command implements 'agent' command. var Command = &cobra.Command{ Use: "agent", - Short: "Database 'agent' in remote servers (runs database, upload logs).", + Short: "Database 'agent' in remote servers.", RunE: commandFunc, } @@ -119,7 +119,7 @@ func commandFunc(cmd *cobra.Command, args []string) error { if err != nil { return err } - agentpb.RegisterTransporterServer(grpcServer, sender) + dbtesterpb.RegisterTransporterServer(grpcServer, sender) plog.Infof("agent started with gRPC %s (log path %q)", globalFlags.grpcPort, globalFlags.agentLog) return grpcServer.Serve(ln) diff --git a/agent/server.go b/agent/server.go index 673cd485..14e4127b 100644 --- a/agent/server.go +++ b/agent/server.go @@ -22,15 +22,15 @@ import ( "syscall" "time" - "github.com/coreos/dbtester/agent/agentpb" + "github.com/coreos/dbtester/dbtesterpb" "github.com/coreos/dbtester/pkg/fileinspect" "github.com/gyuho/psn" "golang.org/x/net/context" ) -// implements agentpb.TransporterServer +// implements dbtesterpb.TransporterServer type transporterServer struct { - req agentpb.Request + req dbtesterpb.Request databaseLogFile *os.File proxyDatabaseLogfile *os.File @@ -61,7 +61,7 @@ type transporterServer struct { } // NewServer returns a new server that implements gRPC interface. -func NewServer() agentpb.TransporterServer { +func NewServer() dbtesterpb.TransporterServer { notifier := make(chan os.Signal, 1) signal.Notify(notifier, syscall.SIGINT, syscall.SIGTERM) @@ -73,12 +73,12 @@ func NewServer() agentpb.TransporterServer { } } -func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (*agentpb.Response, error) { - if r != nil { - plog.Infof("received gRPC request %q with database %q (clients: %d)", r.Operation, r.Database, r.ClientNum) +func (t *transporterServer) Transfer(ctx context.Context, req *dbtesterpb.Request) (*dbtesterpb.Response, error) { + if req != nil { + plog.Infof("received gRPC request %q with database %q (clients: %d)", req.Operation, req.DatabaseID, req.CurrentClientNumber) } - if r.Operation == agentpb.Request_Start { + if req.Operation == dbtesterpb.Request_Start { f, err := openToAppend(globalFlags.databaseLog) if err != nil { return nil, err @@ -87,8 +87,8 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* plog.Infof("agent log path: %q", globalFlags.agentLog) plog.Infof("database log path: %q", globalFlags.databaseLog) - if r.Database == agentpb.Request_zetcd || r.Database == agentpb.Request_cetcd { - proxyLog := globalFlags.databaseLog + "-" + t.req.Database.String() + if req.DatabaseID == dbtesterpb.Request_zetcd || req.DatabaseID == dbtesterpb.Request_cetcd { + proxyLog := globalFlags.databaseLog + "-" + t.req.DatabaseID.String() pf, err := openToAppend(proxyLog) if err != nil { return nil, err @@ -98,47 +98,47 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* } plog.Infof("system metrics CSV path: %q", globalFlags.systemMetricsCSV) - switch r.Database { - case agentpb.Request_ZooKeeper: + switch req.DatabaseID { + case dbtesterpb.Request_zookeeper: plog.Infof("Zookeeper working directory: %q", globalFlags.zkWorkDir) plog.Infof("Zookeeper data directory: %q", globalFlags.zkDataDir) plog.Infof("Zookeeper configuration path: %q", globalFlags.zkConfig) - case agentpb.Request_etcdv2, agentpb.Request_etcdv3: + case dbtesterpb.Request_etcdv2, dbtesterpb.Request_etcdv3: plog.Infof("etcd executable binary path: %q", globalFlags.etcdExec) plog.Infof("etcd data directory: %q", globalFlags.etcdDataDir) - case agentpb.Request_zetcd: + case dbtesterpb.Request_zetcd: plog.Infof("zetcd executable binary path: %q", globalFlags.zetcdExec) plog.Infof("zetcd data directory: %q", globalFlags.etcdDataDir) - case agentpb.Request_cetcd: + case dbtesterpb.Request_cetcd: plog.Infof("cetcd executable binary path: %q", globalFlags.cetcdExec) plog.Infof("cetcd data directory: %q", globalFlags.etcdDataDir) - case agentpb.Request_Consul: + case dbtesterpb.Request_consul: plog.Infof("Consul executable binary path: %q", globalFlags.consulExec) plog.Infof("Consul data directory: %q", globalFlags.consulDataDir) } // re-use configurations for next requests - t.req = *r + t.req = *req } - if r.Operation == agentpb.Request_Heartbeat { - t.req.ClientNum = r.ClientNum + if req.Operation == dbtesterpb.Request_Heartbeat { + t.req.CurrentClientNumber = req.CurrentClientNumber } var totalDatasize int64 - switch r.Operation { - case agentpb.Request_Start: - switch t.req.Database { - case agentpb.Request_etcdv2, agentpb.Request_etcdv3, agentpb.Request_zetcd, agentpb.Request_cetcd: + switch req.Operation { + case dbtesterpb.Request_Start: + switch t.req.DatabaseID { + case dbtesterpb.Request_etcdv2, dbtesterpb.Request_etcdv3, dbtesterpb.Request_zetcd, dbtesterpb.Request_cetcd: if err := startEtcd(&globalFlags, t); err != nil { plog.Errorf("startEtcd error %v", err) return nil, err } - switch t.req.Database { - case agentpb.Request_zetcd: + switch t.req.DatabaseID { + case dbtesterpb.Request_zetcd: if err := startZetcd(&globalFlags, t); err != nil { plog.Errorf("startZetcd error %v", err) return nil, err @@ -151,7 +151,7 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* } plog.Infof("exiting %q", t.proxyCmd.Path) }() - case agentpb.Request_cetcd: + case dbtesterpb.Request_cetcd: if err := startCetcd(&globalFlags, t); err != nil { plog.Errorf("startCetcd error %v", err) return nil, err @@ -165,18 +165,18 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* plog.Infof("exiting %q", t.proxyCmd.Path) }() } - case agentpb.Request_ZooKeeper: + case dbtesterpb.Request_zookeeper: if err := startZookeeper(&globalFlags, t); err != nil { plog.Errorf("startZookeeper error %v", err) return nil, err } - case agentpb.Request_Consul: + case dbtesterpb.Request_consul: if err := startConsul(&globalFlags, t); err != nil { plog.Errorf("startConsul error %v", err) return nil, err } default: - return nil, fmt.Errorf("unknown database %q", t.req.Database) + return nil, fmt.Errorf("unknown database %q", t.req.DatabaseID) } go func() { @@ -193,7 +193,7 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* return nil, err } - case agentpb.Request_Stop: + case dbtesterpb.Request_Stop: if t.cmd == nil { return nil, fmt.Errorf("nil command") } @@ -216,7 +216,7 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* t.databaseLogFile.Sync() t.databaseLogFile.Close() } - plog.Infof("stopped binary %q [PID: %d]", t.req.Database.String(), t.pid) + plog.Infof("stopped binary %q [PID: %d]", t.req.DatabaseID.String(), t.pid) if t.proxyCmd != nil { plog.Infof("sending %q to %q [PID: %d]", syscall.SIGINT, t.proxyCmd.Path, t.proxyPid) @@ -229,7 +229,7 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* plog.Warningf("syscall.Kill failed with %v", err) } <-t.proxyCmdWait - plog.Infof("stopped binary proxy for %q [PID: %d]", t.req.Database.String(), t.pid) + plog.Infof("stopped binary proxy for %q [PID: %d]", t.req.DatabaseID.String(), t.pid) } if t.proxyDatabaseLogfile != nil { t.proxyDatabaseLogfile.Sync() @@ -239,47 +239,47 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* t.uploadSig <- struct{}{} <-t.csvReady - if t.req.UploadLogs { + if t.req.TriggerLogUpload { if err := uploadLog(&globalFlags, t); err != nil { plog.Warningf("uploadLog error %v", err) return nil, err } } - dbs, err := measureDatabasSize(globalFlags, r.Database) + dbs, err := measureDatabasSize(globalFlags, req.DatabaseID) if err != nil { plog.Warningf("measureDatabasSize error %v", err) return nil, err } totalDatasize = dbs - case agentpb.Request_Heartbeat: - plog.Infof("overwriting clients num %d to %q", t.req.ClientNum, t.clientNumPath) - if err := toFile(fmt.Sprintf("%d", t.req.ClientNum), t.clientNumPath); err != nil { + case dbtesterpb.Request_Heartbeat: + plog.Infof("overwriting clients num %d to %q", t.req.CurrentClientNumber, t.clientNumPath) + if err := toFile(fmt.Sprintf("%d", t.req.CurrentClientNumber), t.clientNumPath); err != nil { return nil, err } default: - return nil, fmt.Errorf("Not implemented %v", r.Operation) + return nil, fmt.Errorf("Not implemented %v", req.Operation) } plog.Info("Transfer success!") - return &agentpb.Response{Success: true, Datasize: totalDatasize}, nil + return &dbtesterpb.Response{Success: true, DatasizeOnDisk: totalDatasize}, nil } -func measureDatabasSize(flg flags, rdb agentpb.Request_Database) (int64, error) { +func measureDatabasSize(flg flags, rdb dbtesterpb.Request_Database) (int64, error) { switch rdb { - case agentpb.Request_etcdv2: + case dbtesterpb.Request_etcdv2: return fileinspect.Size(flg.etcdDataDir) - case agentpb.Request_etcdv3: + case dbtesterpb.Request_etcdv3: return fileinspect.Size(flg.etcdDataDir) - case agentpb.Request_ZooKeeper: + case dbtesterpb.Request_zookeeper: return fileinspect.Size(flg.zkDataDir) - case agentpb.Request_Consul: + case dbtesterpb.Request_consul: return fileinspect.Size(flg.consulDataDir) - case agentpb.Request_cetcd: + case dbtesterpb.Request_cetcd: return fileinspect.Size(flg.etcdDataDir) - case agentpb.Request_zetcd: + case dbtesterpb.Request_zetcd: return fileinspect.Size(flg.etcdDataDir) default: return 0, fmt.Errorf("uknown %q", rdb) diff --git a/agent/server_system_metrics.go b/agent/server_system_metrics.go index e6821349..4b372748 100644 --- a/agent/server_system_metrics.go +++ b/agent/server_system_metrics.go @@ -28,12 +28,12 @@ func startMetrics(fs *flags, t *transporterServer) (err error) { return fmt.Errorf("cannot find process to track (%+v, %+v)", fs, t) } plog.Infof("starting collecting metrics [database %q | PID: %d | disk device: %q | network interface: %q]", - t.req.Database, t.pid, fs.diskDevice, fs.networkInterface) + t.req.DatabaseID, t.pid, fs.diskDevice, fs.networkInterface) if err = os.RemoveAll(fs.systemMetricsCSV); err != nil { return err } - if err = toFile(fmt.Sprintf("%d", t.req.ClientNum), t.clientNumPath); err != nil { + if err = toFile(fmt.Sprintf("%d", t.req.CurrentClientNumber), t.clientNumPath); err != nil { return err } diff --git a/agent/upload_log.go b/agent/upload_log.go index ea96b343..80cdc63d 100644 --- a/agent/upload_log.go +++ b/agent/upload_log.go @@ -20,14 +20,14 @@ import ( "strings" "time" - "github.com/coreos/dbtester/agent/agentpb" + "github.com/coreos/dbtester/dbtesterpb" "github.com/coreos/dbtester/pkg/remotestorage" ) // uploadLog starts cetcd. This assumes that etcd is already started. func uploadLog(fs *flags, t *transporterServer) error { - plog.Infof("stopped collecting metrics; uploading logs to storage %q", t.req.GoogleCloudProjectName) - u, err := remotestorage.NewGoogleCloudStorage([]byte(t.req.GoogleCloudStorageKey), t.req.GoogleCloudProjectName) + plog.Infof("stopped collecting metrics; uploading logs to storage %q", t.req.Control.GoogleCloudProjectName) + u, err := remotestorage.NewGoogleCloudStorage([]byte(t.req.Control.GoogleCloudStorageKey), t.req.Control.GoogleCloudProjectName) if err != nil { return err } @@ -37,13 +37,13 @@ func uploadLog(fs *flags, t *transporterServer) error { { srcDatabaseLogPath := fs.databaseLog dstDatabaseLogPath := filepath.Base(fs.databaseLog) - if !strings.HasPrefix(filepath.Base(fs.databaseLog), t.req.TestName) { - dstDatabaseLogPath = fmt.Sprintf("%s-%d-%s", t.req.TestName, t.req.ServerIndex+1, filepath.Base(fs.databaseLog)) + if !strings.HasPrefix(filepath.Base(fs.databaseLog), t.req.DatabaseTag) { + dstDatabaseLogPath = fmt.Sprintf("%s-%d-%s", t.req.DatabaseTag, t.req.IpIndex+1, filepath.Base(fs.databaseLog)) } - dstDatabaseLogPath = filepath.Join(t.req.GoogleCloudStorageSubDirectory, dstDatabaseLogPath) + dstDatabaseLogPath = filepath.Join(t.req.Control.GoogleCloudStorageSubDirectory, dstDatabaseLogPath) plog.Infof("uploading database log [%q -> %q]", srcDatabaseLogPath, dstDatabaseLogPath) for k := 0; k < 30; k++ { - if uerr = u.UploadFile(t.req.GoogleCloudStorageBucketName, srcDatabaseLogPath, dstDatabaseLogPath); uerr != nil { + if uerr = u.UploadFile(t.req.Control.GoogleCloudStorageBucketName, srcDatabaseLogPath, dstDatabaseLogPath); uerr != nil { plog.Warningf("UploadFile error... sleep and retry... (%v)", uerr) time.Sleep(2 * time.Second) continue @@ -57,17 +57,17 @@ func uploadLog(fs *flags, t *transporterServer) error { } { - if t.req.Database == agentpb.Request_zetcd || t.req.Database == agentpb.Request_cetcd { - dpath := fs.databaseLog + "-" + t.req.Database.String() + if t.req.DatabaseID == dbtesterpb.Request_zetcd || t.req.DatabaseID == dbtesterpb.Request_cetcd { + dpath := fs.databaseLog + "-" + t.req.DatabaseID.String() srcDatabaseLogPath2 := dpath dstDatabaseLogPath2 := filepath.Base(dpath) - if !strings.HasPrefix(filepath.Base(dpath), t.req.TestName) { - dstDatabaseLogPath2 = fmt.Sprintf("%s-%d-%s", t.req.TestName, t.req.ServerIndex+1, filepath.Base(dpath)) + if !strings.HasPrefix(filepath.Base(dpath), t.req.DatabaseTag) { + dstDatabaseLogPath2 = fmt.Sprintf("%s-%d-%s", t.req.DatabaseTag, t.req.IpIndex+1, filepath.Base(dpath)) } - dstDatabaseLogPath2 = filepath.Join(t.req.GoogleCloudStorageSubDirectory, dstDatabaseLogPath2) + dstDatabaseLogPath2 = filepath.Join(t.req.Control.GoogleCloudStorageSubDirectory, dstDatabaseLogPath2) plog.Infof("uploading proxy-database log [%q -> %q]", srcDatabaseLogPath2, dstDatabaseLogPath2) for k := 0; k < 30; k++ { - if uerr = u.UploadFile(t.req.GoogleCloudStorageBucketName, srcDatabaseLogPath2, dstDatabaseLogPath2); uerr != nil { + if uerr = u.UploadFile(t.req.Control.GoogleCloudStorageBucketName, srcDatabaseLogPath2, dstDatabaseLogPath2); uerr != nil { plog.Warningf("UploadFile error... sleep and retry... (%v)", uerr) time.Sleep(2 * time.Second) continue @@ -84,14 +84,14 @@ func uploadLog(fs *flags, t *transporterServer) error { { srcSysMetricsDataPath := fs.systemMetricsCSV dstSysMetricsDataPath := filepath.Base(fs.systemMetricsCSV) - if !strings.HasPrefix(filepath.Base(fs.systemMetricsCSV), t.req.TestName) { - dstSysMetricsDataPath = fmt.Sprintf("%s-%d-%s", t.req.TestName, t.req.ServerIndex+1, filepath.Base(fs.systemMetricsCSV)) + if !strings.HasPrefix(filepath.Base(fs.systemMetricsCSV), t.req.DatabaseTag) { + dstSysMetricsDataPath = fmt.Sprintf("%s-%d-%s", t.req.DatabaseTag, t.req.IpIndex+1, filepath.Base(fs.systemMetricsCSV)) } - dstSysMetricsDataPath = filepath.Join(t.req.GoogleCloudStorageSubDirectory, dstSysMetricsDataPath) + dstSysMetricsDataPath = filepath.Join(t.req.Control.GoogleCloudStorageSubDirectory, dstSysMetricsDataPath) plog.Infof("uploading system metrics data [%q -> %q]", srcSysMetricsDataPath, dstSysMetricsDataPath) for k := 0; k < 30; k++ { - if uerr := u.UploadFile(t.req.GoogleCloudStorageBucketName, srcSysMetricsDataPath, dstSysMetricsDataPath); uerr != nil { - plog.Warningf("u.UploadFile error... sleep and retry... (%v)", uerr) + if uerr := u.UploadFile(t.req.Control.GoogleCloudStorageBucketName, srcSysMetricsDataPath, dstSysMetricsDataPath); uerr != nil { + plog.Warningf("upload error... sleep and retry... (%v)", uerr) time.Sleep(2 * time.Second) continue } else { @@ -106,14 +106,14 @@ func uploadLog(fs *flags, t *transporterServer) error { { srcSysMetricsInterpolatedDataPath := fs.systemMetricsCSVInterpolated dstSysMetricsInterpolatedDataPath := filepath.Base(fs.systemMetricsCSVInterpolated) - if !strings.HasPrefix(filepath.Base(fs.systemMetricsCSVInterpolated), t.req.TestName) { - dstSysMetricsInterpolatedDataPath = fmt.Sprintf("%s-%d-%s", t.req.TestName, t.req.ServerIndex+1, filepath.Base(fs.systemMetricsCSVInterpolated)) + if !strings.HasPrefix(filepath.Base(fs.systemMetricsCSVInterpolated), t.req.DatabaseTag) { + dstSysMetricsInterpolatedDataPath = fmt.Sprintf("%s-%d-%s", t.req.DatabaseTag, t.req.IpIndex+1, filepath.Base(fs.systemMetricsCSVInterpolated)) } - dstSysMetricsInterpolatedDataPath = filepath.Join(t.req.GoogleCloudStorageSubDirectory, dstSysMetricsInterpolatedDataPath) + dstSysMetricsInterpolatedDataPath = filepath.Join(t.req.Control.GoogleCloudStorageSubDirectory, dstSysMetricsInterpolatedDataPath) plog.Infof("uploading system metrics interpolated data [%q -> %q]", srcSysMetricsInterpolatedDataPath, dstSysMetricsInterpolatedDataPath) for k := 0; k < 30; k++ { - if uerr := u.UploadFile(t.req.GoogleCloudStorageBucketName, srcSysMetricsInterpolatedDataPath, dstSysMetricsInterpolatedDataPath); uerr != nil { - plog.Warningf("u.UploadFile error... sleep and retry... (%v)", uerr) + if uerr := u.UploadFile(t.req.Control.GoogleCloudStorageBucketName, srcSysMetricsInterpolatedDataPath, dstSysMetricsInterpolatedDataPath); uerr != nil { + plog.Warningf("upload error... sleep and retry... (%v)", uerr) time.Sleep(2 * time.Second) continue } else { @@ -128,13 +128,13 @@ func uploadLog(fs *flags, t *transporterServer) error { { srcAgentLogPath := fs.agentLog dstAgentLogPath := filepath.Base(fs.agentLog) - if !strings.HasPrefix(filepath.Base(fs.agentLog), t.req.TestName) { - dstAgentLogPath = fmt.Sprintf("%s-%d-%s", t.req.TestName, t.req.ServerIndex+1, filepath.Base(fs.agentLog)) + if !strings.HasPrefix(filepath.Base(fs.agentLog), t.req.DatabaseTag) { + dstAgentLogPath = fmt.Sprintf("%s-%d-%s", t.req.DatabaseTag, t.req.IpIndex+1, filepath.Base(fs.agentLog)) } - dstAgentLogPath = filepath.Join(t.req.GoogleCloudStorageSubDirectory, dstAgentLogPath) + dstAgentLogPath = filepath.Join(t.req.Control.GoogleCloudStorageSubDirectory, dstAgentLogPath) plog.Infof("uploading agent logs [%q -> %q]", srcAgentLogPath, dstAgentLogPath) for k := 0; k < 30; k++ { - if uerr := u.UploadFile(t.req.GoogleCloudStorageBucketName, srcAgentLogPath, dstAgentLogPath); uerr != nil { + if uerr := u.UploadFile(t.req.Control.GoogleCloudStorageBucketName, srcAgentLogPath, dstAgentLogPath); uerr != nil { plog.Warningf("UploadFile error... sleep and retry... (%v)", uerr) time.Sleep(2 * time.Second) continue diff --git a/analyze/analyze_config.go b/analyze/analyze_config.go deleted file mode 100644 index c984518e..00000000 --- a/analyze/analyze_config.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package analyze - -import ( - "io/ioutil" - - "gopkg.in/yaml.v2" -) - -// RawData defines how to aggregate data from each machine. -type RawData struct { - Legend string `yaml:"legend"` - OutputPath string `yaml:"output_path"` - DataInterpolatedSystemMetricsPaths []string `yaml:"data_interpolated_system_metrics_paths"` - DatasizeSummary string `yaml:"data_size_summary"` - DataBenchmarkLatencyPercentile string `yaml:"data_benchmark_latency_percentile"` - DataBenchmarkLatencySummary string `yaml:"data_benchmark_latency_summary"` - DataBenchmarkThroughput string `yaml:"data_benchmark_throughput"` - DataBenchmarkLatencyByKey string `yaml:"data_benchmark_latency_by_key"` - DataBenchmarkMemoryByKey string `yaml:"data_benchmark_memory_by_key"` - ClientSystemMetricsInterpolated string `yaml:"client_system_metrics_interpolated"` - TotalRequests int `yaml:"total_requests"` -} - -// Config defines analyze configuration. -type Config struct { - Title string `yaml:"title"` - WorkDir string `yaml:"work_dir"` - AllAggregatedPath string `yaml:"all_aggregated_path"` - AllLatencyByKey string `yaml:"all_latency_by_key"` - AllMemoryByKey string `yaml:"all_memory_by_key"` - DataBenchmarkLatencyByKey string `yaml:"data_benchmark_latency_by_key"` - DataBenchmarkMemoryByKey string `yaml:"data_benchmark_memory_by_key"` - RawData []RawData `yaml:"raw_data"` - PlotList []PlotConfig `yaml:"plot_list"` - READMEConfig READMEConfig `yaml:"readme"` -} - -// readConfig reads analyze configuration. -func readConfig(fpath string) (Config, error) { - bts, err := ioutil.ReadFile(fpath) - if err != nil { - return Config{}, err - } - rs := Config{} - if err := yaml.Unmarshal(bts, &rs); err != nil { - return Config{}, err - } - return rs, nil -} diff --git a/analyze/analyze_config.yaml b/analyze/analyze_config.yaml deleted file mode 100644 index 5cb40cd5..00000000 --- a/analyze/analyze_config.yaml +++ /dev/null @@ -1,201 +0,0 @@ -title: Write 100K keys, 1000-client (etcd 100 TCP conns), 256-byte key, 1KB value -work_dir: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated.csv -all_latency_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated-data-latency-by-key-number.csv -all_memory_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated-data-memory-by-key-number.csv -total_requests: 100000 - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-1-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-2-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 3 machines of 8 vCPUs + 16 GB Memory + 150 GB SSD - - 1 machine(client) of 16 vCPUs + 30 GB Memory + 150 GB SSD - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - Java(TM) SE Runtime Environment (build 1.8.0_111-b14) - - Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) - - javac 1.8.0_111 - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/README.md - results: - - title: Write 100K keys, 1000-client (etcd v3.1 100-conn), 256-byte key, 1KB value - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/analyze/analyze_config_test.go b/analyze/analyze_config_test.go deleted file mode 100644 index 06ba8bf2..00000000 --- a/analyze/analyze_config_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2017 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package analyze - -import "testing" - -func Test_readConfig(t *testing.T) { - c, err := readConfig("analyze_config.yaml") - if err != nil { - t.Fatal(err) - } - if c.Title != `Write 100K keys, 1000-client (etcd 100 TCP conns), 256-byte key, 1KB value` { - t.Fatalf("unexpected Title %q", c.Title) - } - if c.WorkDir != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys" { - t.Fatalf("unexpected WorkDir %q", c.WorkDir) - } - if c.AllAggregatedPath != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated.csv" { - t.Fatalf("unexpected AllAggregatedPath %q", c.AllAggregatedPath) - } - if c.AllLatencyByKey != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated-data-latency-by-key-number.csv" { - t.Fatalf("unexpected AllLatencyByKey %q", c.AllLatencyByKey) - } - if c.AllMemoryByKey != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated-data-memory-by-key-number.csv" { - t.Fatalf("unexpected AllMemoryByKey %q", c.AllMemoryByKey) - } - - if c.RawData[0].Legend != "etcd v3.1 (Go 1.7.4)" { - t.Fatalf("unexpected c.RawData[0].Legend %q", c.RawData[0].Legend) - } - if makeTag(c.RawData[0].Legend) != "etcd-v3.1-go1.7.4" { - t.Fatalf("unexpected makeTag(c.RawData[0].Legend) %q", makeTag(c.RawData[0].Legend)) - } - if c.RawData[0].OutputPath != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-aggregated.csv" { - t.Fatalf("unexpected c.RawData[0].OutputPath %q", c.RawData[0].OutputPath) - } - if c.RawData[0].DataInterpolatedSystemMetricsPaths[0] != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv" { - t.Fatalf("unexpected c.RawData[0].DataInterpolatedSystemMetricsPaths[0] %q", c.RawData[0].DataInterpolatedSystemMetricsPaths[0]) - } - if c.RawData[0].DatasizeSummary != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-size-summary.csv" { - t.Fatalf("unexpected c.RawData[0].DatasizeSummary %q", c.RawData[0].DatasizeSummary) - } - if c.RawData[0].DataBenchmarkLatencyPercentile != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv" { - t.Fatalf("unexpected c.RawData[0].DataBenchmarkLatencyPercentile %q", c.RawData[0].DataBenchmarkLatencyPercentile) - } - if c.RawData[0].DataBenchmarkLatencySummary != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv" { - t.Fatalf("unexpected c.RawData[0].DataBenchmarkLatencySummary %q", c.RawData[0].DataBenchmarkLatencySummary) - } - if c.RawData[0].DataBenchmarkThroughput != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv" { - t.Fatalf("unexpected c.RawData[0].DataBenchmarkThroughput %q", c.RawData[0].DataBenchmarkThroughput) - } - if c.RawData[0].DataBenchmarkLatencyByKey != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv" { - t.Fatalf("unexpected c.RawData[0].DataBenchmarkLatencyByKey %q", c.RawData[0].DataBenchmarkLatencyByKey) - } - if c.RawData[0].DataBenchmarkMemoryByKey != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv" { - t.Fatalf("unexpected c.RawData[0].DataBenchmarkMemoryByKey %q", c.RawData[0].DataBenchmarkMemoryByKey) - } - if c.RawData[0].ClientSystemMetricsInterpolated != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv" { - t.Fatalf("unexpected c.RawData[0].ClientSystemMetricsInterpolated %q", c.RawData[0].ClientSystemMetricsInterpolated) - } - - if c.READMEConfig.OutputPath != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/README.md" { - t.Fatalf("unexpected %s", c.READMEConfig.OutputPath) - } - if c.READMEConfig.Results[0].Images[0].ImageTitle != "2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS" { - t.Fatalf("unexpected %s", c.READMEConfig.Results[0].Images[0].ImageTitle) - } - if c.READMEConfig.Results[0].Images[0].ImagePath != "https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.svg" { - t.Fatalf("unexpected %s", c.READMEConfig.Results[0].Images[0].ImagePath) - } - if c.READMEConfig.Results[0].Images[0].ImageType != "remote" { - t.Fatalf("unexpected %s", c.READMEConfig.Results[0].Images[0].ImageType) - } -} diff --git a/analyze/analyze_data_2_analyze_data.go b/analyze/analyze_data_2_analyze_data.go index fc79d068..afc9d0fe 100644 --- a/analyze/analyze_data_2_analyze_data.go +++ b/analyze/analyze_data_2_analyze_data.go @@ -36,7 +36,7 @@ type analyzeData struct { // aggregated from sysAgg and benchMetrics aggregated dataframe.Frame - csvOutputpath string + allAggregatedOutputPath string } // readSystemMetricsAll reads all system metric files diff --git a/analyze/analyze_data_4_aggregate_all.go b/analyze/analyze_data_4_aggregate_all.go index 6b4971f7..f3161f7c 100644 --- a/analyze/analyze_data_4_aggregate_all.go +++ b/analyze/analyze_data_4_aggregate_all.go @@ -23,7 +23,7 @@ import ( ) // aggregateAll aggregates all system metrics from 3+ nodes. -func (data *analyzeData) aggregateAll(memoryByKeyPath string, totalRequests int) error { +func (data *analyzeData) aggregateAll(memoryByKeyPath string, totalRequests int64) error { colSys, err := data.sysAgg.Column("UNIX-SECOND") if err != nil { return err @@ -471,5 +471,5 @@ func (data *analyzeData) aggregateAll(memoryByKeyPath string, totalRequests int) } func (data *analyzeData) save() error { - return data.aggregated.CSV(data.csvOutputpath) + return data.aggregated.CSV(data.allAggregatedOutputPath) } diff --git a/analyze/analyze_data_4_aggregate_timeseries.go b/analyze/analyze_data_4_aggregate_timeseries.go index 9d421cfc..12481d38 100644 --- a/analyze/analyze_data_4_aggregate_timeseries.go +++ b/analyze/analyze_data_4_aggregate_timeseries.go @@ -16,7 +16,7 @@ package analyze import "sort" -func processTimeSeries(tslice []keyNumAndMemory, unit int64, totalRequests int) []keyNumAndMemory { +func processTimeSeries(tslice []keyNumAndMemory, unit int64, totalRequests int64) []keyNumAndMemory { sort.Sort(keyNumAndMemorys(tslice)) cumulKeyN := int64(0) diff --git a/analyze/analyze_data_5_plot.go b/analyze/analyze_data_5_plot.go index f477e2be..e8b8134a 100644 --- a/analyze/analyze_data_5_plot.go +++ b/analyze/analyze_data_5_plot.go @@ -17,8 +17,8 @@ package analyze import ( "fmt" "image/color" - "strings" + "github.com/coreos/dbtester" "github.com/gonum/plot" "github.com/gonum/plot/plotter" "github.com/gonum/plot/plotutil" @@ -37,14 +37,6 @@ func init() { plotter.DefaultGlyphStyle.Radius = vg.Points(2.0) } -// PlotConfig defines what to plot. -type PlotConfig struct { - Column string `yaml:"column"` - XAxis string `yaml:"x_axis"` - YAxis string `yaml:"y_axis"` - OutputPathList []string `yaml:"output_path_list"` -} - type pair struct { x dataframe.Column y dataframe.Column @@ -57,7 +49,7 @@ type triplet struct { maxCol dataframe.Column } -func (all *allAggregatedData) draw(cfg PlotConfig, pairs ...pair) error { +func (all *allAggregatedData) draw(cfg dbtester.Plot, pairs ...pair) error { // frame now contains // AVG-LATENCY-MS-etcd-v3.1-go1.7.4, AVG-LATENCY-MS-zookeeper-r3.4.9-java8, AVG-LATENCY-MS-consul-v0.7.2-go1.7.4 plt, err := plot.New() @@ -80,11 +72,11 @@ func (all *allAggregatedData) draw(cfg PlotConfig, pairs ...pair) error { if err != nil { return err } - l.Color = getRGB(all.headerToLegend[p.y.Header()], i) + l.Color = getRGB(all.headerToDatabaseID[p.y.Header()], i) l.Dashes = plotutil.Dashes(i) ps = append(ps, l) - plt.Legend.Add(all.headerToLegend[p.y.Header()], l) + plt.Legend.Add(all.headerToDatabaseID[p.y.Header()], l) } plt.Add(ps...) @@ -96,7 +88,7 @@ func (all *allAggregatedData) draw(cfg PlotConfig, pairs ...pair) error { return nil } -func (all *allAggregatedData) drawXY(cfg PlotConfig, pairs ...pair) error { +func (all *allAggregatedData) drawXY(cfg dbtester.Plot, pairs ...pair) error { // frame now contains // KEYS-DB-TAG-X, AVG-LATENCY-MS-DB-TAG-Y, ... plt, err := plot.New() @@ -119,11 +111,11 @@ func (all *allAggregatedData) drawXY(cfg PlotConfig, pairs ...pair) error { if err != nil { return err } - l.Color = getRGB(all.headerToLegend[p.y.Header()], i) + l.Color = getRGB(all.headerToDatabaseID[p.y.Header()], i) l.Dashes = plotutil.Dashes(i) ps = append(ps, l) - plt.Legend.Add(all.headerToLegend[p.y.Header()], l) + plt.Legend.Add(all.headerToDatabaseID[p.y.Header()], l) } plt.Add(ps...) @@ -135,7 +127,7 @@ func (all *allAggregatedData) drawXY(cfg PlotConfig, pairs ...pair) error { return nil } -func (all *allAggregatedData) drawXYWithErrorPoints(cfg PlotConfig, triplets ...triplet) error { +func (all *allAggregatedData) drawXYWithErrorPoints(cfg dbtester.Plot, triplets ...triplet) error { // frame now contains // KEYS-DB-TAG-X, MIN-LATENCY-MS-DB-TAG-Y, AVG-LATENCY-MS-DB-TAG-Y, MAX-LATENCY-MS-DB-TAG-Y, ... plt, err := plot.New() @@ -158,10 +150,10 @@ func (all *allAggregatedData) drawXYWithErrorPoints(cfg PlotConfig, triplets ... if err != nil { return err } - l.Color = getRGBII(all.headerToLegend[triplet.avgCol.Header()], i) + l.Color = getRGBII(all.headerToDatabaseID[triplet.avgCol.Header()], i) l.Dashes = plotutil.Dashes(i) ps = append(ps, l) - plt.Legend.Add(all.headerToLegend[triplet.avgCol.Header()]+" MIN", l) + plt.Legend.Add(all.headerToDatabaseID[triplet.avgCol.Header()]+" MIN", l) } { pt, err := pointsXY(triplet.x, triplet.avgCol) @@ -172,10 +164,10 @@ func (all *allAggregatedData) drawXYWithErrorPoints(cfg PlotConfig, triplets ... if err != nil { return err } - l.Color = getRGB(all.headerToLegend[triplet.avgCol.Header()], i) + l.Color = getRGB(all.headerToDatabaseID[triplet.avgCol.Header()], i) l.Dashes = plotutil.Dashes(i) ps = append(ps, l) - plt.Legend.Add(all.headerToLegend[triplet.avgCol.Header()], l) + plt.Legend.Add(all.headerToDatabaseID[triplet.avgCol.Header()], l) } { pt, err := pointsXY(triplet.x, triplet.maxCol) @@ -186,10 +178,10 @@ func (all *allAggregatedData) drawXYWithErrorPoints(cfg PlotConfig, triplets ... if err != nil { return err } - l.Color = getRGBIII(all.headerToLegend[triplet.avgCol.Header()], i) + l.Color = getRGBIII(all.headerToDatabaseID[triplet.avgCol.Header()], i) l.Dashes = plotutil.Dashes(i) ps = append(ps, l) - plt.Legend.Add(all.headerToLegend[triplet.avgCol.Header()]+" MAX", l) + plt.Legend.Add(all.headerToDatabaseID[triplet.avgCol.Header()]+" MAX", l) } } plt.Add(ps...) @@ -253,61 +245,55 @@ func pointsXY(colX, colY dataframe.Column) (plotter.XYs, error) { return pts, nil } -func getRGB(legend string, i int) color.Color { - tag := makeTag(legend) - if strings.HasPrefix(tag, "etcd") { +func getRGB(databaseID string, i int) color.Color { + switch databaseID { + case "etcdv2": + return color.RGBA{218, 97, 229, 255} // purple + case "etcdv3": return color.RGBA{24, 90, 169, 255} // blue - } - if strings.HasPrefix(tag, "zookeeper") { + case "zookeeper": return color.RGBA{38, 169, 24, 255} // green - } - if strings.HasPrefix(tag, "consul") { + case "consul": return color.RGBA{198, 53, 53, 255} // red - } - if strings.HasPrefix(tag, "zetcd") { + case "zetcd": return color.RGBA{251, 206, 0, 255} // yellow - } - if strings.HasPrefix(tag, "cetcd") { + case "cetcd": return color.RGBA{116, 24, 169, 255} // purple } return plotutil.Color(i) } -func getRGBII(legend string, i int) color.Color { - tag := makeTag(legend) - if strings.HasPrefix(tag, "etcd") { +func getRGBII(databaseID string, i int) color.Color { + switch databaseID { + case "etcdv2": + return color.RGBA{229, 212, 231, 255} // light-purple + case "etcdv3": return color.RGBA{129, 212, 247, 255} // light-blue - } - if strings.HasPrefix(tag, "zookeeper") { + case "zookeeper": return color.RGBA{129, 247, 152, 255} // light-green - } - if strings.HasPrefix(tag, "consul") { + case "consul": return color.RGBA{247, 156, 156, 255} // light-red - } - if strings.HasPrefix(tag, "zetcd") { + case "zetcd": return color.RGBA{245, 247, 166, 255} // light-yellow - } - if strings.HasPrefix(tag, "cetcd") { + case "cetcd": return color.RGBA{247, 166, 238, 255} // light-purple } return plotutil.Color(i) } -func getRGBIII(legend string, i int) color.Color { - tag := makeTag(legend) - if strings.HasPrefix(tag, "etcd") { +func getRGBIII(databaseID string, i int) color.Color { + switch databaseID { + case "etcdv2": + return color.RGBA{165, 8, 180, 255} // deep-purple + case "etcdv3": return color.RGBA{37, 29, 191, 255} // deep-blue - } - if strings.HasPrefix(tag, "zookeeper") { + case "zookeeper": return color.RGBA{7, 64, 35, 255} // deep-green - } - if strings.HasPrefix(tag, "consul") { + case "consul": return color.RGBA{212, 8, 46, 255} // deep-red - } - if strings.HasPrefix(tag, "zetcd") { + case "zetcd": return color.RGBA{229, 255, 0, 255} // deep-yellow - } - if strings.HasPrefix(tag, "cetcd") { + case "cetcd": return color.RGBA{255, 0, 251, 255} // deep-purple } return plotutil.Color(i) diff --git a/analyze/analyze_data_6_readme.go b/analyze/analyze_data_6_readme.go deleted file mode 100644 index 0d6a5935..00000000 --- a/analyze/analyze_data_6_readme.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package analyze - -import ( - "bytes" - "fmt" - "path/filepath" -) - -// READMEConfig defines how to write README. -type READMEConfig struct { - Preface string `yaml:"preface"` - OutputPath string `yaml:"output_path"` - Results []struct { - Title string - Images []struct { - ImageTitle string `yaml:"image_title"` - ImagePath string `yaml:"image_path"` - ImageType string `yaml:"image_type"` - } `yaml:"images"` - } `yaml:"results"` -} - -func writeREADME(summary string, cfg READMEConfig) error { - buf := new(bytes.Buffer) - buf.WriteString("\n\n") - - for _, result := range cfg.Results { - buf.WriteString(fmt.Sprintf("


\n##### %s", result.Title)) - buf.WriteString("\n\n") - buf.WriteString(cfg.Preface) - buf.WriteString("\n\n```\n") - buf.WriteString(summary) - buf.WriteString("```\n\n\n") - for _, img := range result.Images { - imgPath := "" - switch img.ImageType { - case "local": - imgPath = "./" + filepath.Base(img.ImagePath) - buf.WriteString(fmt.Sprintf("![%s](%s)\n\n", img.ImageTitle, imgPath)) - case "remote": - buf.WriteString(fmt.Sprintf(`%s`, img.ImagePath, img.ImageTitle)) - buf.WriteString("\n\n") - default: - return fmt.Errorf("%s is not supported", img.ImageType) - } - } - buf.WriteString("\n\n") - } - - return toFile(buf.String(), cfg.OutputPath) -} diff --git a/analyze/analyze_data_7_finalize_everything.go b/analyze/finalize_everything.go similarity index 65% rename from analyze/analyze_data_7_finalize_everything.go rename to analyze/finalize_everything.go index a5f1f04b..9cf7811c 100644 --- a/analyze/analyze_data_7_finalize_everything.go +++ b/analyze/finalize_everything.go @@ -21,51 +21,54 @@ import ( "path/filepath" "reflect" "sort" + "strconv" "strings" - "strconv" - - "github.com/coreos/dbtester/control" + "github.com/coreos/dbtester" humanize "github.com/dustin/go-humanize" "github.com/gyuho/dataframe" "github.com/olekukonko/tablewriter" ) type allAggregatedData struct { - title string - data []*analyzeData - databaseTags []string - headerToLegend map[string]string + title string + data []*analyzeData + headerToDatabaseID map[string]string + allDatabaseIDList []string } func do(configPath string) error { - cfg, err := readConfig(configPath) + cfg, err := dbtester.ReadConfig(configPath, true) if err != nil { return err } all := &allAggregatedData{ - title: cfg.Title, - data: make([]*analyzeData, 0, len(cfg.RawData)), - headerToLegend: make(map[string]string), + title: cfg.TestTitle, + data: make([]*analyzeData, 0, len(cfg.DatabaseIDToTestData)), + headerToDatabaseID: make(map[string]string), + allDatabaseIDList: cfg.AllDatabaseIDList, } - for _, elem := range cfg.RawData { - plog.Printf("reading system metrics data for %s (%q)", makeTag(elem.Legend), elem.Legend) - ad, err := readSystemMetricsAll(elem.DataInterpolatedSystemMetricsPaths...) + for _, databaseID := range cfg.AllDatabaseIDList { + testgroup := cfg.DatabaseIDToTestGroup[databaseID] + testdata := cfg.DatabaseIDToTestData[databaseID] + + plog.Printf("reading system metrics data for %s", databaseID) + ad, err := readSystemMetricsAll(testdata.ServerSystemMetricsInterpolatedPathList...) if err != nil { return err } - ad.databaseTag = makeTag(elem.Legend) - ad.legend = elem.Legend - ad.csvOutputpath = elem.OutputPath + ad.databaseTag = testgroup.DatabaseTag + ad.legend = testgroup.DatabaseDescription + ad.allAggregatedOutputPath = testdata.AllAggregatedOutputPath if err = ad.aggSystemMetrics(); err != nil { return err } - if err = ad.importBenchMetrics(elem.DataBenchmarkThroughput); err != nil { + if err = ad.importBenchMetrics(testdata.ClientLatencyThroughputTimeseriesPath); err != nil { return err } - if err = ad.aggregateAll(elem.DataBenchmarkMemoryByKey, elem.TotalRequests); err != nil { + if err = ad.aggregateAll(testdata.ServerMemoryByKeyNumberPath, testgroup.RequestNumber); err != nil { return err } if err = ad.save(); err != nil { @@ -73,9 +76,8 @@ func do(configPath string) error { } all.data = append(all.data, ad) - all.databaseTags = append(all.databaseTags, makeTag(elem.Legend)) for _, hd := range ad.aggregated.Headers() { - all.headerToLegend[makeHeader(hd, makeTag(elem.Legend))] = elem.Legend + all.headerToDatabaseID[makeHeader(hd, testgroup.DatabaseTag)] = databaseID } } @@ -90,19 +92,20 @@ func do(configPath string) error { for _, ad := range all.data { // per database for _, col := range ad.aggregated.Columns() { - legend := all.headerToLegend[col.Header()] - row00Header = append(row00Header, makeTag(legend)) + databaseID := all.headerToDatabaseID[col.Header()] + row00Header = append(row00Header, cfg.DatabaseIDToTestGroup[databaseID].DatabaseTag) break } } - row01ReadsCompletedDeltaSum := []string{"READS-COMPLETED-DELTA-SUM"} - row02SectorsReadDeltaSum := []string{"SECTORS-READS-DELTA-SUM"} - row03WritesCompletedDeltaSum := []string{"WRITES-COMPLETED-DELTA-SUM"} - row04SectorsWrittenDeltaSum := []string{"SECTORS-WRITTEN-DELTA-SUM"} - row06ReceiveBytesSum := []string{"NETWORK-RECEIVE-DATA-SUM"} - row07TransmitBytesSum := []string{"NETWORK-TRANSMIT-DATA-SUM"} - row08MaxCPUUsage := []string{"MAX-CPU-USAGE"} - row09MaxMemoryUsage := []string{"MAX-MEMORY-USAGE"} + + row19ServerReceiveBytesSum := []string{"SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM"} + row20ServerTransmitBytesSum := []string{"SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM"} + row23ServerMaxCPUUsage := []string{"SERVER-MAX-CPU-USAGE"} + row24ServerMaxMemoryUsage := []string{"SERVER-MAX-MEMORY-USAGE"} + row28ReadsCompletedDeltaSum := []string{"SERVER-AVG-READS-COMPLETED-DELTA-SUM"} + row29SectorsReadDeltaSum := []string{"SERVER-AVG-SECTORS-READS-DELTA-SUM"} + row30WritesCompletedDeltaSum := []string{"SERVER-AVG-WRITES-COMPLETED-DELTA-SUM"} + row31SectorsWrittenDeltaSum := []string{"SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM"} // iterate each database's all data for _, ad := range all.data { @@ -120,6 +123,26 @@ func do(configPath string) error { for _, col := range ad.aggregated.Columns() { hdr := col.Header() switch { + case strings.HasPrefix(hdr, "RECEIVE-BYTES-NUM-DELTA-"): + cnt := col.Count() + for j := 0; j < cnt; j++ { + vv, err := col.Value(j) + if err != nil { + return err + } + fv, _ := vv.Float64() + receiveBytesNumDeltaSum += fv + } + case strings.HasPrefix(hdr, "TRANSMIT-BYTES-NUM-DELTA-"): + cnt := col.Count() + for j := 0; j < cnt; j++ { + vv, err := col.Value(j) + if err != nil { + return err + } + fv, _ := vv.Float64() + transmitBytesNumDeltaSum += fv + } case strings.HasPrefix(hdr, "READS-COMPLETED-DELTA-"): cnt := col.Count() for j := 0; j < cnt; j++ { @@ -160,26 +183,6 @@ func do(configPath string) error { fv, _ := vv.Float64() sectorsWrittenDeltaSum += fv } - case strings.HasPrefix(hdr, "RECEIVE-BYTES-NUM-DELTA-"): - cnt := col.Count() - for j := 0; j < cnt; j++ { - vv, err := col.Value(j) - if err != nil { - return err - } - fv, _ := vv.Float64() - receiveBytesNumDeltaSum += fv - } - case strings.HasPrefix(hdr, "TRANSMIT-BYTES-NUM-DELTA-"): - cnt := col.Count() - for j := 0; j < cnt; j++ { - vv, err := col.Value(j) - if err != nil { - return err - } - fv, _ := vv.Float64() - transmitBytesNumDeltaSum += fv - } case strings.HasPrefix(hdr, "AVG-CPU-"): cnt := col.Count() for j := 0; j < cnt; j++ { @@ -203,51 +206,57 @@ func do(configPath string) error { } } - row01ReadsCompletedDeltaSum = append(row01ReadsCompletedDeltaSum, humanize.Comma(int64(readsCompletedDeltaSum))) - row02SectorsReadDeltaSum = append(row02SectorsReadDeltaSum, humanize.Comma(int64(sectorsReadDeltaSum))) - row03WritesCompletedDeltaSum = append(row03WritesCompletedDeltaSum, humanize.Comma(int64(writesCompletedDeltaSum))) - row04SectorsWrittenDeltaSum = append(row04SectorsWrittenDeltaSum, humanize.Comma(int64(sectorsWrittenDeltaSum))) - row06ReceiveBytesSum = append(row06ReceiveBytesSum, humanize.Bytes(uint64(receiveBytesNumDeltaSum))) - row07TransmitBytesSum = append(row07TransmitBytesSum, humanize.Bytes(uint64(transmitBytesNumDeltaSum))) - row08MaxCPUUsage = append(row08MaxCPUUsage, fmt.Sprintf("%.2f %%", maxAvgCPU)) + row19ServerReceiveBytesSum = append(row19ServerReceiveBytesSum, humanize.Bytes(uint64(receiveBytesNumDeltaSum))) + row20ServerTransmitBytesSum = append(row20ServerTransmitBytesSum, humanize.Bytes(uint64(transmitBytesNumDeltaSum))) + row23ServerMaxCPUUsage = append(row23ServerMaxCPUUsage, fmt.Sprintf("%.2f %%", maxAvgCPU)) + row28ReadsCompletedDeltaSum = append(row28ReadsCompletedDeltaSum, humanize.Comma(int64(readsCompletedDeltaSum))) + row29SectorsReadDeltaSum = append(row29SectorsReadDeltaSum, humanize.Comma(int64(sectorsReadDeltaSum))) + row30WritesCompletedDeltaSum = append(row30WritesCompletedDeltaSum, humanize.Comma(int64(writesCompletedDeltaSum))) + row31SectorsWrittenDeltaSum = append(row31SectorsWrittenDeltaSum, humanize.Comma(int64(sectorsWrittenDeltaSum))) // TODO: handle overflowed memory value? sort.Float64s(maxAvgVMRSSMBs) mv := maxAvgVMRSSMBs[len(maxAvgVMRSSMBs)-1] mb := uint64(mv * 1000000) - row09MaxMemoryUsage = append(row09MaxMemoryUsage, humanize.Bytes(mb)) + row24ServerMaxMemoryUsage = append(row24ServerMaxMemoryUsage, humanize.Bytes(mb)) } - row05AverageDatasize := []string{"AVG-DATA-SIZE-ON-DISK"} // TOTAL-DATA-SIZE - row10TotalSeconds := []string{"TOTAL-SECONDS"} // TOTAL-SECONDS - row11MaxThroughput := []string{"MAX-THROUGHPUT"} // MAX AVG-THROUGHPUT - row12AverageThroughput := []string{"AVG-THROUGHPUT"} // REQUESTS-PER-SECOND - row13MinThroughput := []string{"MIN-THROUGHPUT"} // MIN AVG-THROUGHPUT - row14FastestLatency := []string{"FASTEST-LATENCY"} // FASTEST-LATENCY-MS - row15AverageLatency := []string{"AVG-LATENCY"} // AVERAGE-LATENCY-MS - row16SlowestLatency := []string{"SLOWEST-LATENCY"} // SLOWEST-LATENCY-MS - row17p10 := []string{"Latency p10"} // p10 - row18p25 := []string{"Latency p25"} // p25 - row19p50 := []string{"Latency p50"} // p50 - row20p75 := []string{"Latency p75"} // p75 - row21p90 := []string{"Latency p90"} // p90 - row22p95 := []string{"Latency p95"} // p95 - row23p99 := []string{"Latency p99"} // p99 - row24p999 := []string{"Latency p99.9"} // p99.9 - row25ClientReceiveBytesSum := []string{"CLIENT-NETWORK-RECEIVE-SUM"} // RECEIVE-BYTES-NUM-DELTA - row26ClientTransmitBytesSum := []string{"CLIENT-NETWORK-TRANSMIT-SUM"} // TRANSMIT-BYTES-DELTA - row27ClientMaxCPU := []string{"CLIENT-MAX-CPU-USAGE"} // CPU-NUM - row28ClientMaxMemory := []string{"CLIENT-MAX-MEMORY-USAGE"} // VMRSS-NUM - row29ErrorCount := []string{"CLIENT-ERROR-COUNT"} // ERROR: + row01TotalSeconds := []string{"TOTAL-SECONDS"} // TOTAL-SECONDS + row02TotalRequestNumber := []string{"TOTAL-REQUEST-NUMBER"} + row05MaxThroughput := []string{"MAX-THROUGHPUT"} // MAX AVG-THROUGHPUT + row06AverageThroughput := []string{"AVG-THROUGHPUT"} // REQUESTS-PER-SECOND + row07MinThroughput := []string{"MIN-THROUGHPUT"} // MIN AVG-THROUGHPUT + row08FastestLatency := []string{"FASTEST-LATENCY"} // FASTEST-LATENCY-MS + row09AverageLatency := []string{"AVG-LATENCY"} // AVERAGE-LATENCY-MS + row10SlowestLatency := []string{"SLOWEST-LATENCY"} // SLOWEST-LATENCY-MS + row11p10 := []string{"Latency p10"} // p10 + row12p25 := []string{"Latency p25"} // p25 + row13p50 := []string{"Latency p50"} // p50 + row14p75 := []string{"Latency p75"} // p75 + row15p90 := []string{"Latency p90"} // p90 + row16p95 := []string{"Latency p95"} // p95 + row17p99 := []string{"Latency p99"} // p99 + row18p999 := []string{"Latency p99.9"} // p99.9 + row21ClientReceiveBytesSum := []string{"CLIENT-TOTAL-NETWORK-RECEIVE-SUM"} // RECEIVE-BYTES-NUM-DELTA + row22lientTransmitBytesSum := []string{"CLIENT-TOTAL-NETWORK-TRANSMIT-SUM"} // TRANSMIT-BYTES-DELTA + row25ClientMaxCPU := []string{"CLIENT-MAX-CPU-USAGE"} // CPU-NUM + row26ClientMaxMemory := []string{"CLIENT-MAX-MEMORY-USAGE"} // VMRSS-NUM + row27ClientErrorCount := []string{"CLIENT-ERROR-COUNT"} // ERROR: + row32AverageDatasize := []string{"SERVER-AVG-DATA-SIZE-ON-DISK"} // TOTAL-DATA-SIZE - for i, rcfg := range cfg.RawData { - tag := makeTag(rcfg.Legend) + databaseIDToErrs := make(map[string][]string) + for i, databaseID := range cfg.AllDatabaseIDList { + testgroup := cfg.DatabaseIDToTestGroup[databaseID] + testdata := cfg.DatabaseIDToTestData[databaseID] + + tag := testdata.DatabaseTag if tag != row00Header[i+1] { return fmt.Errorf("analyze config has different order; expected %q, got %q", row00Header[i+1], tag) } + row02TotalRequestNumber = append(row02TotalRequestNumber, humanize.Comma(testgroup.RequestNumber)) { - fr, err := dataframe.NewFromCSV(nil, rcfg.ClientSystemMetricsInterpolated) + fr, err := dataframe.NewFromCSV(nil, testdata.ClientSystemMetricsInterpolatedPath) if err != nil { return err } @@ -312,14 +321,13 @@ func do(configPath string) error { } } - row25ClientReceiveBytesSum = append(row25ClientReceiveBytesSum, humanize.Bytes(receiveBytesNumDeltaSum)) - row26ClientTransmitBytesSum = append(row26ClientTransmitBytesSum, humanize.Bytes(transmitBytesNumDeltaSum)) - row27ClientMaxCPU = append(row27ClientMaxCPU, fmt.Sprintf("%.2f %%", maxAvgCPU)) - row28ClientMaxMemory = append(row28ClientMaxMemory, humanize.Bytes(maxVMRSSNum)) + row21ClientReceiveBytesSum = append(row21ClientReceiveBytesSum, humanize.Bytes(receiveBytesNumDeltaSum)) + row22lientTransmitBytesSum = append(row22lientTransmitBytesSum, humanize.Bytes(transmitBytesNumDeltaSum)) + row25ClientMaxCPU = append(row25ClientMaxCPU, fmt.Sprintf("%.2f %%", maxAvgCPU)) + row26ClientMaxMemory = append(row26ClientMaxMemory, humanize.Bytes(maxVMRSSNum)) } - { - f, err := openToRead(rcfg.DataBenchmarkLatencySummary) + f, err := openToRead(testdata.ClientLatencyDistributionSummaryPath) if err != nil { return err } @@ -344,20 +352,20 @@ func do(configPath string) error { for _, row := range rows { switch row[0] { case "TOTAL-SECONDS": - row10TotalSeconds = append(row10TotalSeconds, fmt.Sprintf("%s sec", row[1])) + row01TotalSeconds = append(row01TotalSeconds, fmt.Sprintf("%s sec", row[1])) case "REQUESTS-PER-SECOND": fv, err := strconv.ParseFloat(row[1], 64) if err != nil { return err } avg := int64(fv) - row12AverageThroughput = append(row12AverageThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(avg))) + row06AverageThroughput = append(row06AverageThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(avg))) case "SLOWEST-LATENCY-MS": - row16SlowestLatency = append(row16SlowestLatency, fmt.Sprintf("%s ms", row[1])) + row10SlowestLatency = append(row10SlowestLatency, fmt.Sprintf("%s ms", row[1])) case "FASTEST-LATENCY-MS": - row14FastestLatency = append(row14FastestLatency, fmt.Sprintf("%s ms", row[1])) + row08FastestLatency = append(row08FastestLatency, fmt.Sprintf("%s ms", row[1])) case "AVERAGE-LATENCY-MS": - row15AverageLatency = append(row15AverageLatency, fmt.Sprintf("%s ms", row[1])) + row09AverageLatency = append(row09AverageLatency, fmt.Sprintf("%s ms", row[1])) } if strings.HasPrefix(row[0], "ERROR:") { @@ -366,13 +374,21 @@ func do(configPath string) error { return err } totalErrCnt += iv + + c1 := strings.TrimSpace(strings.Replace(row[0], "ERROR:", "", -1)) + c2 := humanize.Comma(iv) + es := fmt.Sprintf("%s (count %s)", c1, c2) + if _, ok := databaseIDToErrs[databaseID]; !ok { + databaseIDToErrs[databaseID] = []string{es} + } else { + databaseIDToErrs[databaseID] = append(databaseIDToErrs[databaseID], es) + } } } - row29ErrorCount = append(row29ErrorCount, humanize.Comma(totalErrCnt)) + row27ClientErrorCount = append(row27ClientErrorCount, humanize.Comma(totalErrCnt)) } - { - fr, err := dataframe.NewFromCSV(nil, rcfg.DataBenchmarkThroughput) + fr, err := dataframe.NewFromCSV(nil, testdata.ClientLatencyThroughputTimeseriesPath) if err != nil { return err } @@ -399,16 +415,15 @@ func do(configPath string) error { min = int64(fv) } } - row11MaxThroughput = append(row11MaxThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(max))) - row13MinThroughput = append(row13MinThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(min))) + row05MaxThroughput = append(row05MaxThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(max))) + row07MinThroughput = append(row07MinThroughput, fmt.Sprintf("%s req/sec", humanize.Comma(min))) } - { - fr, err := dataframe.NewFromCSV(nil, rcfg.DatasizeSummary) + fr, err := dataframe.NewFromCSV(nil, testdata.ServerDatasizeOnDiskSummaryPath) if err != nil { return err } - col, err := fr.Column(control.DataSummaryColumns[3]) // datasize in bytes + col, err := fr.Column(dbtester.DatasizeOnDiskSummaryColumns[3]) // datasize in bytes if err != nil { return err } @@ -422,11 +437,10 @@ func do(configPath string) error { sum += fv } avg := uint64(sum / float64(col.Count())) - row05AverageDatasize = append(row05AverageDatasize, humanize.Bytes(avg)) + row32AverageDatasize = append(row32AverageDatasize, humanize.Bytes(avg)) } - { - f, err := openToRead(rcfg.DataBenchmarkLatencyPercentile) + f, err := openToRead(testdata.ClientLatencyDistributionPercentilePath) if err != nil { return err } @@ -453,21 +467,21 @@ func do(configPath string) error { } switch row[0] { case "p10": - row17p10 = append(row17p10, fmt.Sprintf("%s ms", row[1])) + row11p10 = append(row11p10, fmt.Sprintf("%s ms", row[1])) case "p25": - row18p25 = append(row18p25, fmt.Sprintf("%s ms", row[1])) + row12p25 = append(row12p25, fmt.Sprintf("%s ms", row[1])) case "p50": - row19p50 = append(row19p50, fmt.Sprintf("%s ms", row[1])) + row13p50 = append(row13p50, fmt.Sprintf("%s ms", row[1])) case "p75": - row20p75 = append(row20p75, fmt.Sprintf("%s ms", row[1])) + row14p75 = append(row14p75, fmt.Sprintf("%s ms", row[1])) case "p90": - row21p90 = append(row21p90, fmt.Sprintf("%s ms", row[1])) + row15p90 = append(row15p90, fmt.Sprintf("%s ms", row[1])) case "p95": - row22p95 = append(row22p95, fmt.Sprintf("%s ms", row[1])) + row16p95 = append(row16p95, fmt.Sprintf("%s ms", row[1])) case "p99": - row23p99 = append(row23p99, fmt.Sprintf("%s ms", row[1])) + row17p99 = append(row17p99, fmt.Sprintf("%s ms", row[1])) case "p99.9": - row24p999 = append(row24p999, fmt.Sprintf("%s ms", row[1])) + row18p999 = append(row18p999, fmt.Sprintf("%s ms", row[1])) } } } @@ -475,38 +489,44 @@ func do(configPath string) error { aggRows := [][]string{ row00Header, - row01ReadsCompletedDeltaSum, - row02SectorsReadDeltaSum, - row03WritesCompletedDeltaSum, - row04SectorsWrittenDeltaSum, - row05AverageDatasize, - row06ReceiveBytesSum, - row07TransmitBytesSum, - row08MaxCPUUsage, - row09MaxMemoryUsage, - row10TotalSeconds, - row11MaxThroughput, - row12AverageThroughput, - row13MinThroughput, - row14FastestLatency, - row15AverageLatency, - row16SlowestLatency, - row17p10, - row18p25, - row19p50, - row20p75, - row21p90, - row22p95, - row23p99, - row24p999, - row25ClientReceiveBytesSum, - row26ClientTransmitBytesSum, - row27ClientMaxCPU, - row28ClientMaxMemory, - row29ErrorCount, + row01TotalSeconds, + row02TotalRequestNumber, + row05MaxThroughput, + row06AverageThroughput, + row07MinThroughput, + row08FastestLatency, + row09AverageLatency, + row10SlowestLatency, + row11p10, + row12p25, + row13p50, + row14p75, + row15p90, + row16p95, + row17p99, + row18p999, + + row19ServerReceiveBytesSum, + row20ServerTransmitBytesSum, + row21ClientReceiveBytesSum, + row22lientTransmitBytesSum, + + row23ServerMaxCPUUsage, + row24ServerMaxMemoryUsage, + row25ClientMaxCPU, + row26ClientMaxMemory, + + row27ClientErrorCount, + + row28ReadsCompletedDeltaSum, + row29SectorsReadDeltaSum, + row30WritesCompletedDeltaSum, + row31SectorsWrittenDeltaSum, + row32AverageDatasize, } - plog.Printf("saving data to %q", cfg.AllAggregatedPath) - file, err := openToOverwrite(cfg.AllAggregatedPath) + + plog.Printf("saving summary data to %q", cfg.Analyze.AllAggregatedOutputPathCSV) + file, err := openToOverwrite(cfg.Analyze.AllAggregatedOutputPathCSV) if err != nil { return err } @@ -519,12 +539,40 @@ func do(configPath string) error { if err := wr.Error(); err != nil { return err } + buf := new(bytes.Buffer) + tw := tablewriter.NewWriter(buf) + tw.SetHeader(aggRows[0]) + for _, row := range aggRows[1:] { + tw.Append(row) + } + tw.SetAutoFormatHeaders(false) + tw.SetAlignment(tablewriter.ALIGN_RIGHT) + tw.Render() + + errs := "" + for _, databaseID := range cfg.AllDatabaseIDList { + es, ok := databaseIDToErrs[databaseID] + if !ok { + continue + } + errs = databaseID + " " + "errors:\n" + strings.Join(es, "\n") + "\n" + } + plog.Printf("saving summary data to %q", cfg.Analyze.AllAggregatedOutputPathTXT) + stxt := buf.String() + if errs != "" { + stxt += "\n" + "\n" + errs + } + if err := toFile(stxt, changeExtToTxt(cfg.Analyze.AllAggregatedOutputPathTXT)); err != nil { + return err + } // KEYS, MIN-LATENCY-MS, AVG-LATENCY-MS, MAX-LATENCY-MS - plog.Printf("combining data to %q", cfg.AllLatencyByKey) + plog.Info("combining all latency data by keys") allLatencyFrame := dataframe.New() - for _, elem := range cfg.RawData { - fr, err := dataframe.NewFromCSV(nil, elem.DataBenchmarkLatencyByKey) + for _, databaseID := range cfg.AllDatabaseIDList { + testdata := cfg.DatabaseIDToTestData[databaseID] + + fr, err := dataframe.NewFromCSV(nil, testdata.ClientLatencyByKeyNumberPath) if err != nil { return err } @@ -532,7 +580,7 @@ func do(configPath string) error { if err != nil { return err } - colKeys.UpdateHeader(makeHeader("KEYS", makeTag(elem.Legend))) + colKeys.UpdateHeader(makeHeader("KEYS", testdata.DatabaseTag)) if err = allLatencyFrame.AddColumn(colKeys); err != nil { return err } @@ -541,7 +589,7 @@ func do(configPath string) error { if err != nil { return err } - colMinLatency.UpdateHeader(makeHeader("MIN-LATENCY-MS", makeTag(elem.Legend))) + colMinLatency.UpdateHeader(makeHeader("MIN-LATENCY-MS", testdata.DatabaseTag)) if err = allLatencyFrame.AddColumn(colMinLatency); err != nil { return err } @@ -550,7 +598,7 @@ func do(configPath string) error { if err != nil { return err } - colAvgLatency.UpdateHeader(makeHeader("AVG-LATENCY-MS", makeTag(elem.Legend))) + colAvgLatency.UpdateHeader(makeHeader("AVG-LATENCY-MS", testdata.DatabaseTag)) if err = allLatencyFrame.AddColumn(colAvgLatency); err != nil { return err } @@ -559,16 +607,60 @@ func do(configPath string) error { if err != nil { return err } - colMaxLatency.UpdateHeader(makeHeader("MAX-LATENCY-MS", makeTag(elem.Legend))) + colMaxLatency.UpdateHeader(makeHeader("MAX-LATENCY-MS", testdata.DatabaseTag)) if err = allLatencyFrame.AddColumn(colMaxLatency); err != nil { return err } } - if err := allLatencyFrame.CSV(cfg.AllLatencyByKey); err != nil { - return err + // KEYS, MIN-VMRSS-MB, AVG-VMRSS-MB, MAX-VMRSS-MB + plog.Info("combining all server memory usage by keys") + allMemoryFrame := dataframe.New() + for _, databaseID := range cfg.AllDatabaseIDList { + testdata := cfg.DatabaseIDToTestData[databaseID] + + fr, err := dataframe.NewFromCSV(nil, testdata.ServerMemoryByKeyNumberPath) + if err != nil { + return err + } + colKeys, err := fr.Column("KEYS") + if err != nil { + return err + } + colKeys.UpdateHeader(makeHeader("KEYS", testdata.DatabaseTag)) + if err = allMemoryFrame.AddColumn(colKeys); err != nil { + return err + } + + colMemMin, err := fr.Column("MIN-VMRSS-MB") + if err != nil { + return err + } + colMemMin.UpdateHeader(makeHeader("MIN-VMRSS-MB", testdata.DatabaseTag)) + if err = allMemoryFrame.AddColumn(colMemMin); err != nil { + return err + } + + colMem, err := fr.Column("AVG-VMRSS-MB") + if err != nil { + return err + } + colMem.UpdateHeader(makeHeader("AVG-VMRSS-MB", testdata.DatabaseTag)) + if err = allMemoryFrame.AddColumn(colMem); err != nil { + return err + } + + colMemMax, err := fr.Column("MAX-VMRSS-MB") + if err != nil { + return err + } + colMemMax.UpdateHeader(makeHeader("MAX-VMRSS-MB", testdata.DatabaseTag)) + if err = allMemoryFrame.AddColumn(colMemMax); err != nil { + return err + } } + { - allLatencyFrameCfg := PlotConfig{ + allLatencyFrameCfg := dbtester.Plot{ Column: "AVG-LATENCY-MS", XAxis: "Cumulative Number of Keys", YAxis: "Latency(millisecond) by Keys", @@ -604,7 +696,7 @@ func do(configPath string) error { } { // with error points - allLatencyFrameCfg := PlotConfig{ + allLatencyFrameCfg := dbtester.Plot{ Column: "AVG-LATENCY-MS", XAxis: "Cumulative Number of Keys", YAxis: "Latency(millisecond) by Keys", @@ -646,56 +738,8 @@ func do(configPath string) error { return err } } - - // KEYS, MIN-VMRSS-MB, AVG-VMRSS-MB, MAX-VMRSS-MB - plog.Printf("combining data to %q", cfg.AllMemoryByKey) - allMemoryFrame := dataframe.New() - for _, elem := range cfg.RawData { - fr, err := dataframe.NewFromCSV(nil, elem.DataBenchmarkMemoryByKey) - if err != nil { - return err - } - colKeys, err := fr.Column("KEYS") - if err != nil { - return err - } - colKeys.UpdateHeader(makeHeader("KEYS", makeTag(elem.Legend))) - if err = allMemoryFrame.AddColumn(colKeys); err != nil { - return err - } - - colMemMin, err := fr.Column("MIN-VMRSS-MB") - if err != nil { - return err - } - colMemMin.UpdateHeader(makeHeader("MIN-VMRSS-MB", makeTag(elem.Legend))) - if err = allMemoryFrame.AddColumn(colMemMin); err != nil { - return err - } - - colMem, err := fr.Column("AVG-VMRSS-MB") - if err != nil { - return err - } - colMem.UpdateHeader(makeHeader("AVG-VMRSS-MB", makeTag(elem.Legend))) - if err = allMemoryFrame.AddColumn(colMem); err != nil { - return err - } - - colMemMax, err := fr.Column("MAX-VMRSS-MB") - if err != nil { - return err - } - colMemMax.UpdateHeader(makeHeader("MAX-VMRSS-MB", makeTag(elem.Legend))) - if err = allMemoryFrame.AddColumn(colMemMax); err != nil { - return err - } - } - if err := allMemoryFrame.CSV(cfg.AllMemoryByKey); err != nil { - return err - } { - allMemoryFrameCfg := PlotConfig{ + allMemoryFrameCfg := dbtester.Plot{ Column: "AVG-VMRSS-MB", XAxis: "Cumulative Number of Keys", YAxis: "Memory(MB) by Keys", @@ -731,7 +775,7 @@ func do(configPath string) error { } { // with error points - allMemoryFrameCfg := PlotConfig{ + allMemoryFrameCfg := dbtester.Plot{ Column: "AVG-VMRSS-MB", XAxis: "Cumulative Number of Keys", YAxis: "Memory(MB) by Keys", @@ -781,7 +825,8 @@ func do(configPath string) error { var pairs []pair var dataColumns []dataframe.Column for i, ad := range all.data { - tag := all.databaseTags[i] + databaseID := all.allDatabaseIDList[i] + tag := cfg.DatabaseIDToTestGroup[databaseID].DatabaseTag avgCol, err := ad.aggregated.Column("CONTROL-CLIENT-NUM") if err != nil { @@ -807,7 +852,7 @@ func do(configPath string) error { if err != nil { return err } - if err = nf1.CSV(filepath.Join(cfg.WorkDir, plotConfig.Column+".csv")); err != nil { + if err = nf1.CSV(plotConfig.OutputPathCSV); err != nil { return err } @@ -829,7 +874,7 @@ func do(configPath string) error { return err } } - if err = nf2.CSV(filepath.Join(cfg.WorkDir, plotConfig.Column+"-BY-CLIENT-NUM"+".csv")); err != nil { + if err = nf2.CSV(filepath.Join(filepath.Dir(plotConfig.OutputPathCSV), plotConfig.Column+"-BY-CLIENT-NUM"+".csv")); err != nil { return err } @@ -888,25 +933,12 @@ func do(configPath string) error { return err } } - if err = nf3.CSV(filepath.Join(cfg.WorkDir, plotConfig.Column+"-BY-CLIENT-NUM-aggregated"+".csv")); err != nil { + if err = nf3.CSV(filepath.Join(filepath.Dir(plotConfig.OutputPathCSV), plotConfig.Column+"-BY-CLIENT-NUM-aggregated"+".csv")); err != nil { return err } } - buf := new(bytes.Buffer) - tw := tablewriter.NewWriter(buf) - tw.SetHeader(aggRows[0]) - for _, row := range aggRows[1:] { - tw.Append(row) - } - tw.SetAutoFormatHeaders(false) - tw.SetAlignment(tablewriter.ALIGN_RIGHT) - tw.Render() - if err := toFile(buf.String(), changeExtToTxt(cfg.AllAggregatedPath)); err != nil { - return err - } - plog.Printf("writing README at %q", cfg.READMEConfig.OutputPath) - return writeREADME(buf.String(), cfg.READMEConfig) + return cfg.WriteREADME(stxt) } func changeExtToTxt(fpath string) string { diff --git a/analyze/util.go b/analyze/util.go index 67177740..675eb8af 100644 --- a/analyze/util.go +++ b/analyze/util.go @@ -35,6 +35,10 @@ func maxFloat64(a, b float64) float64 { return b } +func makeHeader(column string, tag string) string { + return fmt.Sprintf("%s-%s", column, tag) +} + // converts unix nanoseconds to unix second. func convertUnixNano(ts int64) int64 { return int64(ts / 1e9) diff --git a/bench-configuration/01-write-1M-keys-client-variable/01-etcd-v3.1.yaml b/bench-configuration/01-write-1M-keys-client-variable/01-etcd-v3.1.yaml deleted file mode 100644 index 4b604c8b..00000000 --- a/bench-configuration/01-write-1M-keys-client-variable/01-etcd-v3.1.yaml +++ /dev/null @@ -1,58 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 10, 50, 100, 300, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable diff --git a/bench-configuration/01-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml b/bench-configuration/01-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index f4372bfc..00000000 --- a/bench-configuration/01-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,58 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 10, 50, 100, 300, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable diff --git a/bench-configuration/01-write-1M-keys-client-variable/03-consul-v0.7.3.yaml b/bench-configuration/01-write-1M-keys-client-variable/03-consul-v0.7.3.yaml deleted file mode 100644 index 3d1dff35..00000000 --- a/bench-configuration/01-write-1M-keys-client-variable/03-consul-v0.7.3.yaml +++ /dev/null @@ -1,58 +0,0 @@ -database: consul -test_name: consul-v0.7.3-go1.7.4 - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 10, 50, 100, 300, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable diff --git a/bench-configuration/01-write-1M-keys-client-variable/analyze.yaml b/bench-configuration/01-write-1M-keys-client-variable/analyze.yaml deleted file mode 100644 index bec08afe..00000000 --- a/bench-configuration/01-write-1M-keys-client-variable/analyze.yaml +++ /dev/null @@ -1,216 +0,0 @@ -title: Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 -work_dir: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable -all_aggregated_path: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/aggregated.csv -all_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/aggregated-data-latency-by-key-number.csv -all_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/aggregated-data-memory-by-key-number.csv -total_requests: 1000000 - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv - -- legend: Consul v0.7.3 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.3 (Go 1.7.4) - - output_path: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/README.md - results: - - title: Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 - images: - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-configuration/02-write-1M-keys-best-throughput/01-etcd-v3.1.yaml b/bench-configuration/02-write-1M-keys-best-throughput/01-etcd-v3.1.yaml deleted file mode 100644 index 9380b7b3..00000000 --- a/bench-configuration/02-write-1M-keys-best-throughput/01-etcd-v3.1.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 700 # for best throughput - clients: 700 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput diff --git a/bench-configuration/02-write-1M-keys-best-throughput/02-zookeeper-r3.4.9.yaml b/bench-configuration/02-write-1M-keys-best-throughput/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 1d1dd4fa..00000000 --- a/bench-configuration/02-write-1M-keys-best-throughput/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 300 # for best throughput - clients: 300 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput diff --git a/bench-configuration/02-write-1M-keys-best-throughput/03-consul-v0.7.3.yaml b/bench-configuration/02-write-1M-keys-best-throughput/03-consul-v0.7.3.yaml deleted file mode 100644 index 9b403c8d..00000000 --- a/bench-configuration/02-write-1M-keys-best-throughput/03-consul-v0.7.3.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: consul -test_name: consul-v0.7.3-go1.7.4 - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 500 # for best throughput - clients: 500 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput diff --git a/bench-configuration/02-write-1M-keys-best-throughput/analyze.yaml b/bench-configuration/02-write-1M-keys-best-throughput/analyze.yaml deleted file mode 100644 index 32c8cb3e..00000000 --- a/bench-configuration/02-write-1M-keys-best-throughput/analyze.yaml +++ /dev/null @@ -1,216 +0,0 @@ -title: Write 1M keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) -work_dir: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput -all_aggregated_path: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/aggregated.csv -all_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/aggregated-data-latency-by-key-number.csv -all_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/aggregated-data-memory-by-key-number.csv -total_requests: 1000000 - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv - -- legend: Consul v0.7.3 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.3 (Go 1.7.4) - - output_path: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/README.md - results: - - title: Write 1M keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) - images: - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-configuration/03-write-1M-keys-1000-client/01-etcd-v3.1.yaml b/bench-configuration/03-write-1M-keys-1000-client/01-etcd-v3.1.yaml deleted file mode 100644 index a825828e..00000000 --- a/bench-configuration/03-write-1M-keys-1000-client/01-etcd-v3.1.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client diff --git a/bench-configuration/03-write-1M-keys-1000-client/02-zookeeper-r3.4.9.yaml b/bench-configuration/03-write-1M-keys-1000-client/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 9f53f903..00000000 --- a/bench-configuration/03-write-1M-keys-1000-client/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client diff --git a/bench-configuration/03-write-1M-keys-1000-client/03-consul-v0.7.3.yaml b/bench-configuration/03-write-1M-keys-1000-client/03-consul-v0.7.3.yaml deleted file mode 100644 index d42303e2..00000000 --- a/bench-configuration/03-write-1M-keys-1000-client/03-consul-v0.7.3.yaml +++ /dev/null @@ -1,57 +0,0 @@ -database: consul -test_name: consul-v0.7.3-go1.7.4 - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - etcd_quota_size_bytes: 8000000000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client diff --git a/bench-configuration/03-write-1M-keys-1000-client/analyze.yaml b/bench-configuration/03-write-1M-keys-1000-client/analyze.yaml deleted file mode 100644 index eaa2b553..00000000 --- a/bench-configuration/03-write-1M-keys-1000-client/analyze.yaml +++ /dev/null @@ -1,216 +0,0 @@ -title: Write 1M keys, 256-byte key, 1KB value, 1,000 client -work_dir: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client -all_aggregated_path: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/aggregated.csv -all_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/aggregated-data-latency-by-key-number.csv -all_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/aggregated-data-memory-by-key-number.csv -total_requests: 1000000 - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv - -- legend: Consul v0.7.3 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.3 (Go 1.7.4) - - output_path: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/README.md - results: - - title: Write 1M keys, 256-byte key, 1KB value, 1,000 client - images: - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-configuration/04-write-too-many-keys/01-etcd-v3.1.yaml b/bench-configuration/04-write-too-many-keys/01-etcd-v3.1.yaml deleted file mode 100644 index e24fd484..00000000 --- a/bench-configuration/04-write-too-many-keys/01-etcd-v3.1.yaml +++ /dev/null @@ -1,56 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 700 # for best throughput - clients: 700 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys diff --git a/bench-configuration/04-write-too-many-keys/02-zookeeper-r3.4.9.yaml b/bench-configuration/04-write-too-many-keys/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index effb4cf4..00000000 --- a/bench-configuration/04-write-too-many-keys/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,56 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 300 # for best throughput - clients: 300 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys diff --git a/bench-configuration/04-write-too-many-keys/03-consul-v0.7.3.yaml b/bench-configuration/04-write-too-many-keys/03-consul-v0.7.3.yaml deleted file mode 100644 index 57695eec..00000000 --- a/bench-configuration/04-write-too-many-keys/03-consul-v0.7.3.yaml +++ /dev/null @@ -1,56 +0,0 @@ -database: consul -test_name: consul-v0.7.3-go1.7.4 - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_size_summary: data-size-summary.csv -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv -data_latency_by_key_number: data-latency-by-key-number.csv - -# client machine's system metrics -client_system_metrics: client-system-metrics.csv -client_system_metrics_interpolated: client-system-metrics-interpolated.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 500 # for best throughput - clients: 500 # for best throughput - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side - google_cloud_storage_bucket_name: dbtester-results - google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys diff --git a/bench-configuration/04-write-too-many-keys/analyze.yaml b/bench-configuration/04-write-too-many-keys/analyze.yaml deleted file mode 100644 index a04c20ca..00000000 --- a/bench-configuration/04-write-too-many-keys/analyze.yaml +++ /dev/null @@ -1,215 +0,0 @@ -title: Write X keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) -work_dir: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys -all_aggregated_path: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/aggregated.csv -all_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/aggregated-data-latency-by-key-number.csv -all_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/aggregated-data-memory-by-key-number.csv -total_requests: ???? - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keysetcd-v3.1-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv - -- legend: Consul v0.7.3 (Go 1.7.4) - output_path: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-aggregated.csv - data_interpolated_system_metrics_paths: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-1-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-2-system-metrics-interpolated.csv - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-3-system-metrics-interpolated.csv - data_size_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-data-size-summary.csv - data_benchmark_latency_percentile: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_latency_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-data-latency-by-key-number.csv - data_benchmark_memory_by_key: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-data-memory-by-key-number.csv - client_system_metrics_interpolated: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) (Delta per Second) - output_path_list: - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.3 (Go 1.7.4) - - output_path: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/README.md - results: - - title: Write X keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) - images: - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-02-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/01-etcd-v3.1.yaml deleted file mode 100644 index b1fdc0f8..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/01-etcd-v3.1.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 100 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 060bb217..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/03-consul-v0.7.2.yaml deleted file mode 100644 index e05cb567..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/analyze.yaml deleted file mode 100644 index ebee14c3..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/01-write-1M-keys/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 1000-client, 256-byte key, 1KB value -work_dir: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/README.md - results: - - title: Write 1M keys, 1000-client, 256-byte key, 1KB value - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/01-etcd-v3.1.yaml deleted file mode 100644 index 9b08dfc1..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/01-etcd-v3.1.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 100 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 788ccd28..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml deleted file mode 100644 index 2383da5d..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/analyze.yaml deleted file mode 100644 index 1efd0f46..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/02-write-1M-keys-rate-limited/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value -work_dir: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/README.md - results: - - title: Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/01-etcd-v3.1.yaml deleted file mode 100644 index f67e6882..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/01-etcd-v3.1.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 4d0e2b99..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/03-consul-v0.7.2.yaml deleted file mode 100644 index 6beb3783..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/analyze.yaml deleted file mode 100644 index b18c72f5..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/03-write-1M-keys-client-variable/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) -work_dir: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Google Cloud Compute Engine - - 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) - - Ubuntu 16.10 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/README.md - results: - - title: Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/01-etcd-v3.1.yaml deleted file mode 100644 index c4af99e9..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/01-etcd-v3.1.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys - -peer_ips: - - 10.99.157.131 - - 10.99.157.133 - - 10.99.157.137 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 44496b6b..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys - -peer_ips: - - 10.99.157.153 - - 10.99.157.135 - - 10.99.157.143 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/03-consul-v0.7.2.yaml deleted file mode 100644 index 40e9a983..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys - -peer_ips: - - 10.99.157.149 - - 10.99.157.141 - - 10.99.157.145 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/analyze.yaml deleted file mode 100644 index b5b5519e..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/04-write-1M-keys/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 1000-client, 256-byte key, 1KB value -work_dir: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Packet Bare Metal - - 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) - - Ubuntu 16.04 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/README.md - results: - - title: Write 1M keys, 1000-client, 256-byte key, 1KB value - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/01-etcd-v3.1.yaml deleted file mode 100644 index 971291cc..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/01-etcd-v3.1.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited - -peer_ips: - - 10.99.157.131 - - 10.99.157.133 - - 10.99.157.137 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index fb83d12f..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited - -peer_ips: - - 10.99.157.153 - - 10.99.157.135 - - 10.99.157.143 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml deleted file mode 100644 index 544a4464..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited - -peer_ips: - - 10.99.157.149 - - 10.99.157.141 - - 10.99.157.145 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 1000 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/analyze.yaml deleted file mode 100644 index af263eac..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/05-write-1M-keys-rate-limited/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value -work_dir: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Packet Bare Metal - - 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) - - Ubuntu 16.04 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/README.md - results: - - title: Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/01-etcd-v3.1.yaml deleted file mode 100644 index 162217db..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/01-etcd-v3.1.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable - -peer_ips: - - 10.99.157.131 - - 10.99.157.133 - - 10.99.157.137 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index f0e1940d..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable - -peer_ips: - - 10.99.157.153 - - 10.99.157.135 - - 10.99.157.143 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/03-consul-v0.7.2.yaml deleted file mode 100644 index b2286e1b..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,48 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /root/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable - -peer_ips: - - 10.99.157.149 - - 10.99.157.141 - - 10.99.157.145 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: write - stale_read: true - connections: 1 - clients: 1 - # if specified, connections, clients are overwritten - connections_clients: [1, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/analyze.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/analyze.yaml deleted file mode 100644 index 7964153f..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/06-write-1M-keys-client-variable/analyze.yaml +++ /dev/null @@ -1,185 +0,0 @@ -title: Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) -work_dir: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable -all_aggregated_path: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/aggregated.csv - -raw_data: -- legend: etcd v3.1 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-data-latency-throughput-timeseries.csv - -- legend: Zookeeper r3.4.9 (Java 8) - output_path: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-data-latency-throughput-timeseries.csv - -- legend: Consul v0.7.2 (Go 1.7.4) - output_path: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-aggregated.csv - data_system_metrics_paths: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-1-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-2-system-metrics.csv - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-3-system-metrics.csv - data_benchmark_latency_percentile: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-distribution-percentile.csv - data_benchmark_latency_summary: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-distribution-summary.csv - data_benchmark_throughput: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/consul-v0.7.2-go1.7.4-data-latency-throughput-timeseries.csv - -plot_list: -- column: AVG-LATENCY-MS - x_axis: Second - y_axis: Latency(millisecond) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-LATENCY-MS.png - -- column: AVG-THROUGHPUT - x_axis: Second - y_axis: Throughput(Requests/Second) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-THROUGHPUT.png - -- column: AVG-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES - x_axis: Second - y_axis: Non-voluntary Context Switches - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png - -- column: AVG-CPU - x_axis: Second - y_axis: CPU(%) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-CPU.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-CPU.png - -- column: AVG-VMRSS-MB - x_axis: Second - y_axis: Memory(MB) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VMRSS-MB.png - -- column: AVG-READS-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Reads - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.png - -- column: AVG-SECTORS-READ-DELTA - x_axis: Second - y_axis: Sectors Read - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.png - -- column: AVG-WRITES-COMPLETED-DELTA - x_axis: Second - y_axis: Disk Writes - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.png - -- column: AVG-SECTORS-WRITTEN-DELTA - x_axis: Second - y_axis: Sectors Written - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.png - -- column: AVG-RECEIVE-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Receive(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.png - -- column: AVG-TRANSMIT-BYTES-NUM-DELTA - x_axis: Second - y_axis: Network Transmit(bytes) - output_path_list: - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - - 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.png - -readme: - preface: | - - Packet Bare Metal - - 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) - - Ubuntu 16.04 - - etcd v3.1 (Go 1.7.4) - - Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) - - Consul v0.7.2 (Go 1.7.4) - - output_path: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/README.md - results: - - title: Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) - images: - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-LATENCY-MS - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-LATENCY-MS.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-THROUGHPUT - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-THROUGHPUT.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-CPU - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-CPU.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VMRSS-MB - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VMRSS-MB.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg - image_type: remote - - - image_title: 2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA - image_path: https://storage.googleapis.com/dbtester-results/2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg - image_type: remote diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/01-etcd-v3.1.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/01-etcd-v3.1.yaml deleted file mode 100644 index 0bbffef2..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/01-etcd-v3.1.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: etcdv3 -test_name: etcd-v3.1-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/read-1M-keys-linearizable - -peer_ips: - - 10.240.0.20 - - 10.240.0.21 - - 10.240.0.22 - -agent_port: 3500 -database_port: 2379 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: read - stale_read: false - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/02-zookeeper-r3.4.9.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/02-zookeeper-r3.4.9.yaml deleted file mode 100644 index 29160f9c..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/02-zookeeper-r3.4.9.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: zookeeper -test_name: zookeeper-r3.4.9-java8 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/read-1M-keys-linearizable - -peer_ips: - - 10.240.0.25 - - 10.240.0.27 - - 10.240.0.28 - -agent_port: 3500 -database_port: 2181 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: read - stale_read: false - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/03-consul-v0.7.2.yaml b/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/03-consul-v0.7.2.yaml deleted file mode 100644 index 08bcd239..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul-configurations/read-1M-keys-linearizable/03-consul-v0.7.2.yaml +++ /dev/null @@ -1,47 +0,0 @@ -database: consul -test_name: consul-v0.7.2-go1.7.4 - -google_cloud_project_name: etcd-development -google_cloud_storage_key_path: /home/gyuho/gcloud-key.json # need this only in 'control' side -google_cloud_storage_bucket_name: dbtester-results -google_cloud_storage_sub_directory: 2017Q1-02-etcd-zookeeper-consul/read-1M-keys-linearizable - -peer_ips: - - 10.240.0.30 - - 10.240.0.31 - - 10.240.0.33 - -agent_port: 3500 -database_port: 8500 - -# these will saved where 'dbtester control' command runs -log: control.log -data_latency_distribution_summary: data-latency-distribution-summary.csv -data_latency_distribution_percentile: data-latency-distribution-percentile.csv -data_latency_distribution_all: data-latency-distribution-all.csv -data_latency_throughput_timeseries: data-latency-throughput-timeseries.csv - -# start database by sending RPC calls to agents -step1: - skip_start_database: false - etcd_snap_count: 100000 - zookeeper_snap_count: 100000 - zookeeper_max_client_connections: 5000 - -# start benchmark -step2: - skip_stress_database: false - bench_type: read - stale_read: false - connections: 1000 - clients: 1000 - connections_clients: [] - key_size: 256 - value_size: 1024 - total_requests: 1000000 - requests_per_second: 0 - etcdv3_compaction_cycle: 0 - -# after benchmark -step3: - action: stop diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/README.md b/bench-results/2017Q1-01-etcd-zookeeper-consul/README.md deleted file mode 100644 index 574fdd49..00000000 --- a/bench-results/2017Q1-01-etcd-zookeeper-consul/README.md +++ /dev/null @@ -1,425 +0,0 @@ - -


-##### Write 1M keys, 1000-client, 256-byte key, 1KB value - -- Google Cloud Compute Engine -- 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) -- Ubuntu 16.10 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+--------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+--------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 6 | 311 | 15 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 98301 | 86583 | 941248 | -| SECTORS-WRITTEN-DELTA-SUM | 565344 | 9223784 | 41419484 | -| RECEIVE-BYTES-SUM | 5.0 GB | 5.4 GB | 7.8 GB | -| TRANSMIT-BYTES-SUM | 3.8 GB | 4.3 GB | 6.5 GB | -| MAX-CPU-USAGE | 291.56 % | 363.65 % | 226.18 % | -| MAX-MEMORY-USAGE | 1204.28 MB | 4689.33 MB | 4329.98 MB | -| TOTAL-SECONDS | 36.2024 sec | 61.0944 sec | 467.9311 sec | -| AVG-THROUGHPUT | 27622.4453 req/sec | 16298.0557 req/sec | 2137.0667 req/sec | -| SLOWEST-LATENCY | 246.4560 ms | 5570.6375 ms | 30388.9318 ms | -| FASTEST-LATENCY | 5.3413 ms | 2.4757 ms | 21.5605 ms | -| AVG-LATENCY | 36.1057 ms | 50.4279 ms | 467.4253 ms | -| Latency p10 | 13.712090 ms | 14.861507 ms | 65.910086 ms | -| Latency p25 | 16.625779 ms | 18.884719 ms | 77.221971 ms | -| Latency p50 | 22.306160 ms | 22.291879 ms | 120.663354 ms | -| Latency p75 | 40.376905 ms | 25.751846 ms | 716.373543 ms | -| Latency p90 | 65.849751 ms | 30.030446 ms | 1068.038406 ms | -| Latency p95 | 137.545464 ms | 81.141780 ms | 1080.751412 ms | -| Latency p99 | 177.127309 ms | 965.771377 ms | 2686.919571 ms | -| Latency p99.9 | 198.540415 ms | 2911.408642 ms | 19041.188919 ms | -+----------------------------+--------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/01-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - - - -


-##### Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value - -- Google Cloud Compute Engine -- 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) -- Ubuntu 16.10 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 0 | 211 | 141 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 4431218 | 4670825 | 7233188 | -| SECTORS-WRITTEN-DELTA-SUM | 2263660 | 14832440 | 81719964 | -| RECEIVE-BYTES-SUM | 5.8 GB | 5.8 GB | 6.0 GB | -| TRANSMIT-BYTES-SUM | 4.6 GB | 4.7 GB | 4.7 GB | -| MAX-CPU-USAGE | 52.02 % | 46.67 % | 84.40 % | -| MAX-MEMORY-USAGE | 1626.60 MB | 3568.67 MB | 3950.50 MB | -| TOTAL-SECONDS | 999.0083 sec | 1000.5091 sec | 1195.0587 sec | -| AVG-THROUGHPUT | 1000.9927 req/sec | 998.8554 req/sec | 836.7790 req/sec | -| SLOWEST-LATENCY | 198.1010 ms | 2392.6933 ms | 23594.1354 ms | -| FASTEST-LATENCY | 1.2003 ms | 0.9210 ms | 3.6024 ms | -| AVG-LATENCY | 4.5224 ms | 8.1224 ms | 363.4513 ms | -| Latency p10 | 2.710760 ms | 1.593791 ms | 8.339832 ms | -| Latency p25 | 3.382362 ms | 1.815819 ms | 36.060302 ms | -| Latency p50 | 4.375098 ms | 2.109050 ms | 134.805513 ms | -| Latency p75 | 5.431229 ms | 2.403126 ms | 205.643246 ms | -| Latency p90 | 6.422301 ms | 2.662319 ms | 227.073525 ms | -| Latency p95 | 7.127944 ms | 3.112525 ms | 250.450359 ms | -| Latency p99 | 8.805373 ms | 236.442165 ms | 10010.579309 ms | -| Latency p99.9 | 17.743337 ms | 1006.184186 ms | 22707.315056 ms | -+----------------------------+-------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/02-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA - - - - - -


-##### Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) - -- Google Cloud Compute Engine -- 4 machines of 16 vCPUs + 30 GB Memory + 150 GB SSD (1 for client) -- Ubuntu 16.10 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 185 | 293 | 383 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 2090388 | 1667449 | 3966668 | -| SECTORS-WRITTEN-DELTA-SUM | 1173224 | 14349236 | 30568376 | -| RECEIVE-BYTES-SUM | 5.2 GB | 5.4 GB | 8.9 GB | -| TRANSMIT-BYTES-SUM | 4.0 GB | 4.3 GB | 7.7 GB | -| MAX-CPU-USAGE | 56.46 % | 56.26 % | 56.29 % | -| MAX-MEMORY-USAGE | 1466.26 MB | 3563.36 MB | 4545.72 MB | -| TOTAL-SECONDS | 570.7510 sec | 477.1301 sec | 1056.0748 sec | -| AVG-THROUGHPUT | 1752.0775 req/sec | 2090.3063 req/sec | 946.9027 req/sec | -| SLOWEST-LATENCY | 556.0183 ms | 3654.9846 ms | 17465.0180 ms | -| FASTEST-LATENCY | 1.1633 ms | 0.9644 ms | 3.2258 ms | -| AVG-LATENCY | 12.1934 ms | 30.7887 ms | 96.5730 ms | -| Latency p10 | 2.312432 ms | 2.226581 ms | 4.048553 ms | -| Latency p25 | 4.204692 ms | 2.847540 ms | 5.682306 ms | -| Latency p50 | 7.689732 ms | 4.229944 ms | 10.091410 ms | -| Latency p75 | 14.481892 ms | 10.914450 ms | 44.163918 ms | -| Latency p90 | 24.692357 ms | 17.725627 ms | 94.140188 ms | -| Latency p95 | 40.230709 ms | 24.428028 ms | 208.474321 ms | -| Latency p99 | 60.787420 ms | 1188.220202 ms | 895.758025 ms | -| Latency p99.9 | 527.752867 ms | 2326.553678 ms | 13622.807237 ms | -+----------------------------+-------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/03-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA - - - - - -


-##### Write 1M keys, 1000-client, 256-byte key, 1KB value - -- Packet Bare Metal -- 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) -- Ubuntu 16.04 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+--------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+--------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 6 | 4 | 14 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 339249 | 663603 | 1124580 | -| SECTORS-WRITTEN-DELTA-SUM | 0 | 0 | 0 | -| RECEIVE-BYTES-SUM | 5.2 GB | 5.4 GB | 5.7 GB | -| TRANSMIT-BYTES-SUM | 4.0 GB | 4.4 GB | 4.4 GB | -| MAX-CPU-USAGE | 363.53 % | 388.31 % | 282.29 % | -| MAX-MEMORY-USAGE | 1219.19 MB | 9291.80 MB | 4659.98 MB | -| TOTAL-SECONDS | 40.8774 sec | 30.3340 sec | 164.0401 sec | -| AVG-THROUGHPUT | 24463.3803 req/sec | 32964.2605 req/sec | 6096.0706 req/sec | -| SLOWEST-LATENCY | 150.4056 ms | 1565.8847 ms | 7306.8885 ms | -| FASTEST-LATENCY | 0.8704 ms | 0.3387 ms | 8.9377 ms | -| AVG-LATENCY | 40.7504 ms | 29.4415 ms | 163.8167 ms | -| Latency p10 | 19.337223 ms | 18.111482 ms | 58.038157 ms | -| Latency p25 | 24.134461 ms | 20.482972 ms | 72.112776 ms | -| Latency p50 | 33.954506 ms | 23.463435 ms | 106.720600 ms | -| Latency p75 | 54.301812 ms | 27.142309 ms | 213.816984 ms | -| Latency p90 | 72.115813 ms | 31.443281 ms | 333.154609 ms | -| Latency p95 | 81.127899 ms | 35.534083 ms | 373.636304 ms | -| Latency p99 | 98.866146 ms | 147.958507 ms | 461.374153 ms | -| Latency p99.9 | 132.016073 ms | 1378.812699 ms | 5311.162416 ms | -+----------------------------+--------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/04-write-1M-keys/AVG-TRANSMIT-BYTES-NUM-DELTA - - - - -


-##### Write 1M keys, 1000-client, 1000QPS, 256-byte key, 1KB value - -- Packet Bare Metal -- 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) -- Ubuntu 16.04 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 473 | 712 | 571 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 8263385 | 9922581 | 13261792 | -| SECTORS-WRITTEN-DELTA-SUM | 0 | 0 | 0 | -| RECEIVE-BYTES-SUM | 6.5 GB | 5.9 GB | 6.4 GB | -| TRANSMIT-BYTES-SUM | 5.2 GB | 4.7 GB | 5.1 GB | -| MAX-CPU-USAGE | 91.10 % | 64.88 % | 147.91 % | -| MAX-MEMORY-USAGE | 1696.60 MB | 2842.88 MB | 4231.98 MB | -| TOTAL-SECONDS | 999.0582 sec | 999.8117 sec | 1040.1450 sec | -| AVG-THROUGHPUT | 1000.9427 req/sec | 999.5752 req/sec | 961.4044 req/sec | -| SLOWEST-LATENCY | 56.0360 ms | 2635.4569 ms | 8546.8756 ms | -| FASTEST-LATENCY | 0.7225 ms | 0.3447 ms | 1.3011 ms | -| AVG-LATENCY | 1.3866 ms | 6.9357 ms | 93.2921 ms | -| Latency p10 | 1.019233 ms | 0.667793 ms | 2.297153 ms | -| Latency p25 | 1.140797 ms | 0.757403 ms | 2.458065 ms | -| Latency p50 | 1.303873 ms | 0.876627 ms | 2.654298 ms | -| Latency p75 | 1.429593 ms | 0.982231 ms | 3.600769 ms | -| Latency p90 | 1.584000 ms | 1.121141 ms | 10.765193 ms | -| Latency p95 | 1.733878 ms | 1.236501 ms | 65.069180 ms | -| Latency p99 | 3.298035 ms | 28.890276 ms | 4628.091116 ms | -| Latency p99.9 | 17.796168 ms | 1369.914634 ms | 7243.951610 ms | -+----------------------------+-------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/05-write-1M-keys-rate-limited/AVG-TRANSMIT-BYTES-NUM-DELTA - - - - - -


-##### Write 1M keys, 256-byte key, 1KB value value (clients 1 to 1000) - -- Packet Bare Metal -- 4 machines of 16 Physical Cores @ 2.6 GHz + 128 GB DDR4 RAM + 120 GB SSD + 20Gbps Bonded Network (1 for client) -- Ubuntu 16.04 -- etcd v3.1 (Go 1.7.4) -- Zookeeper r3.4.9 - - Java 8 - - javac 1.8.0_121 - - Java(TM) SE Runtime Environment (build 1.8.0_121-b13) - - Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) -- Consul v0.7.2 (Go 1.7.4) - - -``` -+----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.2-go1.7.4 | -+----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA | 308 | 216 | 532 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 3480145 | 3471343 | 6597902 | -| SECTORS-WRITTEN-DELTA-SUM | 0 | 0 | 0 | -| RECEIVE-BYTES-SUM | 5.4 GB | 5.3 GB | 5.8 GB | -| TRANSMIT-BYTES-SUM | 4.2 GB | 4.3 GB | 4.5 GB | -| MAX-CPU-USAGE | 135.68 % | 116.33 % | 124.26 % | -| MAX-MEMORY-USAGE | 1328.39 MB | 6276.01 MB | 4790.06 MB | -| TOTAL-SECONDS | 276.4103 sec | 185.1561 sec | 582.4233 sec | -| AVG-THROUGHPUT | 3617.8096 req/sec | 5400.8493 req/sec | 1716.9642 req/sec | -| SLOWEST-LATENCY | 155.0781 ms | 2140.8240 ms | 5637.2541 ms | -| FASTEST-LATENCY | 0.6443 ms | 0.2915 ms | 1.3058 ms | -| AVG-LATENCY | 12.7328 ms | 9.5968 ms | 47.3448 ms | -| Latency p10 | 1.115963 ms | 0.706270 ms | 2.296140 ms | -| Latency p25 | 1.484697 ms | 0.890714 ms | 3.300920 ms | -| Latency p50 | 2.696072 ms | 1.594529 ms | 6.696194 ms | -| Latency p75 | 14.830030 ms | 10.053333 ms | 42.282100 ms | -| Latency p90 | 36.917286 ms | 18.814867 ms | 93.939972 ms | -| Latency p95 | 67.270709 ms | 24.070593 ms | 131.658011 ms | -| Latency p99 | 92.520682 ms | 38.044010 ms | 473.239177 ms | -| Latency p99.9 | 122.274461 ms | 1725.413184 ms | 4949.483214 ms | -+----------------------------+-------------------+------------------------+-----------------------+ -``` - - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-LATENCY-MS - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-THROUGHPUT - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-CPU - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-VMRSS-MB - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-01-etcd-zookeeper-consul/06-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_CPU_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_CPU_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index 6c4934df02f11ce5265cd365e586dadb6b26cd9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40188 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 diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_RECEIVE_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_RECEIVE_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index db366cec96203ab41ce9157d4a37d3b8dc8f77b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46672 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 diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_TRANSMIT_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_TRANSMIT_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index 8a5f143eeea5b385f32d0bd642241b727c08f38e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48383 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 diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DISK_WRITES_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DISK_WRITES_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index 5b995cd03df6ed73651ed0332b2cf48bccea657b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38819 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 I(eK;;7xhZ^@&Et; diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_1000QPS_LINE_CHARTS_LOGARITHMIC.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_1000QPS_LINE_CHARTS_LOGARITHMIC.png deleted file mode 100644 index d57cd346e52295d706e2eb3e8eb26d202e2263e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99844 zcmeGEXFOcr*9MFq5d=X*q6SF>(TPr!B%-$+BwF+`YV;nx&J00B@7)l+ z3`Q@b%roEb?|0w-_y0G~i|0OXd}cn|IcN4-d#|;wbzS?brn&+d2|Wn_0Axyva#{dD zU1(ckPI;@v|Gw_a89#)te~!w7ds>diPycg~vHZ_}=2_$g|97ZRnZU%-5~!N0-LV<69eP(X4gA4d-=}@KFR#7zjm9CTu$VU1<$)t@cmFT1Cly7kt*�+l0ltKLjr0%PQBQ4;7g?44fhegm`ufDaFS|) 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