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/README.md b/README.md index 6ba1f450..15041fee 100644 --- a/README.md +++ b/README.md @@ -32,73 +32,481 @@ All logs and results can be found at https://console.cloud.google.com/storage/br ``` -+-----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | -+-----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA-SUM | 2 | 218 | 126 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 1,217,752 | 955,419 | 2,183,202 | -| SECTORS-WRITTEN-DELTA-SUM | 702,780 | 11,846,404 | 3,991,232 | -| AVG-DATA-SIZE-ON-DISK | 2.5 GB | 7.4 GB | 3.1 GB | -| NETWORK-RECEIVE-DATA-SUM | 5.1 GB | 5.0 GB | 5.5 GB | -| NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.0 GB | 4.2 GB | -| MAX-CPU-USAGE | 451.00 % | 800.00 % | 409.33 % | -| MAX-MEMORY-USAGE | 1.3 GB | 3.7 GB | 4.7 GB | -| TOTAL-SECONDS | 324.5626 sec | 335.0999 sec | 667.9389 sec | -| MAX-THROUGHPUT | 36,479 req/sec | 41,799 req/sec | 15,969 req/sec | -| AVG-THROUGHPUT | 3,081 req/sec | 2,961 req/sec | 1,497 req/sec | -| MIN-THROUGHPUT | 79 req/sec | 0 req/sec | 49 req/sec | -| FASTEST-LATENCY | 1.0313 ms | 1.1256 ms | 2.9151 ms | -| AVG-LATENCY | 13.4807 ms | 25.5780 ms | 47.0926 ms | -| SLOWEST-LATENCY | 261.8235 ms | 4260.5699 ms | 22260.1112 ms | -| Latency p10 | 2.201212 ms | 2.528874 ms | 3.926152 ms | -| Latency p25 | 5.636563 ms | 3.821957 ms | 7.640734 ms | -| Latency p50 | 9.696159 ms | 6.656013 ms | 19.126381 ms | -| Latency p75 | 16.202583 ms | 11.576279 ms | 54.750630 ms | -| Latency p90 | 28.434395 ms | 14.472618 ms | 77.993718 ms | -| Latency p95 | 44.336815 ms | 16.786180 ms | 91.026490 ms | -| Latency p99 | 60.008762 ms | 479.797108 ms | 201.844359 ms | -| Latency p99.9 | 84.831886 ms | 2725.947720 ms | 1502.535463 ms | -| CLIENT-NETWORK-RECEIVE-SUM | 270 MB | 353 MB | 200 MB | -| CLIENT-NETWORK-TRANSMIT-SUM | 1.5 GB | 1.4 GB | 1.5 GB | -| CLIENT-MAX-CPU-USAGE | 577.00 % | 496.00 % | 210.00 % | -| CLIENT-MAX-MEMORY-USAGE | 355 MB | 3.3 GB | 227 MB | -| CLIENT-ERROR-COUNT | 0 | 7,495 | 0 | -+-----------------------------+-------------------+------------------------+-----------------------+ ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 345.7743 sec | 320.9959 sec | 676.6576 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 35,245 req/sec | 37,580 req/sec | 15,488 req/sec | +| AVG-THROUGHPUT | 2,892 req/sec | 3,108 req/sec | 1,477 req/sec | +| MIN-THROUGHPUT | 23 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 1.0942 ms | 0.9952 ms | 3.0193 ms | +| AVG-LATENCY | 14.0207 ms | 34.9720 ms | 44.3717 ms | +| SLOWEST-LATENCY | 101.5395 ms | 2334.6007 ms | 3475.2713 ms | +| Latency p10 | 2.308513 ms | 2.378813 ms | 3.971904 ms | +| Latency p25 | 5.879109 ms | 3.595997 ms | 7.811056 ms | +| Latency p50 | 10.100823 ms | 6.320842 ms | 20.224796 ms | +| Latency p75 | 17.160120 ms | 12.677824 ms | 56.790033 ms | +| Latency p90 | 28.890553 ms | 21.506040 ms | 89.507900 ms | +| Latency p95 | 44.861387 ms | 30.713207 ms | 106.807611 ms | +| Latency p99 | 62.570152 ms | 1186.951737 ms | 301.241777 ms | +| Latency p99.9 | 87.467729 ms | 2241.127019 ms | 2634.872172 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 5.1 GB | 5.4 GB | 5.5 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.4 GB | 4.3 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 271 MB | 356 MB | 202 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.5 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 449.90 % | 558.97 % | 421.60 % | +| SERVER-MAX-MEMORY-USAGE | 1.4 GB | 3.9 GB | 4.8 GB | +| CLIENT-MAX-CPU-USAGE | 552.00 % | 617.80 % | 224.00 % | +| CLIENT-MAX-MEMORY-USAGE | 361 MB | 4.4 GB | 225 MB | +| CLIENT-ERROR-COUNT | 0 | 2,093 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 3 | 221 | 11 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 1,222,851 | 960,275 | 2,333,199 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 739,936 | 12,769,072 | 4,013,148 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.4 GB | 8.8 GB | 3.0 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: connection closed" (count 1,747) +"zk: could not connect to a server" (count 346) ``` -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 1M keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 37.4731 sec | 63.8379 sec | 309.0797 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 32,555 req/sec | 38,537 req/sec | 16,919 req/sec | +| AVG-THROUGHPUT | 26,685 req/sec | 15,656 req/sec | 3,235 req/sec | +| MIN-THROUGHPUT | 15,350 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 4.5030 ms | 2.3895 ms | 14.5025 ms | +| AVG-LATENCY | 26.1688 ms | 17.9204 ms | 154.4720 ms | +| SLOWEST-LATENCY | 205.8298 ms | 3471.7581 ms | 21463.6662 ms | +| Latency p10 | 10.580892 ms | 5.948893 ms | 29.430795 ms | +| Latency p25 | 12.626734 ms | 6.817741 ms | 34.096243 ms | +| Latency p50 | 18.452075 ms | 7.718642 ms | 42.522161 ms | +| Latency p75 | 26.930691 ms | 8.659562 ms | 63.027422 ms | +| Latency p90 | 49.843748 ms | 9.750484 ms | 263.017095 ms | +| Latency p95 | 67.991988 ms | 10.757740 ms | 601.571541 ms | +| Latency p99 | 135.153213 ms | 114.903303 ms | 1237.545701 ms | +| Latency p99.9 | 160.393852 ms | 2248.915050 ms | 11496.380241 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 4.9 GB | 5.4 GB | 14 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.8 GB | 4.3 GB | 12 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 274 MB | 351 MB | 211 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.4 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 416.67 % | 710.17 % | 410.67 % | +| SERVER-MAX-MEMORY-USAGE | 1.2 GB | 4.6 GB | 5.9 GB | +| CLIENT-MAX-CPU-USAGE | 448.00 % | 365.00 % | 223.00 % | +| CLIENT-MAX-MEMORY-USAGE | 219 MB | 1.9 GB | 90 MB | +| CLIENT-ERROR-COUNT | 0 | 509 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 3 | 253 | 162 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 110,436 | 101,558 | 665,193 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 371,988 | 9,306,936 | 37,002,460 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.8 GB | 7.1 GB | 2.9 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: could not connect to a server" (count 208) +"zk: connection closed" (count 301) +``` + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 1M keys, 256-byte key, 1KB value, 1,000 client + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 36.5547 sec | 59.5935 sec | 244.8620 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 35,025 req/sec | 47,693 req/sec | 15,146 req/sec | +| AVG-THROUGHPUT | 27,356 req/sec | 16,697 req/sec | 4,083 req/sec | +| MIN-THROUGHPUT | 228 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 4.1857 ms | 1.4036 ms | 27.1684 ms | +| AVG-LATENCY | 36.4506 ms | 46.1962 ms | 244.4663 ms | +| SLOWEST-LATENCY | 233.1590 ms | 6787.1829 ms | 30479.0204 ms | +| Latency p10 | 14.321495 ms | 12.447591 ms | 66.233418 ms | +| Latency p25 | 17.784730 ms | 16.822188 ms | 74.271576 ms | +| Latency p50 | 23.783217 ms | 20.026128 ms | 92.736772 ms | +| Latency p75 | 44.930445 ms | 23.615952 ms | 151.332505 ms | +| Latency p90 | 67.957086 ms | 31.726640 ms | 338.858136 ms | +| Latency p95 | 121.316986 ms | 78.842487 ms | 696.780894 ms | +| Latency p99 | 163.614045 ms | 821.197693 ms | 1887.708027 ms | +| Latency p99.9 | 187.122508 ms | 2709.006521 ms | 20942.858889 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 5.0 GB | 5.3 GB | 6.6 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.2 GB | 5.4 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 282 MB | 357 MB | 243 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.4 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 451.00 % | 723.67 % | 436.67 % | +| SERVER-MAX-MEMORY-USAGE | 1.2 GB | 4.7 GB | 4.9 GB | +| CLIENT-MAX-CPU-USAGE | 554.00 % | 1227.00 % | 218.00 % | +| CLIENT-MAX-MEMORY-USAGE | 264 MB | 5.5 GB | 114 MB | +| CLIENT-ERROR-COUNT | 0 | 4,962 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 74 | 315 | 102 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 100,644 | 82,186 | 481,109 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 442,860 | 8,179,180 | 20,434,060 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.7 GB | 7.3 GB | 3.0 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: could not connect to a server" (count 3,301) +"zk: connection closed" (count 1,661) +``` + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 3-million keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 141.1728 sec | 4134.1565 sec | 2979.6229 sec | +| TOTAL-REQUEST-NUMBER | 3,000,000 | 3,000,000 | 3,000,000 | +| MAX-THROUGHPUT | 32,215 req/sec | 38,259 req/sec | 15,784 req/sec | +| AVG-THROUGHPUT | 21,250 req/sec | 465 req/sec | 1,006 req/sec | +| MIN-THROUGHPUT | 9,081 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 3.6479 ms | 1.8912 ms | 10.3322 ms | +| AVG-LATENCY | 32.9036 ms | 28.5018 ms | 496.5874 ms | +| SLOWEST-LATENCY | 1030.3392 ms | 4729.8104 ms | 34484.1252 ms | +| Latency p10 | 10.882650 ms | 5.694308 ms | 35.045139 ms | +| Latency p25 | 13.005974 ms | 6.357600 ms | 44.711879 ms | +| Latency p50 | 18.743999 ms | 7.379354 ms | 66.739638 ms | +| Latency p75 | 31.054943 ms | 8.886502 ms | 116.150396 ms | +| Latency p90 | 96.027241 ms | 11.474394 ms | 540.305996 ms | +| Latency p95 | 123.844111 ms | 14.391699 ms | 1209.603980 ms | +| Latency p99 | 148.837786 ms | 722.847010 ms | 11957.052613 ms | +| Latency p99.9 | 162.994644 ms | 2457.522611 ms | 26068.610794 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 15 GB | 26 GB | 102 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 12 GB | 24 GB | 98 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 832 MB | 978 MB | 688 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 4.3 GB | 3.3 GB | 4.4 GB | +| SERVER-MAX-CPU-USAGE | 421.00 % | 752.33 % | 410.67 % | +| SERVER-MAX-MEMORY-USAGE | 2.8 GB | 7.1 GB | 17 GB | +| CLIENT-MAX-CPU-USAGE | 442.00 % | 376.00 % | 217.00 % | +| CLIENT-MAX-MEMORY-USAGE | 265 MB | 1.9 GB | 174 MB | +| CLIENT-ERROR-COUNT | 0 | 1,076,632 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 14 | 309 | 94,864 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 333,196 | 360,314 | 3,689,221 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 1,604,172 | 67,295,610 | 794,919,246 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 6.5 GB | 27 GB | 8.2 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: connection closed" (count 6,678) +"zk: could not connect to a server" (count 1,069,954) +``` + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA 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 61% rename from analyze/analyze_data_7_finalize_everything.go rename to analyze/finalize_everything.go index a5f1f04b..b764df07 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,84 +874,73 @@ 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 } - plog.Printf("aggregating data for %q of all database (by client number)", plotConfig.Column) - nf3 := dataframe.New() - var firstKeys []int - for i := range clientNumColumns { - n := clientNumColumns[i].Count() - allData := make(map[int]float64) - for j := 0; j < n; j++ { - v1, err := clientNumColumns[i].Value(j) - if err != nil { - return err + if len(cfg.DatabaseIDToTestGroup[cfg.AllDatabaseIDList[0]].BenchmarkOptions.ConnectionClientNumbers) > 0 { + plog.Printf("aggregating data for %q of all database (by client number)", plotConfig.Column) + nf3 := dataframe.New() + var firstKeys []int + for i := range clientNumColumns { + n := clientNumColumns[i].Count() + allData := make(map[int]float64) + for j := 0; j < n; j++ { + v1, err := clientNumColumns[i].Value(j) + if err != nil { + return err + } + num, _ := v1.Int64() + + v2, err := dataColumns[i].Value(j) + if err != nil { + return err + } + data, _ := v2.Float64() + + if v, ok := allData[int(num)]; ok { + allData[int(num)] = (v + data) / 2 + } else { + allData[int(num)] = data + } } - num, _ := v1.Int64() - - v2, err := dataColumns[i].Value(j) - if err != nil { - return err + var allKeys []int + for k := range allData { + allKeys = append(allKeys, k) } - data, _ := v2.Float64() + sort.Ints(allKeys) - if v, ok := allData[int(num)]; ok { - allData[int(num)] = (v + data) / 2 - } else { - allData[int(num)] = data + if i == 0 { + firstKeys = allKeys + } + if !reflect.DeepEqual(firstKeys, allKeys) { + return fmt.Errorf("all keys must be %+v, got %+v", firstKeys, allKeys) } - } - var allKeys []int - for k := range allData { - allKeys = append(allKeys, k) - } - sort.Ints(allKeys) - if i == 0 { - firstKeys = allKeys - } - if !reflect.DeepEqual(firstKeys, allKeys) { - return fmt.Errorf("all keys must be %+v, got %+v", firstKeys, allKeys) - } - - if i == 0 { - col1 := dataframe.NewColumn("CONTROL-CLIENT-NUM") + if i == 0 { + col1 := dataframe.NewColumn("CONTROL-CLIENT-NUM") + for j := range allKeys { + col1.PushBack(dataframe.NewStringValue(allKeys[j])) + } + if err := nf3.AddColumn(col1); err != nil { + return err + } + } + col2 := dataframe.NewColumn(dataColumns[i].Header()) for j := range allKeys { - col1.PushBack(dataframe.NewStringValue(allKeys[j])) + col2.PushBack(dataframe.NewStringValue(fmt.Sprintf("%.4f", allData[allKeys[j]]))) } - if err := nf3.AddColumn(col1); err != nil { + if err := nf3.AddColumn(col2); err != nil { return err } } - col2 := dataframe.NewColumn(dataColumns[i].Header()) - for j := range allKeys { - col2.PushBack(dataframe.NewStringValue(fmt.Sprintf("%.4f", allData[allKeys[j]]))) - } - if err := nf3.AddColumn(col2); err != nil { + if err = nf3.CSV(filepath.Join(filepath.Dir(plotConfig.OutputPathCSV), plotConfig.Column+"-BY-CLIENT-NUM-aggregated"+".csv")); err != nil { return err } } - if err = nf3.CSV(filepath.Join(cfg.WorkDir, 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 6c4934df..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_CPU_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ 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 db366cec..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_RECEIVE_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ 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 8a5f143e..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DATA_TRANSMIT_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ 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 5b995cd0..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_DISK_WRITES_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ 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 d57cd346..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_1000QPS_LINE_CHARTS_LOGARITHMIC.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BOX_PLOTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BOX_PLOTS.png deleted file mode 100644 index 6fbe645a..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BOX_PLOTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index 46b15431..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_LATENCY_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_1000QPS_LINE_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_1000QPS_LINE_CHARTS.png deleted file mode 100644 index e7c96c66..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_1000QPS_LINE_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BAR_CHARTS.png deleted file mode 100644 index 44663505..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index 5670f49f..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_MEMORY_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_SECTOR_WRITES_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_SECTOR_WRITES_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index d9472c45..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_SECTOR_WRITES_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BAR_CHARTS.png deleted file mode 100644 index 9c9135e9..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BY_CLIENTS_BAR_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BY_CLIENTS_BAR_CHARTS.png deleted file mode 100644 index a52fc344..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_BY_CLIENTS_BAR_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_LINE_CHARTS.png b/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_LINE_CHARTS.png deleted file mode 100644 index 49affef5..00000000 Binary files a/bench-results/2017Q1-01-etcd-zookeeper-consul/VM_WRITE_1M_THROUGHPUT_LINE_CHARTS.png and /dev/null differ diff --git a/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md b/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md deleted file mode 100755 index fb3a7d59..00000000 --- a/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md +++ /dev/null @@ -1,88 +0,0 @@ - - -


-##### Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 - -- 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) - - -``` -+-----------------------------+-------------------+------------------------+-----------------------+ -| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | -+-----------------------------+-------------------+------------------------+-----------------------+ -| READS-COMPLETED-DELTA-SUM | 2 | 218 | 126 | -| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | -| WRITES-COMPLETED-DELTA-SUM | 1,217,752 | 955,419 | 2,183,202 | -| SECTORS-WRITTEN-DELTA-SUM | 702,780 | 11,846,404 | 3,991,232 | -| AVG-DATA-SIZE-ON-DISK | 2.5 GB | 7.4 GB | 3.1 GB | -| NETWORK-RECEIVE-DATA-SUM | 5.1 GB | 5.0 GB | 5.5 GB | -| NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.0 GB | 4.2 GB | -| MAX-CPU-USAGE | 451.00 % | 800.00 % | 409.33 % | -| MAX-MEMORY-USAGE | 1.3 GB | 3.7 GB | 4.7 GB | -| TOTAL-SECONDS | 324.5626 sec | 335.0999 sec | 667.9389 sec | -| MAX-THROUGHPUT | 36,479 req/sec | 41,799 req/sec | 15,969 req/sec | -| AVG-THROUGHPUT | 3,081 req/sec | 2,961 req/sec | 1,497 req/sec | -| MIN-THROUGHPUT | 79 req/sec | 0 req/sec | 49 req/sec | -| FASTEST-LATENCY | 1.0313 ms | 1.1256 ms | 2.9151 ms | -| AVG-LATENCY | 13.4807 ms | 25.5780 ms | 47.0926 ms | -| SLOWEST-LATENCY | 261.8235 ms | 4260.5699 ms | 22260.1112 ms | -| Latency p10 | 2.201212 ms | 2.528874 ms | 3.926152 ms | -| Latency p25 | 5.636563 ms | 3.821957 ms | 7.640734 ms | -| Latency p50 | 9.696159 ms | 6.656013 ms | 19.126381 ms | -| Latency p75 | 16.202583 ms | 11.576279 ms | 54.750630 ms | -| Latency p90 | 28.434395 ms | 14.472618 ms | 77.993718 ms | -| Latency p95 | 44.336815 ms | 16.786180 ms | 91.026490 ms | -| Latency p99 | 60.008762 ms | 479.797108 ms | 201.844359 ms | -| Latency p99.9 | 84.831886 ms | 2725.947720 ms | 1502.535463 ms | -| CLIENT-NETWORK-RECEIVE-SUM | 270 MB | 353 MB | 200 MB | -| CLIENT-NETWORK-TRANSMIT-SUM | 1.5 GB | 1.4 GB | 1.5 GB | -| CLIENT-MAX-CPU-USAGE | 577.00 % | 496.00 % | 210.00 % | -| CLIENT-MAX-MEMORY-USAGE | 355 MB | 3.3 GB | 227 MB | -| CLIENT-ERROR-COUNT | 0 | 7,495 | 0 | -+-----------------------------+-------------------+------------------------+-----------------------+ -``` - - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA - -2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA - - - diff --git a/main.go b/cmd/dbtester/main.go similarity index 91% rename from main.go rename to cmd/dbtester/main.go index c8b7aef9..47a665c0 100644 --- a/main.go +++ b/cmd/dbtester/main.go @@ -18,7 +18,7 @@ // dbtester [command] // // Available Commands: -// agent Database 'agent' in remote servers (runs database, upload logs). +// agent Database 'agent' in remote servers. // analyze Analyzes test dbtester test results. // control Controls tests. // @@ -38,7 +38,7 @@ var ( rootCommand = &cobra.Command{ Use: "dbtester", Short: "dbtester is distributed database tester.", - SuggestFor: []string{"dbtstetr", "dbtes"}, + SuggestFor: []string{"dbtstetr", "dbtes", "dbtesters"}, } ) diff --git a/config-dbtester-gcloud-key.json b/config-dbtester-gcloud-key.json new file mode 100644 index 00000000..15c3c97c --- /dev/null +++ b/config-dbtester-gcloud-key.json @@ -0,0 +1 @@ +test-key \ No newline at end of file diff --git a/control/doc.go b/config_cetcd.go similarity index 81% rename from control/doc.go rename to config_cetcd.go index 88b8ff32..8bdcd8bf 100644 --- a/control/doc.go +++ b/config_cetcd.go @@ -12,5 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package control controls distributed databases in remote servers. -package control +package dbtester + +// Cetcd is cetcd-specific flags +// (https://github.com/coreos/cetcd). +type Cetcd struct { + // no options needed yet +} diff --git a/config_consul.go b/config_consul.go new file mode 100644 index 00000000..fb58fec4 --- /dev/null +++ b/config_consul.go @@ -0,0 +1,21 @@ +// 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 dbtester + +// Consul is Consul-specific flags +// (https://github.com/hashicorp/consul). +type Consul struct { + // no options needed yet +} diff --git a/config_dbtester.go b/config_dbtester.go new file mode 100644 index 00000000..0193b47b --- /dev/null +++ b/config_dbtester.go @@ -0,0 +1,347 @@ +// 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 dbtester + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "strings" + + "github.com/coreos/dbtester/dbtesterpb" + "gopkg.in/yaml.v2" +) + +// Config configures dbtester control clients. +type Config struct { + TestTitle string `yaml:"test_title"` + TestDescription string `yaml:"test_description"` + + Control `yaml:"control"` + AllDatabaseIDList []string `yaml:"all_database_id_list"` + DatabaseIDToTestGroup map[string]TestGroup `yaml:"datatbase_id_to_test_group"` + DatabaseIDToTestData map[string]TestData `yaml:"datatbase_id_to_test_data"` + + Analyze `yaml:"analyze"` + + PlotPathPrefix string `yaml:"plot_path_prefix"` + PlotList []Plot `yaml:"plot_list"` + README `yaml:"readme"` +} + +// Control represents common control options on client machine. +type Control struct { + PathPrefix string `yaml:"path_prefix"` + LogPath string `yaml:"log_path"` + ClientSystemMetricsPath string `yaml:"client_system_metrics_path"` + ClientSystemMetricsInterpolatedPath string `yaml:"client_system_metrics_interpolated_path"` + ClientLatencyThroughputTimeseriesPath string `yaml:"client_latency_throughput_timeseries_path"` + ClientLatencyDistributionAllPath string `yaml:"client_latency_distribution_all_path"` + ClientLatencyDistributionPercentilePath string `yaml:"client_latency_distribution_percentile_path"` + ClientLatencyDistributionSummaryPath string `yaml:"client_latency_distribution_summary_path"` + ClientLatencyByKeyNumberPath string `yaml:"client_latency_by_key_number_path"` + ServerDatasizeOnDiskSummaryPath string `yaml:"server_data_size_on_disk_summary_path"` + + GoogleCloudProjectName string `yaml:"google_cloud_project_name"` + GoogleCloudStorageKeyPath string `yaml:"google_cloud_storage_key_path"` + GoogleCloudStorageKey string + GoogleCloudStorageBucketName string `yaml:"google_cloud_storage_bucket_name"` + GoogleCloudStorageSubDirectory string `yaml:"google_cloud_storage_sub_directory"` +} + +// TestGroup specifies database test group. +type TestGroup struct { + DatabaseID string + DatabaseDescription string `yaml:"database_description"` + DatabaseTag string + + PeerIPs []string `yaml:"peer_ips"` + PeerIPsString string + + DatabasePortToConnect int `yaml:"database_port_to_connect"` + DatabaseEndpoints []string + + AgentPortToConnect int `yaml:"agent_port_to_connect"` + AgentEndpoints []string + + // database-specific flags to start + Etcdv2 `yaml:"etcdv2"` + Etcdv3 `yaml:"etcdv3"` + Zookeeper `yaml:"zookeeper"` + Consul `yaml:"consul"` + Zetcd `yaml:"zetcd"` + Cetcd `yaml:"cetcd"` + + // benchmark options + BenchmarkOptions `yaml:"benchmark_options"` + BenchmarkSteps `yaml:"benchmark_steps"` +} + +// BenchmarkOptions specifies the benchmark options. +type BenchmarkOptions struct { + Type string `yaml:"type"` + + RequestNumber int64 `yaml:"request_number"` + ConnectionNumber int64 `yaml:"connection_number"` + ClientNumber int64 `yaml:"client_number"` + ConnectionClientNumbers []int64 `yaml:"connection_client_numbers"` + RateLimitRequestsPerSecond int64 `yaml:"rate_limit_requests_per_second"` + + // for writes, reads + SameKey bool `yaml:"same_key"` + KeySizeBytes int64 `yaml:"key_size_bytes"` + ValueSizeBytes int64 `yaml:"value_size_bytes"` + + // for reads + StaleRead bool `yaml:"stale_read"` +} + +// BenchmarkSteps specifies the benchmark workflow. +type BenchmarkSteps struct { + Step1StartDatabase bool `yaml:"step1_start_database"` + Step2StressDatabase bool `yaml:"step2_stress_database"` + Step3StopDatabase bool `yaml:"step3_stop_database"` + Step4UploadLogs bool `yaml:"step4_upload_logs"` +} + +// TestData defines raw data to import. +type TestData struct { + DatabaseID string + DatabaseTag string + DatabaseDescription string + + PathPrefix string `yaml:"path_prefix"` + ClientSystemMetricsInterpolatedPath string `yaml:"client_system_metrics_interpolated_path"` + ClientLatencyThroughputTimeseriesPath string `yaml:"client_latency_throughput_timeseries_path"` + ClientLatencyDistributionAllPath string `yaml:"client_latency_distribution_all_path"` + ClientLatencyDistributionPercentilePath string `yaml:"client_latency_distribution_percentile_path"` + ClientLatencyDistributionSummaryPath string `yaml:"client_latency_distribution_summary_path"` + ClientLatencyByKeyNumberPath string `yaml:"client_latency_by_key_number_path"` + ServerDatasizeOnDiskSummaryPath string `yaml:"server_data_size_on_disk_summary_path"` + ServerMemoryByKeyNumberPath string `yaml:"server_memory_by_key_number_path"` + ServerSystemMetricsInterpolatedPathList []string `yaml:"server_system_metrics_interpolated_path_list"` + AllAggregatedOutputPath string `yaml:"all_aggregated_output_path"` +} + +// Analyze defines analyze config. +type Analyze struct { + AllAggregatedOutputPathCSV string `yaml:"all_aggregated_output_path_csv"` + AllAggregatedOutputPathTXT string `yaml:"all_aggregated_output_path_txt"` +} + +// Plot defines plot configuration. +type Plot struct { + Column string `yaml:"column"` + XAxis string `yaml:"x_axis"` + YAxis string `yaml:"y_axis"` + OutputPathCSV string `yaml:"output_path_csv"` + OutputPathList []string `yaml:"output_path_list"` +} + +// README defines how to write README. +type README struct { + OutputPath string `yaml:"output_path"` + Images []Image `yaml:"images"` +} + +// Image defines image data. +type Image struct { + Title string `yaml:"title"` + Path string `yaml:"path"` + Type string `yaml:"type"` +} + +// ReadConfig reads control configuration file. +func ReadConfig(fpath string, analyze bool) (*Config, error) { + bts, err := ioutil.ReadFile(fpath) + if err != nil { + return nil, err + } + cfg := Config{} + if err := yaml.Unmarshal(bts, &cfg); err != nil { + return nil, err + } + + if cfg.Control.PathPrefix != "" { + cfg.Control.LogPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.LogPath) + cfg.Control.ClientSystemMetricsPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientSystemMetricsPath) + cfg.Control.ClientSystemMetricsInterpolatedPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientSystemMetricsInterpolatedPath) + cfg.Control.ClientLatencyThroughputTimeseriesPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientLatencyThroughputTimeseriesPath) + cfg.Control.ClientLatencyDistributionAllPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientLatencyDistributionAllPath) + cfg.Control.ClientLatencyDistributionPercentilePath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientLatencyDistributionPercentilePath) + cfg.Control.ClientLatencyDistributionSummaryPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientLatencyDistributionSummaryPath) + cfg.Control.ClientLatencyByKeyNumberPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ClientLatencyByKeyNumberPath) + cfg.Control.ServerDatasizeOnDiskSummaryPath = filepath.Join(cfg.Control.PathPrefix, cfg.Control.ServerDatasizeOnDiskSummaryPath) + } + + for databaseID, group := range cfg.DatabaseIDToTestGroup { + group.DatabaseID = databaseID + group.DatabaseTag = MakeTag(group.DatabaseDescription) + group.PeerIPsString = strings.Join(group.PeerIPs, "___") + group.DatabaseEndpoints = make([]string, len(group.PeerIPs)) + group.AgentEndpoints = make([]string, len(group.PeerIPs)) + for j := range group.PeerIPs { + group.DatabaseEndpoints[j] = fmt.Sprintf("%s:%d", group.PeerIPs[j], group.DatabasePortToConnect) + group.AgentEndpoints[j] = fmt.Sprintf("%s:%d", group.PeerIPs[j], group.AgentPortToConnect) + } + cfg.DatabaseIDToTestGroup[databaseID] = group + } + + for databaseID, testdata := range cfg.DatabaseIDToTestData { + testdata.PathPrefix = strings.TrimSpace(testdata.PathPrefix) + testdata.DatabaseID = databaseID + testdata.DatabaseTag = cfg.DatabaseIDToTestGroup[databaseID].DatabaseTag + testdata.DatabaseDescription = cfg.DatabaseIDToTestGroup[databaseID].DatabaseDescription + + if testdata.PathPrefix != "" { + testdata.ClientSystemMetricsInterpolatedPath = testdata.PathPrefix + "-" + testdata.ClientSystemMetricsInterpolatedPath + testdata.ClientLatencyThroughputTimeseriesPath = testdata.PathPrefix + "-" + testdata.ClientLatencyThroughputTimeseriesPath + testdata.ClientLatencyDistributionAllPath = testdata.PathPrefix + "-" + testdata.ClientLatencyDistributionAllPath + testdata.ClientLatencyDistributionPercentilePath = testdata.PathPrefix + "-" + testdata.ClientLatencyDistributionPercentilePath + testdata.ClientLatencyDistributionSummaryPath = testdata.PathPrefix + "-" + testdata.ClientLatencyDistributionSummaryPath + testdata.ClientLatencyByKeyNumberPath = testdata.PathPrefix + "-" + testdata.ClientLatencyByKeyNumberPath + testdata.ServerDatasizeOnDiskSummaryPath = testdata.PathPrefix + "-" + testdata.ServerDatasizeOnDiskSummaryPath + testdata.ServerMemoryByKeyNumberPath = testdata.PathPrefix + "-" + testdata.ServerMemoryByKeyNumberPath + for i := range testdata.ServerSystemMetricsInterpolatedPathList { + testdata.ServerSystemMetricsInterpolatedPathList[i] = testdata.PathPrefix + "-" + testdata.ServerSystemMetricsInterpolatedPathList[i] + } + testdata.AllAggregatedOutputPath = testdata.PathPrefix + "-" + testdata.AllAggregatedOutputPath + } + + cfg.DatabaseIDToTestData[databaseID] = testdata + } + + for databaseID, group := range cfg.DatabaseIDToTestGroup { + if databaseID != "etcdv3" && group.BenchmarkOptions.ConnectionNumber != group.BenchmarkOptions.ClientNumber { + return nil, fmt.Errorf("%q got connected %d != clients %d", databaseID, group.BenchmarkOptions.ConnectionNumber, group.BenchmarkOptions.ClientNumber) + } + } + + var ( + defaultEtcdSnapCount int64 = 100000 + defaultZookeeperSnapCount int64 = 100000 + defaultZookeeperTickTime int64 = 2000 + defaultZookeeperInitLimit int64 = 5 + defaultZookeeperSyncLimit int64 = 5 + defaultZookeeperMaxClientConnections int64 = 5000 + ) + if v, ok := cfg.DatabaseIDToTestGroup["etcdv3"]; ok { + if v.Etcdv3.SnapCount == 0 { + v.Etcdv3.SnapCount = defaultEtcdSnapCount + } + cfg.DatabaseIDToTestGroup["etcdv3"] = v + } + if v, ok := cfg.DatabaseIDToTestGroup["zookeeper"]; ok { + if v.Zookeeper.TickTime == 0 { + v.Zookeeper.TickTime = defaultZookeeperTickTime + } + if v.Zookeeper.InitLimit == 0 { + v.Zookeeper.InitLimit = defaultZookeeperInitLimit + } + if v.Zookeeper.SyncLimit == 0 { + v.Zookeeper.SyncLimit = defaultZookeeperSyncLimit + } + if v.Zookeeper.SnapCount == 0 { + v.Zookeeper.SnapCount = defaultZookeeperSnapCount + } + if v.Zookeeper.MaxClientConnections == 0 { + v.Zookeeper.MaxClientConnections = defaultZookeeperMaxClientConnections + } + cfg.DatabaseIDToTestGroup["zookeeper"] = v + } + + if cfg.Control.GoogleCloudStorageKeyPath != "" && !analyze { + bts, err = ioutil.ReadFile(cfg.Control.GoogleCloudStorageKeyPath) + if err != nil { + return nil, err + } + cfg.Control.GoogleCloudStorageKey = string(bts) + } + + for i := range cfg.PlotList { + cfg.PlotList[i].OutputPathCSV = filepath.Join(cfg.PlotPathPrefix, cfg.PlotList[i].Column+".csv") + cfg.PlotList[i].OutputPathList = make([]string, 2) + cfg.PlotList[i].OutputPathList[0] = filepath.Join(cfg.PlotPathPrefix, cfg.PlotList[i].Column+".svg") + cfg.PlotList[i].OutputPathList[1] = filepath.Join(cfg.PlotPathPrefix, cfg.PlotList[i].Column+".png") + } + + return &cfg, nil +} + +// MakeTag converts database scription to database tag. +func MakeTag(desc string) string { + s := strings.ToLower(desc) + s = strings.Replace(s, "go ", "go", -1) + s = strings.Replace(s, "java ", "java", -1) + s = strings.Replace(s, "(", "", -1) + s = strings.Replace(s, ")", "", -1) + return strings.Replace(s, " ", "-", -1) +} + +// ToRequest converts configuration to 'dbtesterpb.Request'. +func (cfg *Config) ToRequest(databaseID string, op dbtesterpb.Request_Operation, idx int) (req *dbtesterpb.Request, err error) { + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + err = fmt.Errorf("%q is not defined", databaseID) + return + } + + req = &dbtesterpb.Request{ + Operation: op, + TriggerLogUpload: gcfg.BenchmarkSteps.Step4UploadLogs, + DatabaseID: dbtesterpb.Request_Database(dbtesterpb.Request_Database_value[databaseID]), + DatabaseTag: gcfg.DatabaseTag, + PeerIPsString: gcfg.PeerIPsString, + IpIndex: uint32(idx), + CurrentClientNumber: gcfg.BenchmarkOptions.ClientNumber, + Control: &dbtesterpb.Request_Control{ + GoogleCloudProjectName: cfg.Control.GoogleCloudProjectName, + GoogleCloudStorageKey: cfg.Control.GoogleCloudStorageKey, + GoogleCloudStorageBucketName: cfg.Control.GoogleCloudStorageBucketName, + GoogleCloudStorageSubDirectory: cfg.Control.GoogleCloudStorageSubDirectory, + }, + } + + switch req.DatabaseID { + case dbtesterpb.Request_etcdv2: + + case dbtesterpb.Request_etcdv3: + req.Etcdv3Config = &dbtesterpb.Request_Etcdv3{ + SnapCount: gcfg.Etcdv3.SnapCount, + QuotaSizeBytes: gcfg.Etcdv3.QuotaSizeBytes, + } + + case dbtesterpb.Request_zookeeper: + req.ZookeeperConfig = &dbtesterpb.Request_Zookeeper{ + MyID: uint32(idx + 1), + TickTime: gcfg.Zookeeper.TickTime, + ClientPort: int64(gcfg.DatabasePortToConnect), + InitLimit: gcfg.Zookeeper.InitLimit, + SyncLimit: gcfg.Zookeeper.SyncLimit, + SnapCount: gcfg.Zookeeper.SnapCount, + MaxClientConnections: gcfg.Zookeeper.MaxClientConnections, + } + + case dbtesterpb.Request_consul: + case dbtesterpb.Request_zetcd: + case dbtesterpb.Request_cetcd: + + default: + err = fmt.Errorf("unknown %v", req.DatabaseID) + return + } + + return +} diff --git a/config_dbtester_test.go b/config_dbtester_test.go new file mode 100644 index 00000000..7609cc24 --- /dev/null +++ b/config_dbtester_test.go @@ -0,0 +1,501 @@ +// 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 dbtester + +import ( + "reflect" + "testing" + + "github.com/coreos/dbtester/dbtesterpb" +) + +func TestConfig(t *testing.T) { + cfg, err := ReadConfig("config_dbtester_test.yaml", false) + if err != nil { + t.Fatal(err) + } + expected := &Config{ + TestTitle: "Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000", + TestDescription: `- 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) +`, + Control: Control{ + PathPrefix: "/home/gyuho", + LogPath: "/home/gyuho/client-control.log", + ClientSystemMetricsPath: "/home/gyuho/client-system-metrics.csv", + ClientSystemMetricsInterpolatedPath: "/home/gyuho/client-system-metrics-interpolated.csv", + ClientLatencyThroughputTimeseriesPath: "/home/gyuho/client-latency-throughput-timeseries.csv", + ClientLatencyDistributionAllPath: "/home/gyuho/client-latency-distribution-all.csv", + ClientLatencyDistributionPercentilePath: "/home/gyuho/client-latency-distribution-percentile.csv", + ClientLatencyDistributionSummaryPath: "/home/gyuho/client-latency-distribution-summary.csv", + ClientLatencyByKeyNumberPath: "/home/gyuho/client-latency-by-key-number.csv", + ServerDatasizeOnDiskSummaryPath: "/home/gyuho/server-data-size-on-disk-summary.csv", + GoogleCloudProjectName: "etcd-development", + GoogleCloudStorageKeyPath: "config-dbtester-gcloud-key.json", + GoogleCloudStorageKey: "test-key", + GoogleCloudStorageBucketName: "dbtester-results", + GoogleCloudStorageSubDirectory: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable", + }, + AllDatabaseIDList: []string{"etcdv3", "zookeeper", "consul"}, + DatabaseIDToTestGroup: map[string]TestGroup{ + "etcdv3": { + DatabaseID: "etcdv3", + DatabaseTag: "etcd-v3.1-go1.7.4", + DatabaseDescription: "etcd v3.1 (Go 1.7.4)", + PeerIPs: []string{"10.240.0.20", "10.240.0.21", "10.240.0.22"}, + PeerIPsString: "10.240.0.20___10.240.0.21___10.240.0.22", + DatabasePortToConnect: 2379, + DatabaseEndpoints: []string{"10.240.0.20:2379", "10.240.0.21:2379", "10.240.0.22:2379"}, + AgentPortToConnect: 3500, + AgentEndpoints: []string{"10.240.0.20:3500", "10.240.0.21:3500", "10.240.0.22:3500"}, + Etcdv3: Etcdv3{ + SnapCount: 100000, + QuotaSizeBytes: 8000000000, + }, + BenchmarkOptions: BenchmarkOptions{ + Type: "write", + RequestNumber: 1000000, + ConnectionNumber: 0, + ClientNumber: 0, + ConnectionClientNumbers: []int64{1, 10, 50, 100, 300, 500, 700, 1000}, + RateLimitRequestsPerSecond: 0, + SameKey: false, + KeySizeBytes: 256, + ValueSizeBytes: 1024, + StaleRead: false, + }, + BenchmarkSteps: BenchmarkSteps{ + Step1StartDatabase: true, + Step2StressDatabase: true, + Step3StopDatabase: true, + Step4UploadLogs: true, + }, + }, + "zookeeper": { + DatabaseID: "zookeeper", + DatabaseTag: "zookeeper-r3.4.9-java8", + DatabaseDescription: "Zookeeper r3.4.9 (Java 8)", + PeerIPs: []string{"10.240.0.25", "10.240.0.27", "10.240.0.28"}, + PeerIPsString: "10.240.0.25___10.240.0.27___10.240.0.28", + DatabasePortToConnect: 2181, + DatabaseEndpoints: []string{"10.240.0.25:2181", "10.240.0.27:2181", "10.240.0.28:2181"}, + AgentPortToConnect: 3500, + AgentEndpoints: []string{"10.240.0.25:3500", "10.240.0.27:3500", "10.240.0.28:3500"}, + Zookeeper: Zookeeper{ + TickTime: 2000, + InitLimit: 5, + SyncLimit: 5, + SnapCount: 100000, + MaxClientConnections: 5000, + }, + BenchmarkOptions: BenchmarkOptions{ + Type: "write", + RequestNumber: 1000000, + ConnectionNumber: 0, + ClientNumber: 0, + ConnectionClientNumbers: []int64{1, 10, 50, 100, 300, 500, 700, 1000}, + RateLimitRequestsPerSecond: 0, + SameKey: false, + KeySizeBytes: 256, + ValueSizeBytes: 1024, + StaleRead: false, + }, + BenchmarkSteps: BenchmarkSteps{ + Step1StartDatabase: true, + Step2StressDatabase: true, + Step3StopDatabase: true, + Step4UploadLogs: true, + }, + }, + "consul": { + DatabaseID: "consul", + DatabaseTag: "consul-v0.7.3-go1.7.4", + DatabaseDescription: "Consul v0.7.3 (Go 1.7.4)", + PeerIPs: []string{"10.240.0.30", "10.240.0.31", "10.240.0.33"}, + PeerIPsString: "10.240.0.30___10.240.0.31___10.240.0.33", + DatabasePortToConnect: 8500, + DatabaseEndpoints: []string{"10.240.0.30:8500", "10.240.0.31:8500", "10.240.0.33:8500"}, + AgentPortToConnect: 3500, + AgentEndpoints: []string{"10.240.0.30:3500", "10.240.0.31:3500", "10.240.0.33:3500"}, + BenchmarkOptions: BenchmarkOptions{ + Type: "write", + RequestNumber: 1000000, + ConnectionNumber: 0, + ClientNumber: 0, + ConnectionClientNumbers: []int64{1, 10, 50, 100, 300, 500, 700, 1000}, + RateLimitRequestsPerSecond: 0, + SameKey: false, + KeySizeBytes: 256, + ValueSizeBytes: 1024, + StaleRead: false, + }, + BenchmarkSteps: BenchmarkSteps{ + Step1StartDatabase: true, + Step2StressDatabase: true, + Step3StopDatabase: true, + Step4UploadLogs: true, + }, + }, + }, + DatabaseIDToTestData: map[string]TestData{ + "etcdv3": { + DatabaseID: "etcdv3", + DatabaseTag: "etcd-v3.1-go1.7.4", + DatabaseDescription: "etcd v3.1 (Go 1.7.4)", + PathPrefix: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4", + + ClientSystemMetricsInterpolatedPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-system-metrics-interpolated.csv", + ClientLatencyThroughputTimeseriesPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-latency-throughput-timeseries.csv", + ClientLatencyDistributionAllPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-latency-distribution-all.csv", + ClientLatencyDistributionPercentilePath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-latency-distribution-percentile.csv", + ClientLatencyDistributionSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-latency-distribution-summary.csv", + ClientLatencyByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-client-latency-by-key-number.csv", + ServerMemoryByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-server-memory-by-key-number.csv", + ServerDatasizeOnDiskSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-server-data-size-on-disk-summary.csv", + ServerSystemMetricsInterpolatedPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-1-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-2-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-3-server-system-metrics-interpolated.csv", + }, + AllAggregatedOutputPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4-all-aggregated.csv", + }, + "zookeeper": { + DatabaseID: "zookeeper", + DatabaseTag: "zookeeper-r3.4.9-java8", + DatabaseDescription: "Zookeeper r3.4.9 (Java 8)", + PathPrefix: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8", + + ClientSystemMetricsInterpolatedPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-system-metrics-interpolated.csv", + ClientLatencyThroughputTimeseriesPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-latency-throughput-timeseries.csv", + ClientLatencyDistributionAllPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-latency-distribution-all.csv", + ClientLatencyDistributionPercentilePath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-latency-distribution-percentile.csv", + ClientLatencyDistributionSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-latency-distribution-summary.csv", + ClientLatencyByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-client-latency-by-key-number.csv", + ServerMemoryByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-server-memory-by-key-number.csv", + ServerDatasizeOnDiskSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-server-data-size-on-disk-summary.csv", + ServerSystemMetricsInterpolatedPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-1-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-2-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-3-server-system-metrics-interpolated.csv", + }, + AllAggregatedOutputPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8-all-aggregated.csv", + }, + "consul": { + DatabaseID: "consul", + DatabaseTag: "consul-v0.7.3-go1.7.4", + DatabaseDescription: "Consul v0.7.3 (Go 1.7.4)", + PathPrefix: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4", + + ClientSystemMetricsInterpolatedPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-system-metrics-interpolated.csv", + ClientLatencyThroughputTimeseriesPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-latency-throughput-timeseries.csv", + ClientLatencyDistributionAllPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-latency-distribution-all.csv", + ClientLatencyDistributionPercentilePath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-latency-distribution-percentile.csv", + ClientLatencyDistributionSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-latency-distribution-summary.csv", + ClientLatencyByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-client-latency-by-key-number.csv", + ServerMemoryByKeyNumberPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-server-memory-by-key-number.csv", + ServerDatasizeOnDiskSummaryPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-server-data-size-on-disk-summary.csv", + ServerSystemMetricsInterpolatedPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-1-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-2-server-system-metrics-interpolated.csv", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-3-server-system-metrics-interpolated.csv", + }, + AllAggregatedOutputPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4-all-aggregated.csv", + }, + }, + Analyze: Analyze{ + AllAggregatedOutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.csv", + AllAggregatedOutputPathTXT: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.txt", + }, + PlotPathPrefix: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable", + PlotList: []Plot{ + { + Column: "AVG-LATENCY-MS", + XAxis: "Second", + YAxis: "Latency(millisecond)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.png", + }, + }, + { + Column: "AVG-THROUGHPUT", + XAxis: "Second", + YAxis: "Throughput(Requests/Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.png", + }, + }, + { + Column: "AVG-VOLUNTARY-CTXT-SWITCHES", + XAxis: "Second", + YAxis: "Voluntary Context Switches", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.png", + }, + }, + { + Column: "AVG-NON-VOLUNTARY-CTXT-SWITCHES", + XAxis: "Second", + YAxis: "Non-voluntary Context Switches", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.png", + }, + }, + { + Column: "AVG-CPU", + XAxis: "Second", + YAxis: "CPU(%)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.png", + }, + }, + { + Column: "AVG-VMRSS-MB", + XAxis: "Second", + YAxis: "Memory(MB)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.png", + }, + }, + { + Column: "AVG-READS-COMPLETED-DELTA", + XAxis: "Second", + YAxis: "Disk Reads (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.png", + }, + }, + { + Column: "AVG-SECTORS-READ-DELTA", + XAxis: "Second", + YAxis: "Sectors Read (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.png", + }, + }, + { + Column: "AVG-WRITES-COMPLETED-DELTA", + XAxis: "Second", + YAxis: "Disk Writes (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.png", + }, + }, + { + Column: "AVG-SECTORS-WRITTEN-DELTA", + XAxis: "Second", + YAxis: "Sectors Written (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.png", + }, + }, + { + Column: "AVG-RECEIVE-BYTES-NUM-DELTA", + XAxis: "Second", + YAxis: "Network Receive(bytes) (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.png", + }, + }, + { + Column: "AVG-TRANSMIT-BYTES-NUM-DELTA", + XAxis: "Second", + YAxis: "Network Transmit(bytes) (Delta per Second)", + OutputPathCSV: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.csv", + OutputPathList: []string{ + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg", + "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.png", + }, + }, + }, + README: README{ + OutputPath: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/README.md", + + Images: []Image{ + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg", + Type: "remote", + }, + { + Title: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA", + Path: "https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg", + Type: "remote", + }, + }, + }, + } + if !reflect.DeepEqual(cfg, expected) { + t.Fatalf("configuration expected\n%+v\n, got\n%+v\n", expected, cfg) + } + + req1, err := cfg.ToRequest("etcdv3", dbtesterpb.Request_Start, 0) + if err != nil { + t.Fatal(err) + } + expected1 := &dbtesterpb.Request{ + Operation: dbtesterpb.Request_Start, + TriggerLogUpload: true, + DatabaseID: dbtesterpb.Request_etcdv3, + DatabaseTag: "etcd-v3.1-go1.7.4", + PeerIPsString: "10.240.0.20___10.240.0.21___10.240.0.22", + IpIndex: 0, + CurrentClientNumber: 0, + Control: &dbtesterpb.Request_Control{ + GoogleCloudProjectName: "etcd-development", + GoogleCloudStorageKey: "test-key", + GoogleCloudStorageBucketName: "dbtester-results", + GoogleCloudStorageSubDirectory: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable", + }, + Etcdv3Config: &dbtesterpb.Request_Etcdv3{ + SnapCount: 100000, + QuotaSizeBytes: 8000000000, + }, + } + if !reflect.DeepEqual(req1, expected1) { + t.Fatalf("configuration expected\n%+v\n, got\n%+v\n", expected1, req1) + } + + req2, err := cfg.ToRequest("zookeeper", dbtesterpb.Request_Start, 2) + if err != nil { + t.Fatal(err) + } + expected2 := &dbtesterpb.Request{ + Operation: dbtesterpb.Request_Start, + TriggerLogUpload: true, + DatabaseID: dbtesterpb.Request_zookeeper, + DatabaseTag: "zookeeper-r3.4.9-java8", + PeerIPsString: "10.240.0.25___10.240.0.27___10.240.0.28", + IpIndex: 2, + CurrentClientNumber: 0, + Control: &dbtesterpb.Request_Control{ + GoogleCloudProjectName: "etcd-development", + GoogleCloudStorageKey: "test-key", + GoogleCloudStorageBucketName: "dbtester-results", + GoogleCloudStorageSubDirectory: "2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable", + }, + ZookeeperConfig: &dbtesterpb.Request_Zookeeper{ + MyID: 3, + TickTime: 2000, + ClientPort: 2181, + InitLimit: 5, + SyncLimit: 5, + SnapCount: 100000, + MaxClientConnections: 5000, + }, + } + if !reflect.DeepEqual(req2, expected2) { + t.Fatalf("configuration expected\n%+v\n, got\n%+v\n", expected2, req2) + } +} diff --git a/config_dbtester_test.yaml b/config_dbtester_test.yaml new file mode 100644 index 00000000..6b6b1b9d --- /dev/null +++ b/config_dbtester_test.yaml @@ -0,0 +1,340 @@ +test_title: Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 +test_description: | + - 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) + +# common control options for all client machines +control: + # if not empty, all test data paths are prefixed + path_prefix: /home/gyuho + log_path: client-control.log + client_system_metrics_path: client-system-metrics.csv + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + + # (optional) to automatically upload all files in client machine + google_cloud_project_name: etcd-development + # set this in 'control' machine, to automate log uploading in remote 'agent' machines + # google_cloud_storage_key_path: /home/gyuho/gcloud-key.json + google_cloud_storage_key_path: config-dbtester-gcloud-key.json + google_cloud_storage_bucket_name: dbtester-results + google_cloud_storage_sub_directory: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable + +all_database_id_list: [etcdv3, zookeeper, consul] + +datatbase_id_to_test_group: + etcdv3: + database_description: etcd v3.1 (Go 1.7.4) + peer_ips: + - 10.240.0.20 + - 10.240.0.21 + - 10.240.0.22 + database_port_to_connect: 2379 + agent_port_to_connect: 3500 + + etcdv3: + # --snapshot-count + snap_count: 100000 + # --quota-backend-bytes; 8 GB + quota_size_bytes: 8000000000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + zookeeper: + database_description: Zookeeper r3.4.9 (Java 8) + peer_ips: + - 10.240.0.25 + - 10.240.0.27 + - 10.240.0.28 + database_port_to_connect: 2181 + agent_port_to_connect: 3500 + + # http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html + zookeeper: + # tickTime; the length of a single tick, which is the basic time unit used by ZooKeeper, + # as measured in milliseconds. + tick_time: 2000 + + # initLimit; Amount of time, in ticks to allow followers to connect and sync to a leader + # increased this value as needed, if the amount of data managed by ZooKeeper is large. + # (default 5) + init_limit: 5 + + # syncLimit; Amount of time, in ticks to allow followers to sync with ZooKeeper. + # (default 5) + sync_limit: 5 + + # snapCount; After snapCount transactions are written to a log file a snapshot + # is started and a new transaction log file is created. The default snapCount is 100,000. + snap_count: 100000 + + # maxClientCnxns; Limits the number of concurrent connections (at the socket level) + # that a single client, identified by IP address, may make to a single member of the ZooKeeper ensemble. + max_client_connections: 5000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + consul: + database_description: Consul v0.7.3 (Go 1.7.4) + peer_ips: + - 10.240.0.30 + - 10.240.0.31 + - 10.240.0.33 + database_port_to_connect: 8500 + agent_port_to_connect: 3500 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + +datatbase_id_to_test_data: + etcdv3: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + zookeeper: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + consul: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + +analyze: + all_aggregated_output_path_csv: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.csv + all_aggregated_output_path_txt: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.txt + +plot_path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable +plot_list: +- column: AVG-LATENCY-MS + x_axis: Second + y_axis: Latency(millisecond) + +- column: AVG-THROUGHPUT + x_axis: Second + y_axis: Throughput(Requests/Second) + +- column: AVG-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Voluntary Context Switches + +- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Non-voluntary Context Switches + +- column: AVG-CPU + x_axis: Second + y_axis: CPU(%) + +- column: AVG-VMRSS-MB + x_axis: Second + y_axis: Memory(MB) + +- column: AVG-READS-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Reads (Delta per Second) + +- column: AVG-SECTORS-READ-DELTA + x_axis: Second + y_axis: Sectors Read (Delta per Second) + +- column: AVG-WRITES-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Writes (Delta per Second) + +- column: AVG-SECTORS-WRITTEN-DELTA + x_axis: Second + y_axis: Sectors Written (Delta per Second) + +- column: AVG-RECEIVE-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Receive(bytes) (Delta per Second) + +- column: AVG-TRANSMIT-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Transmit(bytes) (Delta per Second) + +readme: + output_path: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/README.md + + images: + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg + type: remote diff --git a/config_etcdv2.go b/config_etcdv2.go new file mode 100644 index 00000000..409b5616 --- /dev/null +++ b/config_etcdv2.go @@ -0,0 +1,21 @@ +// 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 dbtester + +// Etcdv2 is etcdv2-specific flags +// (https://github.com/coreos/etcd/blob/master/etcdmain/help.go). +type Etcdv2 struct { + // no options needed yet +} diff --git a/config_etcdv3.go b/config_etcdv3.go new file mode 100644 index 00000000..0ab44c9e --- /dev/null +++ b/config_etcdv3.go @@ -0,0 +1,22 @@ +// 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 dbtester + +// Etcdv3 is etcdv3-specific flags +// (https://github.com/coreos/etcd/blob/master/etcdmain/help.go). +type Etcdv3 struct { + SnapCount int64 `yaml:"snap_count"` + QuotaSizeBytes int64 `yaml:"quota_size_bytes"` +} diff --git a/config_zetcd.go b/config_zetcd.go new file mode 100644 index 00000000..2480f923 --- /dev/null +++ b/config_zetcd.go @@ -0,0 +1,21 @@ +// 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 dbtester + +// Zetcd is zetcd-specific flags +// (https://github.com/coreos/zetcd). +type Zetcd struct { + // no options needed yet +} diff --git a/config_zookeeper.go b/config_zookeeper.go new file mode 100644 index 00000000..169998e8 --- /dev/null +++ b/config_zookeeper.go @@ -0,0 +1,25 @@ +// 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 dbtester + +// Zookeeper is Zookeeper-specific flags +// (http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html). +type Zookeeper struct { + TickTime int64 `yaml:"tick_time"` + InitLimit int64 `yaml:"init_limit"` + SyncLimit int64 `yaml:"sync_limit"` + SnapCount int64 `yaml:"snap_count"` + MaxClientConnections int64 `yaml:"max_client_connections"` +} diff --git a/control/command.go b/control/command.go index 7e65209b..8dff77ff 100644 --- a/control/command.go +++ b/control/command.go @@ -16,11 +16,11 @@ package control import ( "fmt" - "io/ioutil" "os" - "strings" "time" + "github.com/coreos/dbtester" + "github.com/coreos/dbtester/dbtesterpb" "github.com/coreos/dbtester/pkg/netutil" "github.com/coreos/dbtester/pkg/ntp" "github.com/gyuho/psn" @@ -34,6 +34,7 @@ var Command = &cobra.Command{ RunE: commandFunc, } +var databaseID string var configPath string var diskDevice string var networkInterface string @@ -52,17 +53,15 @@ func init() { nt = k break } + + Command.PersistentFlags().StringVar(&databaseID, "database-id", "etcdv3", "etcdv2, etcdv3, zookeeper, consul, zetcd, cetcd.") Command.PersistentFlags().StringVarP(&configPath, "config", "c", "", "YAML configuration file path.") Command.PersistentFlags().StringVar(&diskDevice, "disk-device", dn, "Disk device to collect disk statistics metrics from.") Command.PersistentFlags().StringVar(&networkInterface, "network-interface", nt, "Network interface to record in/outgoing packets.") } func commandFunc(cmd *cobra.Command, args []string) error { - cfg, err := ReadConfig(configPath) - if err != nil { - return err - } - switch cfg.Database { + switch databaseID { case "etcdv2": case "etcdv3": case "zookeeper": @@ -70,30 +69,32 @@ func commandFunc(cmd *cobra.Command, args []string) error { case "consul": case "cetcd": default: - return fmt.Errorf("%q is not supported", cfg.Database) + return fmt.Errorf("%q is not supported", databaseID) } - if !cfg.Step2.SkipStressDatabase { - switch cfg.Step2.BenchType { + cfg, err := dbtester.ReadConfig(configPath, false) + if err != nil { + return err + } + + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + return fmt.Errorf("%q is not found", databaseID) + } + + if gcfg.BenchmarkSteps.Step2StressDatabase { + switch gcfg.BenchmarkOptions.Type { case "write": case "read": case "read-oneshot": default: - return fmt.Errorf("%q is not supported", cfg.Step2.BenchType) + return fmt.Errorf("%q is not supported", gcfg.BenchmarkOptions.Type) } } - if cfg.Step4.UploadLogs { - bts, err := ioutil.ReadFile(cfg.Step4.GoogleCloudStorageKeyPath) - if err != nil { - return err - } - cfg.Step4.GoogleCloudStorageKey = string(bts) - } - pid := int64(os.Getpid()) - plog.Infof("starting collecting system metrics at %q [disk device: %q | network interface: %q | PID: %d]", cfg.ClientSystemMetrics, diskDevice, networkInterface, pid) - if err = os.RemoveAll(cfg.ClientSystemMetrics); err != nil { + plog.Infof("starting collecting system metrics at %q [disk device: %q | network interface: %q | PID: %d]", cfg.Control.ClientSystemMetricsPath, diskDevice, networkInterface, pid) + if err = os.RemoveAll(cfg.Control.ClientSystemMetricsPath); err != nil { return err } tcfg := &psn.TopConfig{ @@ -103,7 +104,7 @@ func commandFunc(cmd *cobra.Command, args []string) error { } var metricsCSV *psn.CSV metricsCSV, err = psn.NewCSV( - cfg.ClientSystemMetrics, + cfg.Control.ClientSystemMetricsPath, pid, diskDevice, networkInterface, @@ -125,7 +126,7 @@ func commandFunc(cmd *cobra.Command, args []string) error { } case <-donec: - plog.Infof("finishing collecting system metrics; saving CSV at %q", cfg.ClientSystemMetrics) + plog.Infof("finishing collecting system metrics; saving CSV at %q", cfg.Control.ClientSystemMetricsPath) if err := metricsCSV.Save(); err != nil { plog.Errorf("psn.CSV.Save(%q) error %v", metricsCSV.FilePath, err) @@ -137,7 +138,7 @@ func commandFunc(cmd *cobra.Command, args []string) error { if err != nil { plog.Fatalf("psn.CSV.Interpolate(%q) failed with %v", metricsCSV.FilePath, err) } - interpolated.FilePath = cfg.ClientSystemMetricsInterpolated + interpolated.FilePath = cfg.Control.ClientSystemMetricsInterpolatedPath if err := interpolated.Save(); err != nil { plog.Errorf("psn.CSV.Save(%q) error %v", interpolated.FilePath, err) } else { @@ -151,60 +152,89 @@ func commandFunc(cmd *cobra.Command, args []string) error { } }() - // protoc sorts the 'repeated' type data - // encode in string to enforce ordering of IPs - cfg.PeerIPString = strings.Join(cfg.PeerIPs, "___") - cfg.AgentEndpoints = make([]string, len(cfg.PeerIPs)) - cfg.DatabaseEndpoints = make([]string, len(cfg.PeerIPs)) - for i := range cfg.PeerIPs { - cfg.AgentEndpoints[i] = fmt.Sprintf("%s:%d", cfg.PeerIPs[i], cfg.AgentPort) - } - for i := range cfg.PeerIPs { - cfg.DatabaseEndpoints[i] = fmt.Sprintf("%s:%d", cfg.PeerIPs[i], cfg.DatabasePort) - } - no, nerr := ntp.DefaultSync() plog.Infof("npt update output: %q", no) plog.Infof("npt update error: %v", nerr) println() - if !cfg.Step1.SkipStartDatabase { + if gcfg.BenchmarkSteps.Step1StartDatabase { plog.Info("step 1: starting databases...") - if err = step1StartDatabase(cfg); err != nil { + if _, err = cfg.BroadcaseRequest(databaseID, dbtesterpb.Request_Start); err != nil { return err } } - if !cfg.Step2.SkipStressDatabase { + if gcfg.BenchmarkSteps.Step2StressDatabase { println() time.Sleep(5 * time.Second) + println() plog.Info("step 2: starting tests...") - if err = step2StressDatabase(cfg); err != nil { + if err = cfg.Stress(databaseID); err != nil { return err } } - println() - time.Sleep(5 * time.Second) - idxToResponse, err := step3StopDatabase(cfg) - if err != nil { - plog.Warning(err) - } - for idx := range cfg.AgentEndpoints { - plog.Infof("stop response: %+v", idxToResponse[idx]) - } + if gcfg.BenchmarkSteps.Step3StopDatabase { + println() + time.Sleep(5 * time.Second) + println() + plog.Info("step 3: stopping tests...") + var idxToResp map[int]dbtesterpb.Response + for i := 0; i < 5; i++ { + idxToResp, err = cfg.BroadcaseRequest(databaseID, dbtesterpb.Request_Stop) + if err != nil { + plog.Warningf("#%d: STOP failed at %v", i, err) + time.Sleep(300 * time.Millisecond) + continue + } + break + } + for idx := range gcfg.AgentEndpoints { + plog.Infof("stop response: %+v", idxToResp[idx]) + } - println() - time.Sleep(time.Second) - saveDatasizeSummary(cfg, idxToResponse) + println() + time.Sleep(time.Second) + println() + plog.Info("step 3: saving responses...") + if err = cfg.SaveDatasizeOnDiskSummary(databaseID, idxToResp); err != nil { + return err + } + } close(donec) <-sysdonec - if cfg.Step4.UploadLogs { + if gcfg.BenchmarkSteps.Step4UploadLogs { println() time.Sleep(3 * time.Second) - if err := step4UploadLogs(cfg); err != nil { + println() + plog.Info("step 4: uploading logs...") + if err = cfg.UploadToGoogle(databaseID, cfg.Control.LogPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientSystemMetricsPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientSystemMetricsInterpolatedPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientLatencyThroughputTimeseriesPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientLatencyDistributionAllPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientLatencyDistributionPercentilePath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientLatencyDistributionSummaryPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ClientLatencyByKeyNumberPath); err != nil { + return err + } + if err = cfg.UploadToGoogle(databaseID, cfg.Control.ServerDatasizeOnDiskSummaryPath); err != nil { return err } } diff --git a/control/config.go b/control/config.go deleted file mode 100644 index af503fcb..00000000 --- a/control/config.go +++ /dev/null @@ -1,179 +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 control - -import ( - "fmt" - "io/ioutil" - - "github.com/coreos/dbtester/agent/agentpb" - - "gopkg.in/yaml.v2" -) - -// Config configures dbtester control clients. -type Config struct { - Database string `yaml:"database"` - TestName string `yaml:"test_name"` - - PeerIPs []string `yaml:"peer_ips"` - PeerIPString string - AgentPort int `yaml:"agent_port"` - DatabasePort int `yaml:"database_port"` - - AgentEndpoints []string - DatabaseEndpoints []string - - Log string `yaml:"log"` - DatasizeSummary string `yaml:"data_size_summary"` - DataLatencyDistributionSummary string `yaml:"data_latency_distribution_summary"` - DataLatencyDistributionPercentile string `yaml:"data_latency_distribution_percentile"` - DataLatencyDistributionAll string `yaml:"data_latency_distribution_all"` - DataLatencyThroughputTimeseries string `yaml:"data_latency_throughput_timeseries"` - DataLatencyByKeyNumber string `yaml:"data_latency_by_key_number"` - ClientSystemMetrics string `yaml:"client_system_metrics"` - ClientSystemMetricsInterpolated string `yaml:"client_system_metrics_interpolated"` - - // https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html - Step1 struct { - SkipStartDatabase bool `yaml:"skip_start_database"` - EtcdSnapCount int64 `yaml:"etcd_snap_count"` - EtcdQuotaSizeBytes int64 `yaml:"etcd_quota_size_bytes"` - ZookeeperSnapCount int64 `yaml:"zookeeper_snap_count"` - ZookeeperMaxClientCnxns int64 `yaml:"zookeeper_max_client_connections"` - } `yaml:"step1"` - - Step2 struct { - SkipStressDatabase bool `yaml:"skip_stress_database"` - BenchType string `yaml:"bench_type"` - StaleRead bool `yaml:"stale_read"` - Connections int `yaml:"connections"` - Clients int `yaml:"clients"` - ConnectionsClients []int `yaml:"connections_clients"` - KeySize int `yaml:"key_size"` - SameKey bool `yaml:"same_key"` - ValueSize int `yaml:"value_size"` - TotalRequests int `yaml:"total_requests"` - RequestsPerSecond int `yaml:"requests_per_second"` - } `yaml:"step2"` - - Step3 struct { - Action string `yaml:"action"` - } `yaml:"step3"` - - Step4 struct { - UploadLogs bool `yaml:"upload_logs"` - GoogleCloudProjectName string `yaml:"google_cloud_project_name"` - GoogleCloudStorageKey string - GoogleCloudStorageKeyPath string `yaml:"google_cloud_storage_key_path"` - GoogleCloudStorageBucketName string `yaml:"google_cloud_storage_bucket_name"` - GoogleCloudStorageSubDirectory string `yaml:"google_cloud_storage_sub_directory"` - } `yaml:"step4"` -} - -var ( - defaultEtcdSnapCount int64 = 100000 - defaultZookeeperSnapCount int64 = 100000 - defaultZookeeperMaxClientCnxns int64 = 5000 -) - -// ReadConfig reads control configuration file. -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 - } - - if rs.Step2.Connections != rs.Step2.Clients { - switch rs.Database { - case "etcdv2": - return Config{}, fmt.Errorf("connected %d != clients %d", rs.Step2.Connections, rs.Step2.Clients) - - case "etcdv3": - - case "zookeeper": - return Config{}, fmt.Errorf("connected %d != clients %d", rs.Step2.Connections, rs.Step2.Clients) - - case "zetcd": - return Config{}, fmt.Errorf("connected %d != clients %d", rs.Step2.Connections, rs.Step2.Clients) - - case "consul": - return Config{}, fmt.Errorf("connected %d != clients %d", rs.Step2.Connections, rs.Step2.Clients) - - case "cetcd": - return Config{}, fmt.Errorf("connected %d != clients %d", rs.Step2.Connections, rs.Step2.Clients) - } - } - - if rs.Step1.EtcdSnapCount == 0 { - rs.Step1.EtcdSnapCount = defaultEtcdSnapCount - } - if rs.Step1.ZookeeperSnapCount == 0 { - rs.Step1.ZookeeperSnapCount = defaultZookeeperSnapCount - } - if rs.Step1.ZookeeperMaxClientCnxns == 0 { - rs.Step1.ZookeeperMaxClientCnxns = defaultZookeeperMaxClientCnxns - } - - return rs, nil -} - -// ToRequest converts control configuration to agent RPC. -func (cfg *Config) ToRequest() agentpb.Request { - req := agentpb.Request{} - - req.TestName = cfg.TestName - - switch cfg.Database { - case "etcdv2": - req.Database = agentpb.Request_etcdv2 - - case "etcdv3": - req.Database = agentpb.Request_etcdv3 - - case "zookeeper": - req.Database = agentpb.Request_ZooKeeper - - case "zetcd": - req.Database = agentpb.Request_zetcd - - case "consul": - req.Database = agentpb.Request_Consul - - case "cetcd": - req.Database = agentpb.Request_cetcd - } - - req.PeerIPString = cfg.PeerIPString - - req.EtcdSnapCount = cfg.Step1.EtcdSnapCount - req.EtcdQuotaSizeBytes = cfg.Step1.EtcdQuotaSizeBytes - req.ZookeeperSnapCount = cfg.Step1.ZookeeperSnapCount - req.ZookeeperMaxClientCnxns = cfg.Step1.ZookeeperMaxClientCnxns - - req.ClientNum = int64(cfg.Step2.Clients) - - req.UploadLogs = cfg.Step4.UploadLogs - req.GoogleCloudProjectName = cfg.Step4.GoogleCloudProjectName - req.GoogleCloudStorageKey = cfg.Step4.GoogleCloudStorageKey - req.GoogleCloudStorageBucketName = cfg.Step4.GoogleCloudStorageBucketName - req.GoogleCloudStorageSubDirectory = cfg.Step4.GoogleCloudStorageSubDirectory - - return req -} diff --git a/control/config_test.go b/control/config_test.go deleted file mode 100644 index 1e15b920..00000000 --- a/control/config_test.go +++ /dev/null @@ -1,140 +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 control - -import ( - "reflect" - "testing" -) - -func TestReadConfig(t *testing.T) { - c, err := ReadConfig("config_test.yaml") - if err != nil { - t.Fatal(err) - } - if c.Database != "etcdv3" { - t.Fatalf("unexpected %s", c.Database) - } - if c.TestName != "01-etcdv3" { - t.Fatalf("unexpected %s", c.TestName) - } - if !reflect.DeepEqual(c.PeerIPs, []string{"10.240.0.13", "10.240.0.14", "10.240.0.15"}) { - t.Fatalf("unexpected %s", c.PeerIPs) - } - if c.AgentPort != 3500 { - t.Fatalf("unexpected %d", c.AgentPort) - } - if c.DatabasePort != 2379 { - t.Fatalf("unexpected %d", c.DatabasePort) - } - - if c.Log != "control.log" { - t.Fatalf("unexpected %v", c.Log) - } - if c.DatasizeSummary != "data-size-summary.csv" { - t.Fatalf("unexpected %s", c.DatasizeSummary) - } - if c.DataLatencyDistributionSummary != "data-latency-distribution-summary.csv" { - t.Fatalf("unexpected %s", c.DataLatencyDistributionSummary) - } - if c.DataLatencyDistributionPercentile != "data-latency-distribution-percentile.csv" { - t.Fatalf("unexpected %s", c.DataLatencyDistributionPercentile) - } - if c.DataLatencyDistributionAll != "data-latency-distribution-all.csv" { - t.Fatalf("unexpected %s", c.DataLatencyDistributionAll) - } - if c.DataLatencyThroughputTimeseries != "data-latency-throughput-timeseries.csv" { - t.Fatalf("unexpected %s", c.DataLatencyThroughputTimeseries) - } - if c.DataLatencyByKeyNumber != "data-latency-by-key-number.csv" { - t.Fatalf("unexpected %s", c.DataLatencyByKeyNumber) - } - if c.ClientSystemMetrics != "client-system-metrics.csv" { - t.Fatalf("unexpected %s", c.ClientSystemMetrics) - } - if c.ClientSystemMetricsInterpolated != "client-system-metrics-interpolated.csv" { - t.Fatalf("unexpected %s", c.ClientSystemMetricsInterpolated) - } - - if c.Step1.SkipStartDatabase { - t.Fatalf("unexpected %v", c.Step1.SkipStartDatabase) - } - if c.Step1.EtcdSnapCount != 100000 { - t.Fatalf("unexpected %d", c.Step1.EtcdSnapCount) - } - if c.Step1.EtcdQuotaSizeBytes != 8000000000 { - t.Fatalf("unexpected %d", c.Step1.EtcdQuotaSizeBytes) - } - if c.Step1.ZookeeperSnapCount != 100000 { - t.Fatalf("unexpected %d", c.Step1.ZookeeperSnapCount) - } - if c.Step1.ZookeeperMaxClientCnxns != 5000 { - t.Fatalf("unexpected %d", c.Step1.ZookeeperMaxClientCnxns) - } - - if c.Step2.SkipStressDatabase { - t.Fatalf("unexpected %v", c.Step2.SkipStressDatabase) - } - if c.Step2.BenchType != "write" { - t.Fatalf("unexpected %s", c.Step2.BenchType) - } - if c.Step2.Clients != 1 { - t.Fatalf("unexpected %d", c.Step2.Clients) - } - if c.Step2.Connections != 1 { - t.Fatalf("unexpected %d", c.Step2.Connections) - } - if !reflect.DeepEqual(c.Step2.ConnectionsClients, []int{1, 3, 5, 10, 50, 100, 500, 700, 1000}) { - t.Fatalf("unexpected %d", c.Step2.ConnectionsClients) - } - if c.Step2.KeySize != 256 { - t.Fatalf("unexpected %d", c.Step2.KeySize) - } - if c.Step2.SameKey { - t.Fatalf("unexpected %v", c.Step2.SameKey) - } - if c.Step2.ValueSize != 1024 { - t.Fatalf("unexpected %d", c.Step2.ValueSize) - } - if !c.Step2.StaleRead { - t.Fatalf("unexpected %v", c.Step2.StaleRead) - } - if c.Step2.TotalRequests != 100000 { - t.Fatalf("unexpected %d", c.Step2.TotalRequests) - } - if c.Step2.RequestsPerSecond != 100 { - t.Fatalf("unexpected %d", c.Step2.RequestsPerSecond) - } - - if c.Step3.Action != "stop" { - t.Fatalf("unexpected %v", c.Step3.Action) - } - - if !c.Step4.UploadLogs { - t.Fatalf("unexpected %v", c.Step4.UploadLogs) - } - if c.Step4.GoogleCloudProjectName != "etcd-development" { - t.Fatalf("unexpected %s", c.Step4.GoogleCloudProjectName) - } - if c.Step4.GoogleCloudStorageKeyPath != "$HOME/gcloud-key.json" { - t.Fatalf("unexpected %s", c.Step4.GoogleCloudStorageKeyPath) - } - if c.Step4.GoogleCloudStorageBucketName != "dbtester-results" { - t.Fatalf("unexpected %s", c.Step4.GoogleCloudStorageBucketName) - } - if c.Step4.GoogleCloudStorageSubDirectory != "2017Q1-02-etcd-zookeeper-consul/01-write-1M-keys-client-variable" { - t.Fatalf("unexpected %s", c.Step4.GoogleCloudStorageSubDirectory) - } -} diff --git a/control/config_test.yaml b/control/config_test.yaml deleted file mode 100644 index fb60096f..00000000 --- a/control/config_test.yaml +++ /dev/null @@ -1,56 +0,0 @@ -database: etcdv3 -test_name: 01-etcdv3 - -peer_ips: - - 10.240.0.13 - - 10.240.0.14 - - 10.240.0.15 - -agent_port: 3500 -database_port: 2379 - -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, 3, 5, 10, 50, 100, 500, 700, 1000] - key_size: 256 - value_size: 1024 - total_requests: 100000 - requests_per_second: 100 - -# after benchmark -step3: - action: stop - -# upload logs -step4: - upload_logs: true - google_cloud_project_name: etcd-development - google_cloud_storage_key_path: $HOME/gcloud-key.json - 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/control/step1_start_database.go b/control/step1_start_database.go deleted file mode 100644 index 91d4137d..00000000 --- a/control/step1_start_database.go +++ /dev/null @@ -1,96 +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 control - -import ( - "context" - "time" - - "github.com/coreos/dbtester/agent/agentpb" - "google.golang.org/grpc" -) - -func bcastReq(cfg Config, op agentpb.Request_Operation) (map[int]agentpb.Response, error) { - req := cfg.ToRequest() - req.Operation = op - - type result struct { - idx int - r agentpb.Response - } - donec, errc := make(chan result), make(chan error) - for i := range cfg.PeerIPs { - go func(i int) { - if resp, err := sendReq(cfg.AgentEndpoints[i], req, i); err != nil { - errc <- err - } else { - donec <- result{idx: i, r: *resp} - } - }(i) - time.Sleep(time.Second) - } - - im := make(map[int]agentpb.Response) - - var errs []error - for cnt := 0; cnt != len(cfg.PeerIPs); cnt++ { - select { - case rs := <-donec: - im[rs.idx] = rs.r - case err := <-errc: - errs = append(errs, err) - } - } - if len(errs) > 0 { - return nil, errs[0] - } - - return im, nil -} - -func sendReq(ep string, req agentpb.Request, i int) (*agentpb.Response, error) { - req.ServerIndex = uint32(i) - req.ZookeeperMyID = uint32(i + 1) - - plog.Infof("sending message [index: %d | operation: %q | database: %q | endpoint: %q]", i, req.Operation, req.Database, ep) - - conn, err := grpc.Dial(ep, grpc.WithInsecure()) - if err != nil { - plog.Errorf("grpc.Dial connecting error (%v) [index: %d | endpoint: %q]", err, i, ep) - return nil, err - } - - defer conn.Close() - - cli := agentpb.NewTransporterClient(conn) - - // give enough timeout - // e.g. uploading logs takes longer - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - resp, err := cli.Transfer(ctx, &req) - cancel() - if err != nil { - plog.Errorf("cli.Transfer error (%v) [index: %d | endpoint: %q]", err, i, ep) - return nil, err - } - - plog.Infof("got response [index: %d | endpoint: %q | response: %+v]", i, ep, resp) - return resp, nil -} - -func step1StartDatabase(cfg Config) error { - _, err := bcastReq(cfg, agentpb.Request_Start) - return err -} diff --git a/control/step2_stress_client_conn.go b/control/step2_stress_client_conn.go deleted file mode 100644 index e460cd2b..00000000 --- a/control/step2_stress_client_conn.go +++ /dev/null @@ -1,234 +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 control - -import ( - "bufio" - "fmt" - "net" - "net/http" - "os" - "strconv" - "strings" - "time" - - clientv2 "github.com/coreos/etcd/client" - "github.com/coreos/etcd/clientv3" - consulapi "github.com/hashicorp/consul/api" - "github.com/samuel/go-zookeeper/zk" -) - -var ( - zkCreateFlags = int32(0) - zkCreateAcl = zk.WorldACL(zk.PermAll) -) - -type request struct { - etcdv2Op etcdv2Op - etcdv3Op clientv3.Op - zkOp zkOp - consulOp consulOp -} - -type etcdv2Op struct { - key string - value string -} - -type zkOp struct { - key string - value []byte - staleRead bool -} - -type consulOp struct { - key string - value []byte - staleRead bool -} - -var ( - // dialTotal counts the number of mustCreateConn calls so that endpoint - // connections can be handed out in round-robin order - dialTotal int -) - -func mustCreateConnEtcdv3(endpoints []string) *clientv3.Client { - endpoint := endpoints[dialTotal%len(endpoints)] - dialTotal++ - cfg := clientv3.Config{ - Endpoints: []string{endpoint}, - } - client, err := clientv3.New(cfg) - if err != nil { - fmt.Fprintf(os.Stderr, "dial error: %v\n", err) - os.Exit(1) - } - return client -} - -type etcdv3ClientCfg struct { - totalConns int - totalClients int -} - -func mustCreateClientsEtcdv3(endpoints []string, cfg etcdv3ClientCfg) []*clientv3.Client { - conns := make([]*clientv3.Client, cfg.totalConns) - for i := range conns { - conns[i] = mustCreateConnEtcdv3(endpoints) - } - - clients := make([]*clientv3.Client, cfg.totalClients) - for i := range clients { - clients[i] = conns[i%int(cfg.totalConns)] - } - return clients -} - -func mustCreateClientsEtcdv2(endpoints []string, total int) []clientv2.KeysAPI { - cks := make([]clientv2.KeysAPI, total) - for i := range cks { - endpoint := endpoints[dialTotal%len(endpoints)] - dialTotal++ - - if !strings.HasPrefix(endpoint, "http://") { - endpoint = "http://" + endpoint - } - - tr := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - } - cfg := clientv2.Config{ - Endpoints: []string{endpoint}, - Transport: tr, - HeaderTimeoutPerRequest: time.Second, - } - c, err := clientv2.New(cfg) - if err != nil { - plog.Fatal(err) - } - kapi := clientv2.NewKeysAPI(c) - - cks[i] = kapi - } - return cks -} - -func mustCreateConnsZk(endpoints []string, total int) []*zk.Conn { - zks := make([]*zk.Conn, total) - for i := range zks { - endpoint := endpoints[dialTotal%len(endpoints)] - dialTotal++ - conn, _, err := zk.Connect([]string{endpoint}, time.Second) - if err != nil { - plog.Fatal(err) - } - zks[i] = conn - } - return zks -} - -func mustCreateConnsConsul(endpoints []string, total int) []*consulapi.KV { - css := make([]*consulapi.KV, total) - for i := range css { - endpoint := endpoints[dialTotal%len(endpoints)] - dialTotal++ - - dcfg := consulapi.DefaultConfig() - dcfg.Address = endpoint // x.x.x.x:8500 - cli, err := consulapi.NewClient(dcfg) - if err != nil { - plog.Fatal(err) - } - - css[i] = cli.KV() - } - return css -} -func getTotalKeysEtcdv2(endpoints []string) map[string]int64 { - rs := make(map[string]int64) - for _, ep := range endpoints { - rs[ep] = 0 // not supported in metrics - } - return rs -} - -func getTotalKeysEtcdv3(endpoints []string) map[string]int64 { - rs := make(map[string]int64) - for _, ep := range endpoints { - if !strings.HasPrefix(ep, "http://") { - ep = "http://" + ep - } - - plog.Println("GET", ep+"/metrics") - resp, err := http.Get(ep + "/metrics") - if err != nil { - plog.Println(err) - rs[ep] = 0 - } - scanner := bufio.NewScanner(resp.Body) - for scanner.Scan() { - txt := scanner.Text() - if strings.HasPrefix(txt, "#") { - continue - } - ts := strings.SplitN(txt, " ", 2) - fv := 0.0 - if len(ts) == 2 { - v, err := strconv.ParseFloat(ts[1], 64) - if err == nil { - fv = v - } - } - if ts[0] == "etcd_debugging_mvcc_keys_total" { - rs[ep] = int64(fv) - break - } - } - gracefulClose(resp) - } - - plog.Println("getTotalKeysEtcdv3", rs) - return rs -} - -func getTotalKeysZk(endpoints []string) map[string]int64 { - rs := make(map[string]int64) - stats, ok := zk.FLWSrvr(endpoints, 5*time.Second) - if !ok { - plog.Printf("getTotalKeysZk failed with %+v", stats) - for _, ep := range endpoints { - rs[ep] = 0 - } - return rs - } - for i, s := range stats { - rs[endpoints[i]] = s.NodeCount - } - return rs -} - -func getTotalKeysConsul(endpoints []string) map[string]int64 { - rs := make(map[string]int64) - for _, ep := range endpoints { - rs[ep] = 0 // not supported in consul - } - return rs -} diff --git a/control/step3_data_size_summary.go b/control/step3_data_size_summary.go deleted file mode 100644 index ac1712bd..00000000 --- a/control/step3_data_size_summary.go +++ /dev/null @@ -1,57 +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 control - -import ( - "github.com/coreos/dbtester/agent/agentpb" - humanize "github.com/dustin/go-humanize" - "github.com/gyuho/dataframe" -) - -var DataSummaryColumns = []string{ - "INDEX", - "DATABASE-ENDPOINT", - "TOTAL-DATA-SIZE", - "TOTAL-DATA-SIZE-BYTES-NUM", -} - -func saveDatasizeSummary(cfg Config, idxToResponse map[int]agentpb.Response) { - c1 := dataframe.NewColumn(DataSummaryColumns[0]) - c2 := dataframe.NewColumn(DataSummaryColumns[1]) - c3 := dataframe.NewColumn(DataSummaryColumns[2]) - c4 := dataframe.NewColumn(DataSummaryColumns[3]) - for i := range cfg.DatabaseEndpoints { - c1.PushBack(dataframe.NewStringValue(i)) - c2.PushBack(dataframe.NewStringValue(cfg.DatabaseEndpoints[i])) - c3.PushBack(dataframe.NewStringValue(humanize.Bytes(uint64(idxToResponse[i].Datasize)))) - c4.PushBack(dataframe.NewStringValue(idxToResponse[i].Datasize)) - } - fr := dataframe.New() - if err := fr.AddColumn(c1); err != nil { - plog.Fatal(err) - } - if err := fr.AddColumn(c2); err != nil { - plog.Fatal(err) - } - if err := fr.AddColumn(c3); err != nil { - plog.Fatal(err) - } - if err := fr.AddColumn(c4); err != nil { - plog.Fatal(err) - } - if err := fr.CSV(cfg.DatasizeSummary); err != nil { - plog.Fatal(err) - } -} diff --git a/control/step3_stop_database.go b/control/step3_stop_database.go deleted file mode 100644 index 4c39b347..00000000 --- a/control/step3_stop_database.go +++ /dev/null @@ -1,43 +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 control - -import ( - "fmt" - "time" - - "github.com/coreos/dbtester/agent/agentpb" -) - -func step3StopDatabase(cfg Config) (map[int]agentpb.Response, error) { - switch cfg.Step3.Action { - case "stop": - plog.Info("step 3: stopping databases...") - var rm map[int]agentpb.Response - var err error - for i := 0; i < 5; i++ { - if rm, err = bcastReq(cfg, agentpb.Request_Stop); err != nil { - plog.Warningf("STOP failed at %s", cfg.PeerIPs[i]) - time.Sleep(300 * time.Millisecond) - continue - } - break - } - return rm, err - - default: - return nil, fmt.Errorf("unknown %q", cfg.Step3.Action) - } -} diff --git a/control/step4_upload_logs.go b/control/step4_upload_logs.go deleted file mode 100644 index a818cafb..00000000 --- a/control/step4_upload_logs.go +++ /dev/null @@ -1,85 +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 control - -import ( - "fmt" - "path/filepath" - "strings" - "time" - - "github.com/coreos/dbtester/pkg/remotestorage" -) - -func step4UploadLogs(cfg Config) error { - plog.Info("step 4: uploading logs...") - - if err := uploadToGoogle(cfg.Log, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DatasizeSummary, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DataLatencyDistributionSummary, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DataLatencyDistributionPercentile, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DataLatencyDistributionAll, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DataLatencyThroughputTimeseries, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.DataLatencyByKeyNumber, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.ClientSystemMetrics, cfg); err != nil { - return err - } - if err := uploadToGoogle(cfg.ClientSystemMetricsInterpolated, cfg); err != nil { - return err - } - return nil -} - -func uploadToGoogle(path string, cfg Config) error { - if !exist(path) { - return fmt.Errorf("%q does not exist", path) - } - u, err := remotestorage.NewGoogleCloudStorage([]byte(cfg.Step4.GoogleCloudStorageKey), cfg.Step4.GoogleCloudProjectName) - if err != nil { - return err - } - - srcPath := path - dstPath := filepath.Base(path) - if !strings.HasPrefix(dstPath, cfg.TestName) { - dstPath = fmt.Sprintf("%s-%s", cfg.TestName, dstPath) - } - dstPath = filepath.Join(cfg.Step4.GoogleCloudStorageSubDirectory, dstPath) - - var uerr error - for k := 0; k < 30; k++ { - if uerr = u.UploadFile(cfg.Step4.GoogleCloudStorageBucketName, srcPath, dstPath); uerr != nil { - plog.Printf("#%d: error %v while uploading %q", k, uerr, path) - time.Sleep(2 * time.Second) - continue - } - break - } - return uerr -} diff --git a/dbtesterpb/message.pb.go b/dbtesterpb/message.pb.go new file mode 100644 index 00000000..eb723e3f --- /dev/null +++ b/dbtesterpb/message.pb.go @@ -0,0 +1,1631 @@ +// Code generated by protoc-gen-gogo. +// source: dbtesterpb/message.proto +// DO NOT EDIT! + +/* + Package dbtesterpb is a generated protocol buffer package. + + It is generated from these files: + dbtesterpb/message.proto + + It has these top-level messages: + Request + Response +*/ +package dbtesterpb + +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=dbtesterpb.Request_Operation" json:"operation,omitempty"` + TriggerLogUpload bool `protobuf:"varint,2,opt,name=triggerLogUpload,proto3" json:"triggerLogUpload,omitempty"` + DatabaseID Request_Database `protobuf:"varint,3,opt,name=databaseID,proto3,enum=dbtesterpb.Request_Database" json:"databaseID,omitempty"` + DatabaseTag string `protobuf:"bytes,4,opt,name=databaseTag,proto3" json:"databaseTag,omitempty"` + PeerIPsString string `protobuf:"bytes,5,opt,name=peerIPsString,proto3" json:"peerIPsString,omitempty"` + IpIndex uint32 `protobuf:"varint,6,opt,name=ipIndex,proto3" json:"ipIndex,omitempty"` + CurrentClientNumber int64 `protobuf:"varint,7,opt,name=currentClientNumber,proto3" json:"currentClientNumber,omitempty"` + Control *Request_Control `protobuf:"bytes,8,opt,name=control" json:"control,omitempty"` + Etcdv3Config *Request_Etcdv3 `protobuf:"bytes,9,opt,name=etcdv3Config" json:"etcdv3Config,omitempty"` + ZookeeperConfig *Request_Zookeeper `protobuf:"bytes,10,opt,name=zookeeperConfig" json:"zookeeperConfig,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 Request_Control struct { + GoogleCloudProjectName string `protobuf:"bytes,1,opt,name=googleCloudProjectName,proto3" json:"googleCloudProjectName,omitempty"` + GoogleCloudStorageKey string `protobuf:"bytes,2,opt,name=googleCloudStorageKey,proto3" json:"googleCloudStorageKey,omitempty"` + GoogleCloudStorageBucketName string `protobuf:"bytes,3,opt,name=googleCloudStorageBucketName,proto3" json:"googleCloudStorageBucketName,omitempty"` + GoogleCloudStorageSubDirectory string `protobuf:"bytes,4,opt,name=googleCloudStorageSubDirectory,proto3" json:"googleCloudStorageSubDirectory,omitempty"` +} + +func (m *Request_Control) Reset() { *m = Request_Control{} } +func (m *Request_Control) String() string { return proto.CompactTextString(m) } +func (*Request_Control) ProtoMessage() {} +func (*Request_Control) Descriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0, 0} } + +type Request_Etcdv3 struct { + SnapCount int64 `protobuf:"varint,1,opt,name=snapCount,proto3" json:"snapCount,omitempty"` + QuotaSizeBytes int64 `protobuf:"varint,2,opt,name=quotaSizeBytes,proto3" json:"quotaSizeBytes,omitempty"` +} + +func (m *Request_Etcdv3) Reset() { *m = Request_Etcdv3{} } +func (m *Request_Etcdv3) String() string { return proto.CompactTextString(m) } +func (*Request_Etcdv3) ProtoMessage() {} +func (*Request_Etcdv3) Descriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0, 1} } + +type Request_Zookeeper struct { + MyID uint32 `protobuf:"varint,1,opt,name=myID,proto3" json:"myID,omitempty"` + TickTime int64 `protobuf:"varint,2,opt,name=tickTime,proto3" json:"tickTime,omitempty"` + ClientPort int64 `protobuf:"varint,3,opt,name=clientPort,proto3" json:"clientPort,omitempty"` + InitLimit int64 `protobuf:"varint,4,opt,name=initLimit,proto3" json:"initLimit,omitempty"` + SyncLimit int64 `protobuf:"varint,5,opt,name=syncLimit,proto3" json:"syncLimit,omitempty"` + SnapCount int64 `protobuf:"varint,6,opt,name=snapCount,proto3" json:"snapCount,omitempty"` + MaxClientConnections int64 `protobuf:"varint,7,opt,name=maxClientConnections,proto3" json:"maxClientConnections,omitempty"` +} + +func (m *Request_Zookeeper) Reset() { *m = Request_Zookeeper{} } +func (m *Request_Zookeeper) String() string { return proto.CompactTextString(m) } +func (*Request_Zookeeper) ProtoMessage() {} +func (*Request_Zookeeper) Descriptor() ([]byte, []int) { return fileDescriptorMessage, []int{0, 2} } + +type Response struct { + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + // DatasizeOnDisk is the data size of the database on disk. + // It measures after database is requested to stop. + DatasizeOnDisk int64 `protobuf:"varint,2,opt,name=datasizeOnDisk,proto3" json:"datasizeOnDisk,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), "dbtesterpb.Request") + proto.RegisterType((*Request_Control)(nil), "dbtesterpb.Request.Control") + proto.RegisterType((*Request_Etcdv3)(nil), "dbtesterpb.Request.Etcdv3") + proto.RegisterType((*Request_Zookeeper)(nil), "dbtesterpb.Request.Zookeeper") + proto.RegisterType((*Response)(nil), "dbtesterpb.Response") + proto.RegisterEnum("dbtesterpb.Request_Operation", Request_Operation_name, Request_Operation_value) + proto.RegisterEnum("dbtesterpb.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, "/dbtesterpb.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: "/dbtesterpb.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: "dbtesterpb.Transporter", + HandlerType: (*TransporterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Transfer", + Handler: _Transporter_Transfer_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "dbtesterpb/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.TriggerLogUpload { + dAtA[i] = 0x10 + i++ + if m.TriggerLogUpload { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.DatabaseID != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.DatabaseID)) + } + if len(m.DatabaseTag) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.DatabaseTag))) + i += copy(dAtA[i:], m.DatabaseTag) + } + if len(m.PeerIPsString) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.PeerIPsString))) + i += copy(dAtA[i:], m.PeerIPsString) + } + if m.IpIndex != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.IpIndex)) + } + if m.CurrentClientNumber != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.CurrentClientNumber)) + } + if m.Control != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.Control.Size())) + n1, err := m.Control.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.Etcdv3Config != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.Etcdv3Config.Size())) + n2, err := m.Etcdv3Config.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.ZookeeperConfig != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.ZookeeperConfig.Size())) + n3, err := m.ZookeeperConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + return i, nil +} + +func (m *Request_Control) 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_Control) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.GoogleCloudProjectName) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudProjectName))) + i += copy(dAtA[i:], m.GoogleCloudProjectName) + } + if len(m.GoogleCloudStorageKey) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageKey))) + i += copy(dAtA[i:], m.GoogleCloudStorageKey) + } + if len(m.GoogleCloudStorageBucketName) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageBucketName))) + i += copy(dAtA[i:], m.GoogleCloudStorageBucketName) + } + if len(m.GoogleCloudStorageSubDirectory) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessage(dAtA, i, uint64(len(m.GoogleCloudStorageSubDirectory))) + i += copy(dAtA[i:], m.GoogleCloudStorageSubDirectory) + } + return i, nil +} + +func (m *Request_Etcdv3) 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_Etcdv3) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.SnapCount != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.SnapCount)) + } + if m.QuotaSizeBytes != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.QuotaSizeBytes)) + } + return i, nil +} + +func (m *Request_Zookeeper) 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_Zookeeper) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.MyID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.MyID)) + } + if m.TickTime != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.TickTime)) + } + if m.ClientPort != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.ClientPort)) + } + if m.InitLimit != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.InitLimit)) + } + if m.SyncLimit != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.SyncLimit)) + } + if m.SnapCount != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.SnapCount)) + } + if m.MaxClientConnections != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.MaxClientConnections)) + } + 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.DatasizeOnDisk != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessage(dAtA, i, uint64(m.DatasizeOnDisk)) + } + 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.TriggerLogUpload { + n += 2 + } + if m.DatabaseID != 0 { + n += 1 + sovMessage(uint64(m.DatabaseID)) + } + l = len(m.DatabaseTag) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + l = len(m.PeerIPsString) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + if m.IpIndex != 0 { + n += 1 + sovMessage(uint64(m.IpIndex)) + } + if m.CurrentClientNumber != 0 { + n += 1 + sovMessage(uint64(m.CurrentClientNumber)) + } + if m.Control != nil { + l = m.Control.Size() + n += 1 + l + sovMessage(uint64(l)) + } + if m.Etcdv3Config != nil { + l = m.Etcdv3Config.Size() + n += 1 + l + sovMessage(uint64(l)) + } + if m.ZookeeperConfig != nil { + l = m.ZookeeperConfig.Size() + n += 1 + l + sovMessage(uint64(l)) + } + return n +} + +func (m *Request_Control) Size() (n int) { + var l int + _ = l + l = len(m.GoogleCloudProjectName) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + l = len(m.GoogleCloudStorageKey) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + l = len(m.GoogleCloudStorageBucketName) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + l = len(m.GoogleCloudStorageSubDirectory) + if l > 0 { + n += 1 + l + sovMessage(uint64(l)) + } + return n +} + +func (m *Request_Etcdv3) Size() (n int) { + var l int + _ = l + if m.SnapCount != 0 { + n += 1 + sovMessage(uint64(m.SnapCount)) + } + if m.QuotaSizeBytes != 0 { + n += 1 + sovMessage(uint64(m.QuotaSizeBytes)) + } + return n +} + +func (m *Request_Zookeeper) Size() (n int) { + var l int + _ = l + if m.MyID != 0 { + n += 1 + sovMessage(uint64(m.MyID)) + } + if m.TickTime != 0 { + n += 1 + sovMessage(uint64(m.TickTime)) + } + if m.ClientPort != 0 { + n += 1 + sovMessage(uint64(m.ClientPort)) + } + if m.InitLimit != 0 { + n += 1 + sovMessage(uint64(m.InitLimit)) + } + if m.SyncLimit != 0 { + n += 1 + sovMessage(uint64(m.SyncLimit)) + } + if m.SnapCount != 0 { + n += 1 + sovMessage(uint64(m.SnapCount)) + } + if m.MaxClientConnections != 0 { + n += 1 + sovMessage(uint64(m.MaxClientConnections)) + } + return n +} + +func (m *Response) Size() (n int) { + var l int + _ = l + if m.Success { + n += 2 + } + if m.DatasizeOnDisk != 0 { + n += 1 + sovMessage(uint64(m.DatasizeOnDisk)) + } + 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 TriggerLogUpload", 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.TriggerLogUpload = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseID", wireType) + } + m.DatabaseID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DatabaseID |= (Request_Database(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseTag", 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.DatabaseTag = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerIPsString", 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.PeerIPsString = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IpIndex", wireType) + } + m.IpIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.IpIndex |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentClientNumber", wireType) + } + m.CurrentClientNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentClientNumber |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Control", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessage + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Control == nil { + m.Control = &Request_Control{} + } + if err := m.Control.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Etcdv3Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessage + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Etcdv3Config == nil { + m.Etcdv3Config = &Request_Etcdv3{} + } + if err := m.Etcdv3Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ZookeeperConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessage + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ZookeeperConfig == nil { + m.ZookeeperConfig = &Request_Zookeeper{} + } + if err := m.ZookeeperConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + 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 *Request_Control) 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: Control: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Control: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + 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 2: + 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 3: + 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 4: + 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 *Request_Etcdv3) 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: Etcdv3: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Etcdv3: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapCount", wireType) + } + m.SnapCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SnapCount |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field QuotaSizeBytes", wireType) + } + m.QuotaSizeBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.QuotaSizeBytes |= (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 (m *Request_Zookeeper) 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: Zookeeper: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Zookeeper: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MyID", wireType) + } + m.MyID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MyID |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TickTime", wireType) + } + m.TickTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TickTime |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientPort", wireType) + } + m.ClientPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ClientPort |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InitLimit", wireType) + } + m.InitLimit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InitLimit |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SyncLimit", wireType) + } + m.SyncLimit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SyncLimit |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapCount", wireType) + } + m.SnapCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SnapCount |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxClientConnections", wireType) + } + m.MaxClientConnections = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxClientConnections |= (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 (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 DatasizeOnDisk", wireType) + } + m.DatasizeOnDisk = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DatasizeOnDisk |= (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("dbtesterpb/message.proto", fileDescriptorMessage) } + +var fileDescriptorMessage = []byte{ + // 742 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0x4f, 0x6f, 0xeb, 0x44, + 0x10, 0x8f, 0xeb, 0x36, 0xb1, 0xa7, 0xf4, 0x61, 0xed, 0x2b, 0xc8, 0x0a, 0x25, 0x8a, 0x22, 0x84, + 0x22, 0x24, 0x52, 0x94, 0xf2, 0xe7, 0x00, 0xe2, 0xd0, 0x84, 0x07, 0x15, 0x55, 0x5f, 0xb5, 0x29, + 0x17, 0x6e, 0x6b, 0x67, 0x6a, 0x96, 0xc6, 0xbb, 0x7e, 0xbb, 0x6b, 0xf4, 0x92, 0x2b, 0x5f, 0x82, + 0x8f, 0xd4, 0x03, 0x07, 0x3e, 0x02, 0x94, 0x13, 0xdf, 0x02, 0x79, 0x6d, 0xe7, 0x4f, 0x6b, 0x78, + 0xb7, 0x99, 0xdf, 0xef, 0x37, 0xb3, 0x3b, 0xb3, 0x33, 0x0b, 0xe1, 0x3c, 0x32, 0xa8, 0x0d, 0xaa, + 0x2c, 0x3a, 0x4d, 0x51, 0x6b, 0x96, 0xe0, 0x28, 0x53, 0xd2, 0x48, 0x02, 0x1b, 0xa6, 0xfb, 0x71, + 0xc2, 0xcd, 0x4f, 0x79, 0x34, 0x8a, 0x65, 0x7a, 0x9a, 0xc8, 0x44, 0x9e, 0x5a, 0x49, 0x94, 0xdf, + 0x5a, 0xcf, 0x3a, 0xd6, 0x2a, 0x43, 0x07, 0xbf, 0xfb, 0xd0, 0xa1, 0xf8, 0x2a, 0x47, 0x6d, 0xc8, + 0x97, 0xe0, 0xcb, 0x0c, 0x15, 0x33, 0x5c, 0x8a, 0xd0, 0xe9, 0x3b, 0xc3, 0x67, 0xe3, 0xf7, 0x47, + 0x9b, 0xd4, 0xa3, 0x4a, 0x37, 0x7a, 0x59, 0x8b, 0xe8, 0x46, 0x4f, 0x3e, 0x82, 0xc0, 0x28, 0x9e, + 0x24, 0xa8, 0x2e, 0x65, 0xf2, 0x43, 0xb6, 0x90, 0x6c, 0x1e, 0xee, 0xf5, 0x9d, 0xa1, 0x47, 0x9f, + 0xe0, 0xe4, 0x2b, 0x80, 0x39, 0x33, 0x2c, 0x62, 0x1a, 0x2f, 0xa6, 0xa1, 0x6b, 0x4f, 0x3a, 0x69, + 0x3a, 0x69, 0x5a, 0xa9, 0xe8, 0x96, 0x9e, 0xf4, 0xe1, 0xb0, 0xf6, 0x6e, 0x58, 0x12, 0xee, 0xf7, + 0x9d, 0xa1, 0x4f, 0xb7, 0x21, 0xf2, 0x01, 0x1c, 0x65, 0x88, 0xea, 0xe2, 0x5a, 0xcf, 0x8c, 0xe2, + 0x22, 0x09, 0x0f, 0xac, 0x66, 0x17, 0x24, 0x21, 0x74, 0x78, 0x76, 0x21, 0xe6, 0xf8, 0x3a, 0x6c, + 0xf7, 0x9d, 0xe1, 0x11, 0xad, 0x5d, 0xf2, 0x09, 0x3c, 0x8f, 0x73, 0xa5, 0x50, 0x98, 0xc9, 0x82, + 0xa3, 0x30, 0x57, 0x79, 0x1a, 0xa1, 0x0a, 0x3b, 0x7d, 0x67, 0xe8, 0xd2, 0x26, 0x8a, 0x7c, 0x06, + 0x9d, 0x58, 0x0a, 0xa3, 0xe4, 0x22, 0xf4, 0xfa, 0xce, 0xf0, 0x70, 0xfc, 0x5e, 0x53, 0x39, 0x93, + 0x52, 0x42, 0x6b, 0x2d, 0xf9, 0x1a, 0xde, 0x42, 0x13, 0xcf, 0x7f, 0x39, 0x9b, 0x48, 0x71, 0xcb, + 0x93, 0xd0, 0xb7, 0xb1, 0xdd, 0xa6, 0xd8, 0x6f, 0xac, 0x8e, 0xee, 0xe8, 0xc9, 0xb7, 0xf0, 0xf6, + 0x4a, 0xca, 0x3b, 0xc4, 0x0c, 0x55, 0x95, 0x02, 0x6c, 0x8a, 0xc6, 0x77, 0xfb, 0xb1, 0x96, 0xd2, + 0xc7, 0x51, 0xdd, 0x5f, 0xf7, 0xa0, 0x53, 0xdd, 0x8e, 0x7c, 0x0e, 0xef, 0x26, 0x52, 0x26, 0x0b, + 0x9c, 0x2c, 0x64, 0x3e, 0xbf, 0x56, 0xf2, 0x67, 0x8c, 0xcd, 0x15, 0x4b, 0xd1, 0xce, 0x84, 0x4f, + 0xff, 0x83, 0x25, 0x9f, 0xc2, 0x3b, 0x5b, 0xcc, 0xcc, 0x48, 0xc5, 0x12, 0xfc, 0x1e, 0x97, 0x76, + 0x0c, 0x7c, 0xda, 0x4c, 0x92, 0x73, 0x38, 0x79, 0x4a, 0x9c, 0xe7, 0xf1, 0x1d, 0x96, 0x67, 0xba, + 0x36, 0xf8, 0x7f, 0x35, 0xe4, 0x05, 0xf4, 0x9e, 0xf2, 0xb3, 0x3c, 0x9a, 0x72, 0x85, 0xb1, 0x91, + 0x6a, 0x59, 0x0d, 0xc9, 0x1b, 0x54, 0xdd, 0x2b, 0x68, 0x97, 0x6d, 0x26, 0x27, 0xe0, 0x6b, 0xc1, + 0xb2, 0x89, 0xcc, 0x85, 0xb1, 0x65, 0xbb, 0x74, 0x03, 0x90, 0x0f, 0xe1, 0xd9, 0xab, 0x5c, 0x1a, + 0x36, 0xe3, 0x2b, 0x3c, 0x5f, 0x1a, 0xd4, 0xb6, 0x44, 0x97, 0x3e, 0x42, 0xbb, 0xff, 0x38, 0xe0, + 0xaf, 0x9b, 0x4e, 0x08, 0xec, 0xa7, 0xcb, 0x8b, 0xa9, 0x4d, 0x77, 0x44, 0xad, 0x4d, 0xba, 0xe0, + 0x19, 0x1e, 0xdf, 0xdd, 0xf0, 0x14, 0xab, 0x1c, 0x6b, 0x9f, 0xf4, 0x00, 0x62, 0x3b, 0x63, 0xd7, + 0x52, 0x19, 0xdb, 0x07, 0x97, 0x6e, 0x21, 0xc5, 0x1d, 0xb9, 0xe0, 0xe6, 0x92, 0xa7, 0xdc, 0xd8, + 0x02, 0x5d, 0xba, 0x01, 0x6c, 0x05, 0x4b, 0x11, 0x97, 0xec, 0x41, 0x55, 0x41, 0x0d, 0xec, 0xd6, + 0xd7, 0x7e, 0x5c, 0xdf, 0x18, 0x8e, 0x53, 0xf6, 0xba, 0x1c, 0xf0, 0x89, 0x14, 0x02, 0xe3, 0x62, + 0xc5, 0x75, 0xb5, 0x00, 0x8d, 0xdc, 0xe0, 0x14, 0xfc, 0xf5, 0xbf, 0x40, 0x7c, 0x38, 0x98, 0x19, + 0xa6, 0x4c, 0xd0, 0x22, 0x1e, 0xec, 0xcf, 0x8c, 0xcc, 0x02, 0x87, 0x1c, 0x81, 0xff, 0x1d, 0x32, + 0x65, 0x22, 0x64, 0x26, 0xd8, 0x1b, 0xcc, 0xc0, 0xab, 0xd7, 0x9b, 0x00, 0xb4, 0xed, 0x5c, 0x8f, + 0x83, 0xd6, 0xda, 0x3e, 0x2b, 0x43, 0xd6, 0x93, 0x1a, 0xec, 0x15, 0x54, 0x2c, 0x85, 0xce, 0x17, + 0x81, 0x5b, 0x1c, 0xb1, 0x2a, 0x74, 0xc1, 0x7e, 0x61, 0xc6, 0xd6, 0x3c, 0x18, 0x5c, 0x82, 0x47, + 0x51, 0x67, 0x52, 0x68, 0x2c, 0xf6, 0x5b, 0xe7, 0x71, 0x8c, 0x5a, 0xdb, 0x96, 0x7b, 0xb4, 0x76, + 0x8b, 0xf7, 0x2b, 0xbe, 0x0b, 0xcd, 0x57, 0xf8, 0x52, 0x4c, 0xb9, 0xbe, 0xab, 0xdf, 0x6f, 0x17, + 0x1d, 0xbf, 0x80, 0xc3, 0x1b, 0xc5, 0x84, 0xce, 0xa4, 0x32, 0xa8, 0xc8, 0x17, 0xe0, 0x59, 0xf7, + 0x16, 0x15, 0x79, 0xde, 0xb0, 0x60, 0xdd, 0xe3, 0x5d, 0xb0, 0xbc, 0xc7, 0xa0, 0x75, 0x7e, 0x7c, + 0xff, 0x57, 0xaf, 0x75, 0xff, 0xd0, 0x73, 0xfe, 0x78, 0xe8, 0x39, 0x7f, 0x3e, 0xf4, 0x9c, 0xdf, + 0xfe, 0xee, 0xb5, 0xa2, 0xb6, 0xfd, 0x81, 0xcf, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x93, 0xb5, + 0x0d, 0x1a, 0xd8, 0x05, 0x00, 0x00, +} diff --git a/dbtesterpb/message.proto b/dbtesterpb/message.proto new file mode 100644 index 00000000..6ce003b5 --- /dev/null +++ b/dbtesterpb/message.proto @@ -0,0 +1,70 @@ +syntax = "proto3"; +package dbtesterpb; + +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; + } + message Control { + string googleCloudProjectName = 1; + string googleCloudStorageKey = 2; + string googleCloudStorageBucketName = 3; + string googleCloudStorageSubDirectory = 4; + } + message Etcdv3 { + int64 snapCount = 1; + int64 quotaSizeBytes = 2; + } + message Zookeeper { + uint32 myID = 1; + int64 tickTime = 2; + int64 clientPort = 3; + int64 initLimit = 4; + int64 syncLimit = 5; + int64 snapCount = 6; + int64 maxClientConnections = 7; + } + + Operation operation = 1; + bool triggerLogUpload = 2; + Database databaseID = 3; + string databaseTag = 4; + + string peerIPsString = 5; + uint32 ipIndex = 6; + + int64 currentClientNumber = 7; + + Control control = 8; + Etcdv3 etcdv3Config = 9; + Zookeeper zookeeperConfig = 10; +} + +message Response { + bool success = 1; + + // DatasizeOnDisk is the data size of the database on disk. + // It measures after database is requested to stop. + int64 datasizeOnDisk = 2; +} diff --git a/logger.go b/logger.go new file mode 100644 index 00000000..5ca32830 --- /dev/null +++ b/logger.go @@ -0,0 +1,19 @@ +// 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 dbtester + +import "github.com/coreos/pkg/capnslog" + +var plog = capnslog.NewPackageLogger("github.com/coreos/dbtester", "dbtester") diff --git a/readme.go b/readme.go new file mode 100644 index 00000000..811c1e48 --- /dev/null +++ b/readme.go @@ -0,0 +1,37 @@ +package dbtester + +import ( + "bytes" + "fmt" + "path/filepath" +) + +// WriteREADME writes README. +func (cfg *Config) WriteREADME(summary string) error { + plog.Printf("writing README at %q", cfg.README.OutputPath) + + buf := new(bytes.Buffer) + buf.WriteString("\n\n") + buf.WriteString(fmt.Sprintf("


\n##### %s", cfg.TestTitle)) + buf.WriteString("\n\n") + buf.WriteString(cfg.TestDescription) + buf.WriteString("\n\n```\n") + buf.WriteString(summary) + buf.WriteString("```\n\n\n") + + for _, img := range cfg.Images { + switch img.Type { + case "local": + imgPath := "./" + filepath.Base(img.Path) + buf.WriteString(fmt.Sprintf("![%s](%s)\n\n", img.Title, imgPath)) + case "remote": + buf.WriteString(fmt.Sprintf(`%s`, img.Path, img.Title)) + buf.WriteString("\n\n") + default: + return fmt.Errorf("%s is not supported", img.Type) + } + buf.WriteString("\n\n") + } + + return toFile(buf.String(), cfg.README.OutputPath) +} diff --git a/request.go b/request.go new file mode 100644 index 00000000..42e225c6 --- /dev/null +++ b/request.go @@ -0,0 +1,89 @@ +// 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 dbtester + +import ( + "context" + "fmt" + "time" + + "github.com/coreos/dbtester/dbtesterpb" + "google.golang.org/grpc" +) + +// BroadcaseRequest sends request to all endpoints. +func (cfg *Config) BroadcaseRequest(databaseID string, op dbtesterpb.Request_Operation) (map[int]dbtesterpb.Response, error) { + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + return nil, fmt.Errorf("database id %q does not exist", databaseID) + } + + type result struct { + idx int + r dbtesterpb.Response + } + donec, errc := make(chan result), make(chan error) + for i := range gcfg.AgentEndpoints { + req, err := cfg.ToRequest(databaseID, op, i) + if err != nil { + return nil, err + } + ep := gcfg.AgentEndpoints[i] + + go func(i int, ep string, req *dbtesterpb.Request) { + plog.Infof("sending message [index: %d | operation: %q | database: %q | endpoint: %q]", i, op, req.DatabaseID, ep) + + conn, err := grpc.Dial(ep, grpc.WithInsecure()) + if err != nil { + plog.Errorf("grpc.Dial connecting error (%v) [index: %d | endpoint: %q]", err, i, ep) + errc <- fmt.Errorf("%v (%q)", err, ep) + return + } + defer conn.Close() + + // give enough timeout + // e.g. uploading logs takes longer + cli := dbtesterpb.NewTransporterClient(conn) + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + resp, err := cli.Transfer(ctx, req) + cancel() + if err != nil { + plog.Errorf("cli.Transfer error (%v) [index: %d | endpoint: %q]", err, i, ep) + errc <- fmt.Errorf("%v (%q)", err, ep) + return + } + + plog.Infof("got response [index: %d | endpoint: %q | response: %+v]", i, ep, resp) + donec <- result{idx: i, r: *resp} + }(i, ep, req) + + time.Sleep(time.Second) + } + + im := make(map[int]dbtesterpb.Response) + var errs []error + for cnt := 0; cnt != len(gcfg.AgentEndpoints); cnt++ { + select { + case rs := <-donec: + im[rs.idx] = rs.r + case err := <-errc: + errs = append(errs, err) + } + } + if len(errs) > 0 { + return nil, errs[0] + } + return im, nil +} diff --git a/control/step2_stress_report.go b/save_upload.go similarity index 58% rename from control/step2_stress_report.go rename to save_upload.go index faafa525..464e889a 100644 --- a/control/step2_stress_report.go +++ b/save_upload.go @@ -12,146 +12,66 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "fmt" "math" + "path/filepath" "strings" - "sync" "time" - "github.com/cheggaaa/pb" + "github.com/coreos/dbtester/dbtesterpb" + "github.com/coreos/dbtester/pkg/remotestorage" "github.com/coreos/dbtester/pkg/report" + humanize "github.com/dustin/go-humanize" "github.com/gyuho/dataframe" - "golang.org/x/net/context" ) -type values struct { - bytes [][]byte - strings []string - sampleSize int +// DatasizeOnDiskSummaryColumns defines summary columns. +var DatasizeOnDiskSummaryColumns = []string{ + "INDEX", + "DATABASE-ENDPOINT", + "TOTAL-DATA-SIZE", + "TOTAL-DATA-SIZE-BYTES-NUM", } -func newValues(cfg Config) (v values, rerr error) { - v.bytes = [][]byte{randBytes(cfg.Step2.ValueSize)} - v.strings = []string{string(v.bytes[0])} - v.sampleSize = 1 - return -} - -type benchmark struct { - bar *pb.ProgressBar - report report.Report - reportDone <-chan report.Stats - stats report.Stats - - reqHandlers []ReqHandler - reqGen func(chan<- request) - reqDone func() - wg sync.WaitGroup - - mu sync.RWMutex - inflightReqs chan request -} - -// pass totalN in case that 'cfg' is manipulated -func newBenchmark(totalN int, clientsN int, reqHandlers []ReqHandler, reqDone func(), reqGen func(chan<- request)) (b *benchmark) { - b = &benchmark{ - bar: pb.New(totalN), - reqHandlers: reqHandlers, - reqGen: reqGen, - reqDone: reqDone, - wg: sync.WaitGroup{}, +// SaveDatasizeOnDiskSummary saves data size summary. +func (cfg *Config) SaveDatasizeOnDiskSummary(databaseID string, idxToResponse map[int]dbtesterpb.Response) error { + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + return fmt.Errorf("%q does not exist", databaseID) } - b.inflightReqs = make(chan request, clientsN) - b.bar.Format("Bom !") - b.bar.Start() - b.report = report.NewReportSample("%4.4f") - return -} - -// only useful when multiple ranges of requests are run with one report -func (b *benchmark) reset(clientsN int, reqHandlers []ReqHandler, reqDone func(), reqGen func(chan<- request)) { - if len(reqHandlers) == 0 { - panic(fmt.Errorf("got 0 reqHandlers")) + c1 := dataframe.NewColumn(DatasizeOnDiskSummaryColumns[0]) + c2 := dataframe.NewColumn(DatasizeOnDiskSummaryColumns[1]) + c3 := dataframe.NewColumn(DatasizeOnDiskSummaryColumns[2]) + c4 := dataframe.NewColumn(DatasizeOnDiskSummaryColumns[3]) + for i := range gcfg.DatabaseEndpoints { + c1.PushBack(dataframe.NewStringValue(i)) + c2.PushBack(dataframe.NewStringValue(gcfg.DatabaseEndpoints[i])) + c3.PushBack(dataframe.NewStringValue(humanize.Bytes(uint64(idxToResponse[i].DatasizeOnDisk)))) + c4.PushBack(dataframe.NewStringValue(idxToResponse[i].DatasizeOnDisk)) } - b.reqHandlers = reqHandlers - b.reqDone = reqDone - b.reqGen = reqGen - // inflight requests will be dropped! - b.mu.Lock() - b.inflightReqs = make(chan request, clientsN) - b.mu.Unlock() -} - -func (b *benchmark) getInflightsReqs() (ch chan request) { - b.mu.RLock() - ch = b.inflightReqs - b.mu.RUnlock() - return -} - -func (b *benchmark) startRequests() { - for i := range b.reqHandlers { - b.wg.Add(1) - go func(rh ReqHandler) { - defer b.wg.Done() - for req := range b.getInflightsReqs() { - if rh == nil { - panic(fmt.Errorf("got nil rh")) - } - st := time.Now() - err := rh(context.Background(), &req) - b.report.Results() <- report.Result{Err: err, Start: st, End: time.Now()} - b.bar.Increment() - } - }(b.reqHandlers[i]) + fr := dataframe.New() + if err := fr.AddColumn(c1); err != nil { + return err } - go b.reqGen(b.getInflightsReqs()) - b.reportDone = b.report.Stats() -} - -func (b *benchmark) waitRequestsEnd() { - b.wg.Wait() - if b.reqDone != nil { - b.reqDone() // cancel connections + if err := fr.AddColumn(c2); err != nil { + return err } -} - -func (b *benchmark) finishReports() { - close(b.report.Results()) - b.bar.Finish() - st := <-b.reportDone - b.stats = st -} - -func (b *benchmark) waitAll() { - b.waitRequestsEnd() - b.finishReports() -} - -func printStats(st report.Stats) { - // to be piped to cfg.Log via stdout when dbtester executed - if len(st.Lats) > 0 { - fmt.Printf("Total: %v\n", st.Total) - fmt.Printf("Slowest: %f secs\n", st.Slowest) - fmt.Printf("Fastest: %f secs\n", st.Fastest) - fmt.Printf("Average: %f secs\n", st.Average) - fmt.Printf("Requests/sec: %4.4f\n", st.RPS) + if err := fr.AddColumn(c3); err != nil { + return err } - if len(st.ErrorDist) > 0 { - for k, v := range st.ErrorDist { - fmt.Printf("ERROR %q : %d\n", k, v) - } - } else { - fmt.Println("ERRRO: 0") + if err := fr.AddColumn(c4); err != nil { + return err } + + return fr.CSV(cfg.Control.ServerDatasizeOnDiskSummaryPath) } -func saveDataLatencyDistributionSummary(cfg Config, st report.Stats) { +func (cfg *Config) saveDataLatencyDistributionSummary(st report.Stats) { fr := dataframe.New() c1 := dataframe.NewColumn("TOTAL-SECONDS") @@ -206,12 +126,12 @@ func saveDataLatencyDistributionSummary(cfg Config, st report.Stats) { } } - if err := fr.CSVHorizontal(cfg.DataLatencyDistributionSummary); err != nil { + if err := fr.CSVHorizontal(cfg.Control.ClientLatencyDistributionSummaryPath); err != nil { plog.Fatal(err) } } -func saveDataLatencyDistributionPercentile(cfg Config, st report.Stats) { +func (cfg *Config) saveDataLatencyDistributionPercentile(st report.Stats) { pctls, seconds := report.Percentiles(st.Lats) c1 := dataframe.NewColumn("LATENCY-PERCENTILE") c2 := dataframe.NewColumn("LATENCY-MS") @@ -232,12 +152,12 @@ func saveDataLatencyDistributionPercentile(cfg Config, st report.Stats) { if err := fr.AddColumn(c2); err != nil { plog.Fatal(err) } - if err := fr.CSV(cfg.DataLatencyDistributionPercentile); err != nil { + if err := fr.CSV(cfg.Control.ClientLatencyDistributionPercentilePath); err != nil { plog.Fatal(err) } } -func saveDataLatencyDistributionAll(cfg Config, st report.Stats) { +func (cfg *Config) saveDataLatencyDistributionAll(st report.Stats) { min := int64(math.MaxInt64) max := int64(-100000) rm := make(map[int64]int64) @@ -285,12 +205,12 @@ func saveDataLatencyDistributionAll(cfg Config, st report.Stats) { if err := fr.AddColumn(c2); err != nil { plog.Fatal(err) } - if err := fr.CSV(cfg.DataLatencyDistributionAll); err != nil { + if err := fr.CSV(cfg.Control.ClientLatencyDistributionAllPath); err != nil { plog.Fatal(err) } } -func saveDataLatencyThroughputTimeseries(cfg Config, st report.Stats, tsToClientN map[int64]int) { +func (cfg *Config) saveDataLatencyThroughputTimeseries(gcfg TestGroup, st report.Stats, tsToClientN map[int64]int64) { c1 := dataframe.NewColumn("UNIX-SECOND") c2 := dataframe.NewColumn("CONTROL-CLIENT-NUM") c3 := dataframe.NewColumn("MIN-LATENCY-MS") @@ -302,7 +222,7 @@ func saveDataLatencyThroughputTimeseries(cfg Config, st report.Stats, tsToClient c1.PushBack(dataframe.NewStringValue(fmt.Sprintf("%d", st.TimeSeries[i].Timestamp))) if len(tsToClientN) == 0 { - c2.PushBack(dataframe.NewStringValue(fmt.Sprintf("%d", cfg.Step2.Clients))) + c2.PushBack(dataframe.NewStringValue(fmt.Sprintf("%d", gcfg.ClientNumber))) } else { c2.PushBack(dataframe.NewStringValue(fmt.Sprintf("%d", tsToClientN[st.TimeSeries[i].Timestamp]))) } @@ -334,12 +254,12 @@ func saveDataLatencyThroughputTimeseries(cfg Config, st report.Stats, tsToClient plog.Fatal(err) } - if err := fr.CSV(cfg.DataLatencyThroughputTimeseries); err != nil { + if err := fr.CSV(cfg.Control.ClientLatencyThroughputTimeseriesPath); err != nil { plog.Fatal(err) } // aggregate latency by the number of keys - tss := processTimeSeries(st.TimeSeries, 1000, cfg.Step2.TotalRequests) + tss := processTimeSeries(st.TimeSeries, 1000, gcfg.RequestNumber) ctt1 := dataframe.NewColumn("KEYS") ctt2 := dataframe.NewColumn("MIN-LATENCY-MS") ctt3 := dataframe.NewColumn("AVG-LATENCY-MS") @@ -365,30 +285,47 @@ func saveDataLatencyThroughputTimeseries(cfg Config, st report.Stats, tsToClient plog.Fatal(err) } - if err := frr.CSV(cfg.DataLatencyByKeyNumber); err != nil { + if err := frr.CSV(cfg.Control.ClientLatencyByKeyNumberPath); err != nil { plog.Fatal(err) } } -func generateReport(cfg Config, h []ReqHandler, reqDone func(), reqGen func(chan<- request)) { - b := newBenchmark(cfg.Step2.TotalRequests, cfg.Step2.Clients, h, reqDone, reqGen) - b.startRequests() - b.waitAll() - - printStats(b.stats) - saveAllStats(cfg, b.stats, nil) +func (cfg *Config) saveAllStats(gcfg TestGroup, stats report.Stats, tsToClientN map[int64]int64) { + cfg.saveDataLatencyDistributionSummary(stats) + cfg.saveDataLatencyDistributionPercentile(stats) + cfg.saveDataLatencyDistributionAll(stats) + cfg.saveDataLatencyThroughputTimeseries(gcfg, stats, tsToClientN) } -func saveAllStats(cfg Config, stats report.Stats, tsToClientN map[int64]int) { - // cfg.DataLatencyDistributionSummary - saveDataLatencyDistributionSummary(cfg, stats) +// UploadToGoogle uploads target file to Google Cloud Storage. +func (cfg *Config) UploadToGoogle(databaseID string, targetPath string) error { + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + return fmt.Errorf("%q does not exist", databaseID) + } + if !exist(targetPath) { + return fmt.Errorf("%q does not exist", targetPath) + } + u, err := remotestorage.NewGoogleCloudStorage([]byte(cfg.Control.GoogleCloudStorageKey), cfg.Control.GoogleCloudProjectName) + if err != nil { + return err + } - // cfg.DataLatencyDistributionPercentile - saveDataLatencyDistributionPercentile(cfg, stats) + srcPath := targetPath + dstPath := filepath.Base(targetPath) + if !strings.HasPrefix(dstPath, gcfg.DatabaseTag) { + dstPath = fmt.Sprintf("%s-%s", gcfg.DatabaseTag, dstPath) + } + dstPath = filepath.Join(cfg.Control.GoogleCloudStorageSubDirectory, dstPath) - // cfg.DataLatencyDistributionAll - saveDataLatencyDistributionAll(cfg, stats) - - // cfg.DataLatencyThroughputTimeseries - saveDataLatencyThroughputTimeseries(cfg, stats, tsToClientN) + var uerr error + for k := 0; k < 30; k++ { + if uerr = u.UploadFile(cfg.Control.GoogleCloudStorageBucketName, srcPath, dstPath); uerr != nil { + plog.Printf("#%d: error %v while uploading %q", k, uerr, targetPath) + time.Sleep(2 * time.Second) + continue + } + break + } + return uerr } diff --git a/scripts/genproto.sh b/scripts/genproto.sh index 2e508001..9c14db4a 100755 --- a/scripts/genproto.sh +++ b/scripts/genproto.sh @@ -25,4 +25,4 @@ popd printf "Generating agent\n" protoc --gofast_out=plugins=grpc:. \ --proto_path=$GOPATH/src:$GOPATH/src/github.com/gogo/protobuf/protobuf:. \ - agent/agentpb/*.proto; + dbtesterpb/*.proto; diff --git a/scripts/tests.sh b/scripts/tests.sh index ca63b40d..c2df4546 100755 --- a/scripts/tests.sh +++ b/scripts/tests.sh @@ -5,9 +5,8 @@ if ! [[ "$0" =~ "scripts/tests.sh" ]]; then echo "must be run from repository root" exit 255 fi - -IGNORE_PKGS="(agent|vendor|remotestorage)" -TESTS=`find . -name \*_test.go | while read a; do dirname $a; done | sort | uniq | egrep -v "$IGNORE_PKGS"` +gofmt -l -s -d *.go +TESTS="./analyze ./pkg/fileinspect ./pkg/netutil ./pkg/ntp ./pkg/report ./pkg/types" echo "Checking gofmt..." fmtRes=$(gofmt -l -s -d $TESTS) @@ -15,6 +14,7 @@ if [ -n "${fmtRes}" ]; then echo -e "gofmt checking failed:\n${fmtRes}" exit 255 fi + echo "Checking govet..." vetRes=$(go vet $TESTS 2>&1 >/dev/null) if [ -n "${vetRes}" ]; then diff --git a/control/step2_stress.go b/stress.go similarity index 60% rename from control/step2_stress.go rename to stress.go index f0a29871..5b09da3e 100644 --- a/control/step2_stress.go +++ b/stress.go @@ -12,16 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( + "fmt" "math" "os" "sort" "sync" "time" - "github.com/coreos/dbtester/agent/agentpb" + "github.com/coreos/dbtester/dbtesterpb" "github.com/coreos/dbtester/pkg/report" "github.com/coreos/etcd/clientv3" consulapi "github.com/hashicorp/consul/api" @@ -29,44 +30,52 @@ import ( "golang.org/x/time/rate" ) -func step2StressDatabase(cfg Config) error { - vals, err := newValues(cfg) +// Stress stresses the database. +func (cfg *Config) Stress(databaseID string) error { + gcfg, ok := cfg.DatabaseIDToTestGroup[databaseID] + if !ok { + return fmt.Errorf("%q does not exist", databaseID) + } + + vals, err := newValues(gcfg) if err != nil { return err } - switch cfg.Step2.BenchType { + switch gcfg.BenchmarkOptions.Type { case "write": plog.Println("write generateReport is started...") // fixed number of client numbers - if len(cfg.Step2.ConnectionsClients) == 0 { - h, done := newWriteHandlers(cfg) - reqGen := func(inflightReqs chan<- request) { generateWrites(cfg, 0, vals, inflightReqs) } - generateReport(cfg, h, done, reqGen) + if len(gcfg.BenchmarkOptions.ConnectionClientNumbers) == 0 { + h, done := newWriteHandlers(gcfg) + reqGen := func(inflightReqs chan<- request) { generateWrites(gcfg, 0, vals, inflightReqs) } + cfg.generateReport(gcfg, h, done, reqGen) } else { // variable client numbers - rs := assignRequest(cfg.Step2.ConnectionsClients, cfg.Step2.TotalRequests) + rs := assignRequest(gcfg.BenchmarkOptions.ConnectionClientNumbers, gcfg.BenchmarkOptions.RequestNumber) var stats []report.Stats - reqCompleted := 0 + reqCompleted := int64(0) for i := 0; i < len(rs); i++ { - copied := cfg - copied.Step2.Connections = cfg.Step2.ConnectionsClients[i] - copied.Step2.Clients = cfg.Step2.ConnectionsClients[i] - copied.Step2.TotalRequests = rs[i] + copied := gcfg + copied.BenchmarkOptions.ConnectionNumber = gcfg.BenchmarkOptions.ConnectionClientNumbers[i] + copied.BenchmarkOptions.ClientNumber = gcfg.BenchmarkOptions.ConnectionClientNumbers[i] + copied.BenchmarkOptions.RequestNumber = rs[i] + ncfg := *cfg + ncfg.DatabaseIDToTestGroup[databaseID] = copied go func() { - plog.Infof("signaling agent with client number %d", copied.Step2.Clients) - if _, err := bcastReq(copied, agentpb.Request_Heartbeat); err != nil { + plog.Infof("signaling agent with client number %d", copied.BenchmarkOptions.ClientNumber) + if _, err := (&ncfg).BroadcaseRequest(databaseID, dbtesterpb.Request_Heartbeat); err != nil { plog.Panic(err) } }() h, done := newWriteHandlers(copied) reqGen := func(inflightReqs chan<- request) { generateWrites(copied, reqCompleted, vals, inflightReqs) } - b := newBenchmark(copied.Step2.TotalRequests, copied.Step2.Clients, h, done, reqGen) + b := newBenchmark(copied.BenchmarkOptions.RequestNumber, copied.BenchmarkOptions.ClientNumber, h, done, reqGen) // wait until rs[i] requests are finished // do not end reports yet @@ -83,7 +92,7 @@ func step2StressDatabase(cfg Config) error { } plog.Info("combining all reports") - tsToClientN := make(map[int64]int, cfg.Step2.TotalRequests) + tsToClientN := make(map[int64]int64, gcfg.BenchmarkOptions.RequestNumber) combined := report.Stats{ErrorDist: make(map[string]int)} for i, st := range stats { combined.AvgTotal += st.AvgTotal @@ -91,7 +100,7 @@ func step2StressDatabase(cfg Config) error { combined.Lats = append(combined.Lats, st.Lats...) combined.TimeSeries = append(combined.TimeSeries, st.TimeSeries...) - clientsN := cfg.Step2.ConnectionsClients[i] + clientsN := gcfg.BenchmarkOptions.ConnectionClientNumbers[i] for _, v := range st.TimeSeries { tsToClientN[v.Timestamp] = clientsN } @@ -123,14 +132,14 @@ func step2StressDatabase(cfg Config) error { plog.Info("combined all reports") printStats(combined) - saveAllStats(cfg, combined, tsToClientN) + cfg.saveAllStats(gcfg, combined, tsToClientN) } plog.Println("write generateReport is finished...") - plog.Println("checking total keys on", cfg.DatabaseEndpoints) + plog.Println("checking total keys on", gcfg.DatabaseEndpoints) var totalKeysFunc func([]string) map[string]int64 - switch cfg.Database { + switch gcfg.DatabaseID { case "etcdv2": totalKeysFunc = getTotalKeysEtcdv2 case "etcdv3": @@ -140,37 +149,37 @@ func step2StressDatabase(cfg Config) error { case "consul", "cetcd": totalKeysFunc = getTotalKeysConsul } - for k, v := range totalKeysFunc(cfg.DatabaseEndpoints) { + for k, v := range totalKeysFunc(gcfg.DatabaseEndpoints) { plog.Infof("expected write total results [expected_total: %d | database: %q | endpoint: %q | number_of_keys: %d]", - cfg.Step2.TotalRequests, cfg.Database, k, v) + gcfg.BenchmarkOptions.RequestNumber, gcfg.DatabaseID, k, v) } case "read": - key, value := sameKey(cfg.Step2.KeySize), vals.strings[0] + key, value := sameKey(gcfg.BenchmarkOptions.KeySizeBytes), vals.strings[0] - switch cfg.Database { + switch gcfg.DatabaseID { case "etcdv2": - plog.Infof("write started [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write started [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) var err error for i := 0; i < 7; i++ { - clients := mustCreateClientsEtcdv2(cfg.DatabaseEndpoints, cfg.Step2.Connections) + clients := mustCreateClientsEtcdv2(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) _, err = clients[0].Set(context.Background(), key, value, nil) if err != nil { continue } - plog.Infof("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) break } if err != nil { - plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) os.Exit(1) } case "etcdv3": - plog.Infof("write started [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write started [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) var err error for i := 0; i < 7; i++ { - clients := mustCreateClientsEtcdv3(cfg.DatabaseEndpoints, etcdv3ClientCfg{ + clients := mustCreateClientsEtcdv3(gcfg.DatabaseEndpoints, etcdv3ClientCfg{ totalConns: 1, totalClients: 1, }) @@ -178,68 +187,68 @@ func step2StressDatabase(cfg Config) error { if err != nil { continue } - plog.Infof("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) break } if err != nil { - plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) os.Exit(1) } case "zookeeper", "zetcd": - plog.Infof("write started [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write started [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) var err error for i := 0; i < 7; i++ { - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, cfg.Step2.Connections) - _, err = conns[0].Create("/"+key, vals.bytes[0], zkCreateFlags, zkCreateAcl) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) + _, err = conns[0].Create("/"+key, vals.bytes[0], zkCreateFlags, zkCreateACL) if err != nil { continue } for j := range conns { conns[j].Close() } - plog.Infof("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) break } if err != nil { - plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) os.Exit(1) } case "consul", "cetcd": - plog.Infof("write started [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write started [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) var err error for i := 0; i < 7; i++ { - clients := mustCreateConnsConsul(cfg.DatabaseEndpoints, cfg.Step2.Connections) + clients := mustCreateConnsConsul(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) _, err = clients[0].Put(&consulapi.KVPair{Key: key, Value: vals.bytes[0]}, nil) if err != nil { continue } - plog.Infof("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) break } if err != nil { - plog.Errorf("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Errorf("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) os.Exit(1) } } - h, done := newReadHandlers(cfg) - reqGen := func(inflightReqs chan<- request) { generateReads(cfg, key, inflightReqs) } - generateReport(cfg, h, done, reqGen) + h, done := newReadHandlers(gcfg) + reqGen := func(inflightReqs chan<- request) { generateReads(gcfg, key, inflightReqs) } + cfg.generateReport(gcfg, h, done, reqGen) plog.Println("read generateReport is finished...") case "read-oneshot": - key, value := sameKey(cfg.Step2.KeySize), vals.strings[0] - plog.Infof("writing key for read-oneshot [key: %q | database: %q]", key, cfg.Database) + key, value := sameKey(gcfg.BenchmarkOptions.KeySizeBytes), vals.strings[0] + plog.Infof("writing key for read-oneshot [key: %q | database: %q]", key, gcfg.DatabaseID) var err error - switch cfg.Database { + switch gcfg.DatabaseID { case "etcdv2": - clients := mustCreateClientsEtcdv2(cfg.DatabaseEndpoints, 1) + clients := mustCreateClientsEtcdv2(gcfg.DatabaseEndpoints, 1) _, err = clients[0].Set(context.Background(), key, value, nil) case "etcdv3": - clients := mustCreateClientsEtcdv3(cfg.DatabaseEndpoints, etcdv3ClientCfg{ + clients := mustCreateClientsEtcdv3(gcfg.DatabaseEndpoints, etcdv3ClientCfg{ totalConns: 1, totalClients: 1, }) @@ -247,12 +256,12 @@ func step2StressDatabase(cfg Config) error { clients[0].Close() case "zookeeper", "zetcd": - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, 1) - _, err = conns[0].Create("/"+key, vals.bytes[0], zkCreateFlags, zkCreateAcl) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, 1) + _, err = conns[0].Create("/"+key, vals.bytes[0], zkCreateFlags, zkCreateACL) conns[0].Close() case "consul", "cetcd": - clients := mustCreateConnsConsul(cfg.DatabaseEndpoints, 1) + clients := mustCreateConnsConsul(gcfg.DatabaseEndpoints, 1) _, err = clients[0].Put(&consulapi.KVPair{Key: key, Value: vals.bytes[0]}, nil) } if err != nil { @@ -260,27 +269,27 @@ func step2StressDatabase(cfg Config) error { os.Exit(1) } - h := newReadOneshotHandlers(cfg) - reqGen := func(inflightReqs chan<- request) { generateReads(cfg, key, inflightReqs) } - generateReport(cfg, h, nil, reqGen) + h := newReadOneshotHandlers(gcfg) + reqGen := func(inflightReqs chan<- request) { generateReads(gcfg, key, inflightReqs) } + cfg.generateReport(gcfg, h, nil, reqGen) plog.Println("read-oneshot generateReport is finished...") } return nil } -func newReadHandlers(cfg Config) (rhs []ReqHandler, done func()) { - rhs = make([]ReqHandler, cfg.Step2.Clients) - switch cfg.Database { +func newReadHandlers(gcfg TestGroup) (rhs []ReqHandler, done func()) { + rhs = make([]ReqHandler, gcfg.BenchmarkOptions.ClientNumber) + switch gcfg.DatabaseID { case "etcdv2": - conns := mustCreateClientsEtcdv2(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateClientsEtcdv2(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { rhs[i] = newGetEtcd2(conns[i]) } case "etcdv3": - clients := mustCreateClientsEtcdv3(cfg.DatabaseEndpoints, etcdv3ClientCfg{ - totalConns: cfg.Step2.Connections, - totalClients: cfg.Step2.Clients, + clients := mustCreateClientsEtcdv3(gcfg.DatabaseEndpoints, etcdv3ClientCfg{ + totalConns: gcfg.BenchmarkOptions.ConnectionNumber, + totalClients: gcfg.BenchmarkOptions.ClientNumber, }) for i := range clients { rhs[i] = newGetEtcd3(clients[i].KV) @@ -291,7 +300,7 @@ func newReadHandlers(cfg Config) (rhs []ReqHandler, done func()) { } } case "zookeeper", "zetcd": - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { rhs[i] = newGetZK(conns[i]) } @@ -301,7 +310,7 @@ func newReadHandlers(cfg Config) (rhs []ReqHandler, done func()) { } } case "consul", "cetcd": - conns := mustCreateConnsConsul(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateConnsConsul(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { rhs[i] = newGetConsul(conns[i]) } @@ -309,18 +318,18 @@ func newReadHandlers(cfg Config) (rhs []ReqHandler, done func()) { return rhs, done } -func newWriteHandlers(cfg Config) (rhs []ReqHandler, done func()) { - rhs = make([]ReqHandler, cfg.Step2.Clients) - switch cfg.Database { +func newWriteHandlers(gcfg TestGroup) (rhs []ReqHandler, done func()) { + rhs = make([]ReqHandler, gcfg.BenchmarkOptions.ClientNumber) + switch gcfg.DatabaseID { case "etcdv2": - conns := mustCreateClientsEtcdv2(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateClientsEtcdv2(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { rhs[i] = newPutEtcd2(conns[i]) } case "etcdv3": - etcdClients := mustCreateClientsEtcdv3(cfg.DatabaseEndpoints, etcdv3ClientCfg{ - totalConns: cfg.Step2.Connections, - totalClients: cfg.Step2.Clients, + etcdClients := mustCreateClientsEtcdv3(gcfg.DatabaseEndpoints, etcdv3ClientCfg{ + totalConns: gcfg.BenchmarkOptions.ConnectionNumber, + totalClients: gcfg.BenchmarkOptions.ClientNumber, }) for i := range etcdClients { rhs[i] = newPutEtcd3(etcdClients[i]) @@ -331,32 +340,32 @@ func newWriteHandlers(cfg Config) (rhs []ReqHandler, done func()) { } } case "zookeeper", "zetcd": - if cfg.Step2.SameKey { - key := sameKey(cfg.Step2.KeySize) - valueBts := randBytes(cfg.Step2.ValueSize) - plog.Infof("write started [request: PUT | key: %q | database: %q]", key, cfg.Database) + if gcfg.BenchmarkOptions.SameKey { + key := sameKey(gcfg.BenchmarkOptions.KeySizeBytes) + valueBts := randBytes(gcfg.BenchmarkOptions.ValueSizeBytes) + plog.Infof("write started [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) var err error for i := 0; i < 7; i++ { - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, cfg.Step2.Connections) - _, err = conns[0].Create("/"+key, valueBts, zkCreateFlags, zkCreateAcl) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) + _, err = conns[0].Create("/"+key, valueBts, zkCreateFlags, zkCreateACL) if err != nil { continue } for j := range conns { conns[j].Close() } - plog.Infof("write done [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Infof("write done [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) break } if err != nil { - plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, cfg.Database) + plog.Errorf("write error [request: PUT | key: %q | database: %q]", key, gcfg.DatabaseID) os.Exit(1) } } - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { - if cfg.Step2.SameKey { + if gcfg.BenchmarkOptions.SameKey { rhs[i] = newPutOverwriteZK(conns[i]) } else { rhs[i] = newPutCreateZK(conns[i]) @@ -368,7 +377,7 @@ func newWriteHandlers(cfg Config) (rhs []ReqHandler, done func()) { } } case "consul", "cetcd": - conns := mustCreateConnsConsul(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateConnsConsul(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) for i := range conns { rhs[i] = newPutConsul(conns[i]) } @@ -382,20 +391,20 @@ func newWriteHandlers(cfg Config) (rhs []ReqHandler, done func()) { return } -func newReadOneshotHandlers(cfg Config) []ReqHandler { - rhs := make([]ReqHandler, cfg.Step2.Clients) - switch cfg.Database { +func newReadOneshotHandlers(gcfg TestGroup) []ReqHandler { + rhs := make([]ReqHandler, gcfg.BenchmarkOptions.ClientNumber) + switch gcfg.DatabaseID { case "etcdv2": for i := range rhs { rhs[i] = func(ctx context.Context, req *request) error { - conns := mustCreateClientsEtcdv2(cfg.DatabaseEndpoints, 1) + conns := mustCreateClientsEtcdv2(gcfg.DatabaseEndpoints, 1) return newGetEtcd2(conns[0])(ctx, req) } } case "etcdv3": for i := range rhs { rhs[i] = func(ctx context.Context, req *request) error { - conns := mustCreateClientsEtcdv3(cfg.DatabaseEndpoints, etcdv3ClientCfg{ + conns := mustCreateClientsEtcdv3(gcfg.DatabaseEndpoints, etcdv3ClientCfg{ totalConns: 1, totalClients: 1, }) @@ -406,7 +415,7 @@ func newReadOneshotHandlers(cfg Config) []ReqHandler { case "zookeeper", "zetcd": for i := range rhs { rhs[i] = func(ctx context.Context, req *request) error { - conns := mustCreateConnsZk(cfg.DatabaseEndpoints, cfg.Step2.Connections) + conns := mustCreateConnsZk(gcfg.DatabaseEndpoints, gcfg.BenchmarkOptions.ConnectionNumber) defer conns[0].Close() return newGetZK(conns[0])(ctx, req) } @@ -414,7 +423,7 @@ func newReadOneshotHandlers(cfg Config) []ReqHandler { case "consul", "cetcd": for i := range rhs { rhs[i] = func(ctx context.Context, req *request) error { - conns := mustCreateConnsConsul(cfg.DatabaseEndpoints, 1) + conns := mustCreateConnsConsul(gcfg.DatabaseEndpoints, 1) return newGetConsul(conns[0])(ctx, req) } } @@ -422,41 +431,44 @@ func newReadOneshotHandlers(cfg Config) []ReqHandler { return rhs } -func generateReads(cfg Config, key string, inflightReqs chan<- request) { +func generateReads(gcfg TestGroup, key string, inflightReqs chan<- request) { defer close(inflightReqs) var rateLimiter *rate.Limiter - if cfg.Step2.RequestsPerSecond > 0 { - rateLimiter = rate.NewLimiter(rate.Limit(cfg.Step2.RequestsPerSecond), cfg.Step2.RequestsPerSecond) + if gcfg.BenchmarkOptions.RateLimitRequestsPerSecond > 0 { + rateLimiter = rate.NewLimiter( + rate.Limit(gcfg.BenchmarkOptions.RateLimitRequestsPerSecond), + int(gcfg.BenchmarkOptions.RateLimitRequestsPerSecond), + ) } - for i := 0; i < cfg.Step2.TotalRequests; i++ { + for i := int64(0); i < gcfg.BenchmarkOptions.RequestNumber; i++ { if rateLimiter != nil { rateLimiter.Wait(context.TODO()) } - switch cfg.Database { + switch gcfg.DatabaseID { case "etcdv2": // serializable read by default inflightReqs <- request{etcdv2Op: etcdv2Op{key: key}} case "etcdv3": opts := []clientv3.OpOption{clientv3.WithRange("")} - if cfg.Step2.StaleRead { + if gcfg.BenchmarkOptions.StaleRead { opts = append(opts, clientv3.WithSerializable()) } inflightReqs <- request{etcdv3Op: clientv3.OpGet(key, opts...)} case "zookeeper", "zetcd": op := zkOp{key: key} - if cfg.Step2.StaleRead { + if gcfg.BenchmarkOptions.StaleRead { op.staleRead = true } inflightReqs <- request{zkOp: op} case "consul", "cetcd": op := consulOp{key: key} - if cfg.Step2.StaleRead { + if gcfg.BenchmarkOptions.StaleRead { op.staleRead = true } inflightReqs <- request{consulOp: op} @@ -464,10 +476,13 @@ func generateReads(cfg Config, key string, inflightReqs chan<- request) { } } -func generateWrites(cfg Config, startIdx int, vals values, inflightReqs chan<- request) { +func generateWrites(gcfg TestGroup, startIdx int64, vals values, inflightReqs chan<- request) { var rateLimiter *rate.Limiter - if cfg.Step2.RequestsPerSecond > 0 { - rateLimiter = rate.NewLimiter(rate.Limit(cfg.Step2.RequestsPerSecond), cfg.Step2.RequestsPerSecond) + if gcfg.BenchmarkOptions.RateLimitRequestsPerSecond > 0 { + rateLimiter = rate.NewLimiter( + rate.Limit(gcfg.BenchmarkOptions.RateLimitRequestsPerSecond), + int(gcfg.BenchmarkOptions.RateLimitRequestsPerSecond), + ) } var wg sync.WaitGroup @@ -476,20 +491,20 @@ func generateWrites(cfg Config, startIdx int, vals values, inflightReqs chan<- r wg.Wait() }() - for i := 0; i < cfg.Step2.TotalRequests; i++ { - k := sequentialKey(cfg.Step2.KeySize, i+startIdx) - if cfg.Step2.SameKey { - k = sameKey(cfg.Step2.KeySize) + for i := int64(0); i < gcfg.BenchmarkOptions.RequestNumber; i++ { + k := sequentialKey(gcfg.BenchmarkOptions.KeySizeBytes, i+startIdx) + if gcfg.BenchmarkOptions.SameKey { + k = sameKey(gcfg.BenchmarkOptions.KeySizeBytes) } - v := vals.bytes[i%vals.sampleSize] - vs := vals.strings[i%vals.sampleSize] + v := vals.bytes[i%int64(vals.sampleSize)] + vs := vals.strings[i%int64(vals.sampleSize)] if rateLimiter != nil { rateLimiter.Wait(context.TODO()) } - switch cfg.Database { + switch gcfg.DatabaseID { case "etcdv2": inflightReqs <- request{etcdv2Op: etcdv2Op{key: k, value: vs}} case "etcdv3": diff --git a/analyze/analyze_data_4_aggregate_util.go b/stress_client.go similarity index 57% rename from analyze/analyze_data_4_aggregate_util.go rename to stress_client.go index f09e8b47..34f53d85 100644 --- a/analyze/analyze_data_4_aggregate_util.go +++ b/stress_client.go @@ -12,22 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -package analyze +package dbtester import ( - "fmt" - "strings" + "github.com/coreos/etcd/clientv3" + "golang.org/x/net/context" ) -func makeHeader(column string, tag string) string { - return fmt.Sprintf("%s-%s", column, tag) +type request struct { + etcdv2Op etcdv2Op + etcdv3Op clientv3.Op + zkOp zkOp + consulOp consulOp } -func makeTag(legend string) string { - legend = strings.ToLower(legend) - legend = strings.Replace(legend, "go ", "go", -1) - legend = strings.Replace(legend, "java ", "java", -1) - legend = strings.Replace(legend, "(", "", -1) - legend = strings.Replace(legend, ")", "", -1) - return strings.Replace(legend, " ", "-", -1) -} +// ReqHandler wraps request handler. +type ReqHandler func(ctx context.Context, req *request) error diff --git a/stress_client_consul.go b/stress_client_consul.go new file mode 100644 index 00000000..08dd9913 --- /dev/null +++ b/stress_client_consul.go @@ -0,0 +1,76 @@ +// 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 dbtester + +import ( + consulapi "github.com/hashicorp/consul/api" + "golang.org/x/net/context" +) + +type consulOp struct { + key string + value []byte + staleRead bool +} + +func mustCreateConnsConsul(endpoints []string, total int64) []*consulapi.KV { + css := make([]*consulapi.KV, total) + for i := range css { + endpoint := endpoints[dialTotal%len(endpoints)] + dialTotal++ + + dcfg := consulapi.DefaultConfig() + dcfg.Address = endpoint // x.x.x.x:8500 + cli, err := consulapi.NewClient(dcfg) + if err != nil { + plog.Fatal(err) + } + + css[i] = cli.KV() + } + return css +} + +func newPutConsul(conn *consulapi.KV) ReqHandler { + return func(ctx context.Context, req *request) error { + op := req.consulOp + _, err := conn.Put(&consulapi.KVPair{Key: op.key, Value: op.value}, nil) + return err + } +} + +func newGetConsul(conn *consulapi.KV) ReqHandler { + return func(ctx context.Context, req *request) error { + opt := &consulapi.QueryOptions{} + if req.consulOp.staleRead { + opt.AllowStale = true + opt.RequireConsistent = false + } + if !req.consulOp.staleRead { + opt.AllowStale = false + opt.RequireConsistent = true + } + _, _, err := conn.Get(req.consulOp.key, opt) + return err + } +} + +func getTotalKeysConsul(endpoints []string) map[string]int64 { + rs := make(map[string]int64) + for _, ep := range endpoints { + rs[ep] = 0 // not supported in consul + } + return rs +} diff --git a/stress_client_etcdv2.go b/stress_client_etcdv2.go new file mode 100644 index 00000000..e1c72154 --- /dev/null +++ b/stress_client_etcdv2.go @@ -0,0 +1,87 @@ +// 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 dbtester + +import ( + "net" + "net/http" + "strings" + "time" + + clientv2 "github.com/coreos/etcd/client" + "golang.org/x/net/context" +) + +func mustCreateClientsEtcdv2(endpoints []string, total int64) []clientv2.KeysAPI { + cks := make([]clientv2.KeysAPI, total) + for i := range cks { + endpoint := endpoints[dialTotal%len(endpoints)] + dialTotal++ + + if !strings.HasPrefix(endpoint, "http://") { + endpoint = "http://" + endpoint + } + + tr := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, + } + cfg := clientv2.Config{ + Endpoints: []string{endpoint}, + Transport: tr, + HeaderTimeoutPerRequest: time.Second, + } + c, err := clientv2.New(cfg) + if err != nil { + plog.Fatal(err) + } + kapi := clientv2.NewKeysAPI(c) + + cks[i] = kapi + } + return cks +} + +type etcdv2Op struct { + key string + value string +} + +func newPutEtcd2(conn clientv2.KeysAPI) ReqHandler { + return func(ctx context.Context, req *request) error { + op := req.etcdv2Op + _, err := conn.Set(context.Background(), op.key, op.value, nil) + return err + } +} + +func newGetEtcd2(conn clientv2.KeysAPI) ReqHandler { + return func(ctx context.Context, req *request) error { + _, err := conn.Get(ctx, req.etcdv2Op.key, nil) + return err + } +} + +func getTotalKeysEtcdv2(endpoints []string) map[string]int64 { + rs := make(map[string]int64) + for _, ep := range endpoints { + rs[ep] = 0 // not supported in metrics + } + return rs +} diff --git a/stress_client_etcdv3.go b/stress_client_etcdv3.go new file mode 100644 index 00000000..ac4f6fd4 --- /dev/null +++ b/stress_client_etcdv3.go @@ -0,0 +1,116 @@ +// 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 dbtester + +import ( + "bufio" + "fmt" + "net/http" + "os" + "strconv" + "strings" + + "github.com/coreos/etcd/clientv3" + "golang.org/x/net/context" +) + +func newPutEtcd3(conn clientv3.KV) ReqHandler { + return func(ctx context.Context, req *request) error { + _, err := conn.Do(ctx, req.etcdv3Op) + return err + } +} + +// dialTotal counts the number of mustCreateConn calls so that endpoint +// connections can be handed out in round-robin order +var dialTotal int + +func mustCreateConnEtcdv3(endpoints []string) *clientv3.Client { + endpoint := endpoints[dialTotal%len(endpoints)] + dialTotal++ + cfg := clientv3.Config{ + Endpoints: []string{endpoint}, + } + client, err := clientv3.New(cfg) + if err != nil { + fmt.Fprintf(os.Stderr, "dial error: %v\n", err) + os.Exit(1) + } + return client +} + +type etcdv3ClientCfg struct { + totalConns int64 + totalClients int64 +} + +func mustCreateClientsEtcdv3(endpoints []string, cfg etcdv3ClientCfg) []*clientv3.Client { + conns := make([]*clientv3.Client, cfg.totalConns) + for i := range conns { + conns[i] = mustCreateConnEtcdv3(endpoints) + } + + clients := make([]*clientv3.Client, cfg.totalClients) + for i := range clients { + clients[i] = conns[i%int(cfg.totalConns)] + } + return clients +} + +func newGetEtcd3(conn clientv3.KV) ReqHandler { + return func(ctx context.Context, req *request) error { + _, err := conn.Do(ctx, req.etcdv3Op) + return err + } +} + +func getTotalKeysEtcdv3(endpoints []string) map[string]int64 { + rs := make(map[string]int64) + for _, ep := range endpoints { + if !strings.HasPrefix(ep, "http://") { + ep = "http://" + ep + } + + plog.Println("GET", ep+"/metrics") + resp, err := http.Get(ep + "/metrics") + if err != nil { + plog.Println(err) + rs[ep] = 0 + } + scanner := bufio.NewScanner(resp.Body) + for scanner.Scan() { + txt := scanner.Text() + if strings.HasPrefix(txt, "#") { + continue + } + ts := strings.SplitN(txt, " ", 2) + fv := 0.0 + if len(ts) == 2 { + v, err := strconv.ParseFloat(ts[1], 64) + if err == nil { + fv = v + } + } + if ts[0] == "etcd_debugging_mvcc_keys_total" { + rs[ep] = int64(fv) + break + } + } + gracefulClose(resp) + } + + plog.Println("getTotalKeysEtcdv3", rs) + return rs +} diff --git a/control/step2_stress_client_io.go b/stress_client_zookeeper.go similarity index 51% rename from control/step2_stress_client_io.go rename to stress_client_zookeeper.go index 89015c74..6144e8b2 100644 --- a/control/step2_stress_client_io.go +++ b/stress_client_zookeeper.go @@ -12,33 +12,46 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "errors" - "fmt" + "time" - clientv2 "github.com/coreos/etcd/client" - "github.com/coreos/etcd/clientv3" - consulapi "github.com/hashicorp/consul/api" "github.com/samuel/go-zookeeper/zk" "golang.org/x/net/context" ) -type ReqHandler func(ctx context.Context, req *request) error +var ( + zkCreateFlags = int32(0) + zkCreateACL = zk.WorldACL(zk.PermAll) +) -func newPutEtcd2(conn clientv2.KeysAPI) ReqHandler { - return func(ctx context.Context, req *request) error { - op := req.etcdv2Op - _, err := conn.Set(context.Background(), op.key, op.value, nil) - return err - } +type zkOp struct { + key string + value []byte + staleRead bool } -func newPutEtcd3(conn clientv3.KV) ReqHandler { +func mustCreateConnsZk(endpoints []string, total int64) []*zk.Conn { + zks := make([]*zk.Conn, total) + for i := range zks { + endpoint := endpoints[dialTotal%len(endpoints)] + dialTotal++ + conn, _, err := zk.Connect([]string{endpoint}, time.Second) + if err != nil { + plog.Fatal(err) + } + zks[i] = conn + } + return zks +} + +func newPutCreateZK(conn *zk.Conn) ReqHandler { return func(ctx context.Context, req *request) error { - _, err := conn.Do(ctx, req.etcdv3Op) + op := req.zkOp + _, err := conn.Create(op.key, op.value, zkCreateFlags, zkCreateACL) return err } } @@ -52,36 +65,6 @@ func newPutOverwriteZK(conn *zk.Conn) ReqHandler { } } -func newPutCreateZK(conn *zk.Conn) ReqHandler { - return func(ctx context.Context, req *request) error { - op := req.zkOp - _, err := conn.Create(op.key, op.value, zkCreateFlags, zkCreateAcl) - return err - } -} - -func newPutConsul(conn *consulapi.KV) ReqHandler { - return func(ctx context.Context, req *request) error { - op := req.consulOp - _, err := conn.Put(&consulapi.KVPair{Key: op.key, Value: op.value}, nil) - return err - } -} - -func newGetEtcd2(conn clientv2.KeysAPI) ReqHandler { - return func(ctx context.Context, req *request) error { - _, err := conn.Get(ctx, req.etcdv2Op.key, nil) - return err - } -} - -func newGetEtcd3(conn clientv3.KV) ReqHandler { - return func(ctx context.Context, req *request) error { - _, err := conn.Do(ctx, req.etcdv3Op) - return err - } -} - func newGetZK(conn *zk.Conn) ReqHandler { return func(ctx context.Context, req *request) error { errt := "" @@ -105,18 +88,18 @@ func newGetZK(conn *zk.Conn) ReqHandler { } } -func newGetConsul(conn *consulapi.KV) ReqHandler { - return func(ctx context.Context, req *request) error { - opt := &consulapi.QueryOptions{} - if req.consulOp.staleRead { - opt.AllowStale = true - opt.RequireConsistent = false +func getTotalKeysZk(endpoints []string) map[string]int64 { + rs := make(map[string]int64) + stats, ok := zk.FLWSrvr(endpoints, 5*time.Second) + if !ok { + plog.Printf("getTotalKeysZk failed with %+v", stats) + for _, ep := range endpoints { + rs[ep] = 0 } - if !req.consulOp.staleRead { - opt.AllowStale = false - opt.RequireConsistent = true - } - _, _, err := conn.Get(req.consulOp.key, opt) - return err + return rs } + for i, s := range stats { + rs[endpoints[i]] = s.NodeCount + } + return rs } diff --git a/stress_report.go b/stress_report.go new file mode 100644 index 00000000..64e2b4b9 --- /dev/null +++ b/stress_report.go @@ -0,0 +1,158 @@ +// 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 dbtester + +import ( + "fmt" + "sync" + "time" + + "github.com/cheggaaa/pb" + "github.com/coreos/dbtester/pkg/report" + "golang.org/x/net/context" +) + +type values struct { + bytes [][]byte + strings []string + sampleSize int +} + +func newValues(gcfg TestGroup) (v values, rerr error) { + v.bytes = [][]byte{randBytes(gcfg.BenchmarkOptions.ValueSizeBytes)} + v.strings = []string{string(v.bytes[0])} + v.sampleSize = 1 + return +} + +type benchmark struct { + bar *pb.ProgressBar + report report.Report + reportDone <-chan report.Stats + stats report.Stats + + reqHandlers []ReqHandler + reqGen func(chan<- request) + reqDone func() + wg sync.WaitGroup + + mu sync.RWMutex + inflightReqs chan request +} + +// pass totalN in case that 'cfg' is manipulated +func newBenchmark(totalN int64, clientsN int64, reqHandlers []ReqHandler, reqDone func(), reqGen func(chan<- request)) (b *benchmark) { + b = &benchmark{ + bar: pb.New(int(totalN)), + reqHandlers: reqHandlers, + reqGen: reqGen, + reqDone: reqDone, + wg: sync.WaitGroup{}, + } + b.inflightReqs = make(chan request, clientsN) + + b.bar.Format("Bom !") + b.bar.Start() + b.report = report.NewReportSample("%4.4f") + return +} + +// only useful when multiple ranges of requests are run with one report +func (b *benchmark) reset(clientsN int64, reqHandlers []ReqHandler, reqDone func(), reqGen func(chan<- request)) { + if len(reqHandlers) == 0 { + panic(fmt.Errorf("got 0 reqHandlers")) + } + b.reqHandlers = reqHandlers + b.reqDone = reqDone + b.reqGen = reqGen + + // inflight requests will be dropped! + b.mu.Lock() + b.inflightReqs = make(chan request, clientsN) + b.mu.Unlock() +} + +func (b *benchmark) getInflightsReqs() (ch chan request) { + b.mu.RLock() + ch = b.inflightReqs + b.mu.RUnlock() + return +} + +func (b *benchmark) startRequests() { + for i := range b.reqHandlers { + b.wg.Add(1) + go func(rh ReqHandler) { + defer b.wg.Done() + for req := range b.getInflightsReqs() { + if rh == nil { + panic(fmt.Errorf("got nil rh")) + } + st := time.Now() + err := rh(context.Background(), &req) + b.report.Results() <- report.Result{Err: err, Start: st, End: time.Now()} + b.bar.Increment() + } + }(b.reqHandlers[i]) + } + go b.reqGen(b.getInflightsReqs()) + b.reportDone = b.report.Stats() +} + +func (b *benchmark) waitRequestsEnd() { + b.wg.Wait() + if b.reqDone != nil { + b.reqDone() // cancel connections + } +} + +func (b *benchmark) finishReports() { + close(b.report.Results()) + b.bar.Finish() + st := <-b.reportDone + b.stats = st +} + +func (b *benchmark) waitAll() { + b.waitRequestsEnd() + b.finishReports() +} + +func printStats(st report.Stats) { + // to be piped to cfg.Log via stdout when dbtester executed + if len(st.Lats) > 0 { + fmt.Printf("Total: %v\n", st.Total) + fmt.Printf("Slowest: %f secs\n", st.Slowest) + fmt.Printf("Fastest: %f secs\n", st.Fastest) + fmt.Printf("Average: %f secs\n", st.Average) + fmt.Printf("Requests/sec: %4.4f\n", st.RPS) + } + if len(st.ErrorDist) > 0 { + for k, v := range st.ErrorDist { + fmt.Printf("ERROR %q : %d\n", k, v) + } + } else { + fmt.Println("ERRRO: 0") + } +} + +func (cfg *Config) generateReport(gcfg TestGroup, h []ReqHandler, reqDone func(), reqGen func(chan<- request)) { + b := newBenchmark(gcfg.RequestNumber, gcfg.ClientNumber, h, reqDone, reqGen) + b.startRequests() + b.waitAll() + + printStats(b.stats) + cfg.saveAllStats(gcfg, b.stats, nil) +} diff --git a/control/step2_stress_report_aggregate.go b/stress_report_aggregate.go similarity index 92% rename from control/step2_stress_report_aggregate.go rename to stress_report_aggregate.go index c37d907b..18f4c193 100644 --- a/control/step2_stress_report_aggregate.go +++ b/stress_report_aggregate.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "sort" @@ -36,7 +36,7 @@ import ( // If unis is 1000 and the average throughput per second is 30,000 // and its average latency is 10ms, it will have 30 data points with // latency 10ms. -func processTimeSeries(tss report.TimeSeries, unit int64, totalRequests int) keyNumToAvgLatencys { +func processTimeSeries(tss report.TimeSeries, unit int64, totalRequests int64) keyNumToAvgLatencys { sort.Sort(tss) cumulKeyN := int64(0) @@ -63,13 +63,13 @@ func processTimeSeries(tss report.TimeSeries, unit int64, totalRequests int) key } // fill-in empty rows - for i := maxKey; i < int64(totalRequests); i += unit { + for i := maxKey; i < totalRequests; i += unit { if _, ok := rm[i]; !ok { rm[i] = keyNumToAvgLatency{} } } - if _, ok := rm[int64(totalRequests)]; !ok { - rm[int64(totalRequests)] = keyNumToAvgLatency{} + if _, ok := rm[totalRequests]; !ok { + rm[totalRequests] = keyNumToAvgLatency{} } kss := []keyNumToAvgLatency{} diff --git a/control/step2_stress_report_aggregate_test.go b/stress_report_aggregate_test.go similarity index 99% rename from control/step2_stress_report_aggregate_test.go rename to stress_report_aggregate_test.go index 7dd5f2c2..df2f1a95 100644 --- a/control/step2_stress_report_aggregate_test.go +++ b/stress_report_aggregate_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "reflect" diff --git a/test-configs/01-write-1M-keys-client-variable.yaml b/test-configs/01-write-1M-keys-client-variable.yaml new file mode 100644 index 00000000..8a960f85 --- /dev/null +++ b/test-configs/01-write-1M-keys-client-variable.yaml @@ -0,0 +1,339 @@ +test_title: Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 +test_description: | + - 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) + +# common control options for all client machines +control: + # if not empty, all test data paths are prefixed + path_prefix: /home/gyuho + log_path: client-control.log + client_system_metrics_path: client-system-metrics.csv + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + + # (optional) to automatically upload all files in client machine + google_cloud_project_name: etcd-development + # set this in 'control' machine, to automate log uploading in remote 'agent' machines + google_cloud_storage_key_path: /home/gyuho/gcloud-key.json + google_cloud_storage_bucket_name: dbtester-results + google_cloud_storage_sub_directory: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable + +all_database_id_list: [etcdv3, zookeeper, consul] + +datatbase_id_to_test_group: + etcdv3: + database_description: etcd v3.1 (Go 1.7.4) + peer_ips: + - 10.240.0.20 + - 10.240.0.21 + - 10.240.0.22 + database_port_to_connect: 2379 + agent_port_to_connect: 3500 + + etcdv3: + # --snapshot-count + snap_count: 100000 + # --quota-backend-bytes; 8 GB + quota_size_bytes: 8000000000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + zookeeper: + database_description: Zookeeper r3.4.9 (Java 8) + peer_ips: + - 10.240.0.25 + - 10.240.0.27 + - 10.240.0.28 + database_port_to_connect: 2181 + agent_port_to_connect: 3500 + + # http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html + zookeeper: + # tickTime; the length of a single tick, which is the basic time unit used by ZooKeeper, + # as measured in milliseconds. + tick_time: 2000 + + # initLimit; Amount of time, in ticks to allow followers to connect and sync to a leader + # increased this value as needed, if the amount of data managed by ZooKeeper is large. + # (default 5) + init_limit: 5 + + # syncLimit; Amount of time, in ticks to allow followers to sync with ZooKeeper. + # (default 5) + sync_limit: 5 + + # snapCount; After snapCount transactions are written to a log file a snapshot + # is started and a new transaction log file is created. The default snapCount is 100,000. + snap_count: 100000 + + # maxClientCnxns; Limits the number of concurrent connections (at the socket level) + # that a single client, identified by IP address, may make to a single member of the ZooKeeper ensemble. + max_client_connections: 5000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + consul: + database_description: Consul v0.7.3 (Go 1.7.4) + peer_ips: + - 10.240.0.30 + - 10.240.0.31 + - 10.240.0.33 + database_port_to_connect: 8500 + agent_port_to_connect: 3500 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 0 + client_number: 0 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [1, 10, 50, 100, 300, 500, 700, 1000] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + +datatbase_id_to_test_data: + etcdv3: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/etcd-v3.1-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + zookeeper: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/zookeeper-r3.4.9-java8 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + consul: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/consul-v0.7.3-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + +analyze: + all_aggregated_output_path_csv: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.csv + all_aggregated_output_path_txt: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/all-aggregated.txt + +plot_path_prefix: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable +plot_list: +- column: AVG-LATENCY-MS + x_axis: Second + y_axis: Latency(millisecond) + +- column: AVG-THROUGHPUT + x_axis: Second + y_axis: Throughput(Requests/Second) + +- column: AVG-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Voluntary Context Switches + +- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Non-voluntary Context Switches + +- column: AVG-CPU + x_axis: Second + y_axis: CPU(%) + +- column: AVG-VMRSS-MB + x_axis: Second + y_axis: Memory(MB) + +- column: AVG-READS-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Reads (Delta per Second) + +- column: AVG-SECTORS-READ-DELTA + x_axis: Second + y_axis: Sectors Read (Delta per Second) + +- column: AVG-WRITES-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Writes (Delta per Second) + +- column: AVG-SECTORS-WRITTEN-DELTA + x_axis: Second + y_axis: Sectors Written (Delta per Second) + +- column: AVG-RECEIVE-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Receive(bytes) (Delta per Second) + +- column: AVG-TRANSMIT-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Transmit(bytes) (Delta per Second) + +readme: + output_path: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/README.md + + images: + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA.svg + type: remote diff --git a/test-configs/02-write-1M-keys-best-throughput.yaml b/test-configs/02-write-1M-keys-best-throughput.yaml new file mode 100644 index 00000000..ffed7da8 --- /dev/null +++ b/test-configs/02-write-1M-keys-best-throughput.yaml @@ -0,0 +1,339 @@ +test_title: Write 1M keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) +test_description: | + - 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) + +# common control options for all client machines +control: + # if not empty, all test data paths are prefixed + path_prefix: /home/gyuho + log_path: client-control.log + client_system_metrics_path: client-system-metrics.csv + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + + # (optional) to automatically upload all files in client machine + google_cloud_project_name: etcd-development + # set this in 'control' machine, to automate log uploading in remote 'agent' machines + google_cloud_storage_key_path: /home/gyuho/gcloud-key.json + google_cloud_storage_bucket_name: dbtester-results + google_cloud_storage_sub_directory: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput + +all_database_id_list: [etcdv3, zookeeper, consul] + +datatbase_id_to_test_group: + etcdv3: + database_description: etcd v3.1 (Go 1.7.4) + peer_ips: + - 10.240.0.20 + - 10.240.0.21 + - 10.240.0.22 + database_port_to_connect: 2379 + agent_port_to_connect: 3500 + + etcdv3: + # --snapshot-count + snap_count: 100000 + # --quota-backend-bytes; 8 GB + quota_size_bytes: 8000000000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 700 # for best throughput + client_number: 700 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + zookeeper: + database_description: Zookeeper r3.4.9 (Java 8) + peer_ips: + - 10.240.0.25 + - 10.240.0.27 + - 10.240.0.28 + database_port_to_connect: 2181 + agent_port_to_connect: 3500 + + # http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html + zookeeper: + # tickTime; the length of a single tick, which is the basic time unit used by ZooKeeper, + # as measured in milliseconds. + tick_time: 2000 + + # initLimit; Amount of time, in ticks to allow followers to connect and sync to a leader + # increased this value as needed, if the amount of data managed by ZooKeeper is large. + # (default 5) + init_limit: 5 + + # syncLimit; Amount of time, in ticks to allow followers to sync with ZooKeeper. + # (default 5) + sync_limit: 5 + + # snapCount; After snapCount transactions are written to a log file a snapshot + # is started and a new transaction log file is created. The default snapCount is 100,000. + snap_count: 100000 + + # maxClientCnxns; Limits the number of concurrent connections (at the socket level) + # that a single client, identified by IP address, may make to a single member of the ZooKeeper ensemble. + max_client_connections: 5000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 300 # for best throughput + client_number: 300 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + consul: + database_description: Consul v0.7.3 (Go 1.7.4) + peer_ips: + - 10.240.0.30 + - 10.240.0.31 + - 10.240.0.33 + database_port_to_connect: 8500 + agent_port_to_connect: 3500 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 500 # for best throughput + client_number: 500 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + +datatbase_id_to_test_data: + etcdv3: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/etcd-v3.1-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + zookeeper: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/zookeeper-r3.4.9-java8 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + consul: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/consul-v0.7.3-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + +analyze: + all_aggregated_output_path_csv: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/all-aggregated.csv + all_aggregated_output_path_txt: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/all-aggregated.txt + +plot_path_prefix: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput +plot_list: +- column: AVG-LATENCY-MS + x_axis: Second + y_axis: Latency(millisecond) + +- column: AVG-THROUGHPUT + x_axis: Second + y_axis: Throughput(Requests/Second) + +- column: AVG-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Voluntary Context Switches + +- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Non-voluntary Context Switches + +- column: AVG-CPU + x_axis: Second + y_axis: CPU(%) + +- column: AVG-VMRSS-MB + x_axis: Second + y_axis: Memory(MB) + +- column: AVG-READS-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Reads (Delta per Second) + +- column: AVG-SECTORS-READ-DELTA + x_axis: Second + y_axis: Sectors Read (Delta per Second) + +- column: AVG-WRITES-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Writes (Delta per Second) + +- column: AVG-SECTORS-WRITTEN-DELTA + x_axis: Second + y_axis: Sectors Written (Delta per Second) + +- column: AVG-RECEIVE-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Receive(bytes) (Delta per Second) + +- column: AVG-TRANSMIT-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Transmit(bytes) (Delta per Second) + +readme: + output_path: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/README.md + + images: + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA.svg + type: remote diff --git a/test-configs/03-write-1M-keys-1000-client.yaml b/test-configs/03-write-1M-keys-1000-client.yaml new file mode 100644 index 00000000..3cf0299a --- /dev/null +++ b/test-configs/03-write-1M-keys-1000-client.yaml @@ -0,0 +1,339 @@ +test_title: Write 1M keys, 256-byte key, 1KB value, 1,000 client +test_description: | + - 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) + +# common control options for all client machines +control: + # if not empty, all test data paths are prefixed + path_prefix: /home/gyuho + log_path: client-control.log + client_system_metrics_path: client-system-metrics.csv + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + + # (optional) to automatically upload all files in client machine + google_cloud_project_name: etcd-development + # set this in 'control' machine, to automate log uploading in remote 'agent' machines + google_cloud_storage_key_path: /home/gyuho/gcloud-key.json + google_cloud_storage_bucket_name: dbtester-results + google_cloud_storage_sub_directory: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client + +all_database_id_list: [etcdv3, zookeeper, consul] + +datatbase_id_to_test_group: + etcdv3: + database_description: etcd v3.1 (Go 1.7.4) + peer_ips: + - 10.240.0.20 + - 10.240.0.21 + - 10.240.0.22 + database_port_to_connect: 2379 + agent_port_to_connect: 3500 + + etcdv3: + # --snapshot-count + snap_count: 100000 + # --quota-backend-bytes; 8 GB + quota_size_bytes: 8000000000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 1000 + client_number: 1000 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + zookeeper: + database_description: Zookeeper r3.4.9 (Java 8) + peer_ips: + - 10.240.0.25 + - 10.240.0.27 + - 10.240.0.28 + database_port_to_connect: 2181 + agent_port_to_connect: 3500 + + # http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html + zookeeper: + # tickTime; the length of a single tick, which is the basic time unit used by ZooKeeper, + # as measured in milliseconds. + tick_time: 2000 + + # initLimit; Amount of time, in ticks to allow followers to connect and sync to a leader + # increased this value as needed, if the amount of data managed by ZooKeeper is large. + # (default 5) + init_limit: 5 + + # syncLimit; Amount of time, in ticks to allow followers to sync with ZooKeeper. + # (default 5) + sync_limit: 5 + + # snapCount; After snapCount transactions are written to a log file a snapshot + # is started and a new transaction log file is created. The default snapCount is 100,000. + snap_count: 100000 + + # maxClientCnxns; Limits the number of concurrent connections (at the socket level) + # that a single client, identified by IP address, may make to a single member of the ZooKeeper ensemble. + max_client_connections: 5000 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 1000 + client_number: 1000 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + consul: + database_description: Consul v0.7.3 (Go 1.7.4) + peer_ips: + - 10.240.0.30 + - 10.240.0.31 + - 10.240.0.33 + database_port_to_connect: 8500 + agent_port_to_connect: 3500 + + benchmark_options: + type: write + request_number: 1000000 + connection_number: 1000 + client_number: 1000 + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + +datatbase_id_to_test_data: + etcdv3: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/etcd-v3.1-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + zookeeper: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/zookeeper-r3.4.9-java8 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + consul: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/consul-v0.7.3-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + +analyze: + all_aggregated_output_path_csv: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/all-aggregated.csv + all_aggregated_output_path_txt: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/all-aggregated.txt + +plot_path_prefix: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client +plot_list: +- column: AVG-LATENCY-MS + x_axis: Second + y_axis: Latency(millisecond) + +- column: AVG-THROUGHPUT + x_axis: Second + y_axis: Throughput(Requests/Second) + +- column: AVG-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Voluntary Context Switches + +- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Non-voluntary Context Switches + +- column: AVG-CPU + x_axis: Second + y_axis: CPU(%) + +- column: AVG-VMRSS-MB + x_axis: Second + y_axis: Memory(MB) + +- column: AVG-READS-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Reads (Delta per Second) + +- column: AVG-SECTORS-READ-DELTA + x_axis: Second + y_axis: Sectors Read (Delta per Second) + +- column: AVG-WRITES-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Writes (Delta per Second) + +- column: AVG-SECTORS-WRITTEN-DELTA + x_axis: Second + y_axis: Sectors Written (Delta per Second) + +- column: AVG-RECEIVE-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Receive(bytes) (Delta per Second) + +- column: AVG-TRANSMIT-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Transmit(bytes) (Delta per Second) + +readme: + output_path: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/README.md + + images: + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA.svg + type: remote diff --git a/test-configs/04-write-too-many-keys.yaml b/test-configs/04-write-too-many-keys.yaml new file mode 100644 index 00000000..3e8c266b --- /dev/null +++ b/test-configs/04-write-too-many-keys.yaml @@ -0,0 +1,339 @@ +test_title: Write 3-million keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) +test_description: | + - 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) + +# common control options for all client machines +control: + # if not empty, all test data paths are prefixed + path_prefix: /home/gyuho + log_path: client-control.log + client_system_metrics_path: client-system-metrics.csv + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + + # (optional) to automatically upload all files in client machine + google_cloud_project_name: etcd-development + # set this in 'control' machine, to automate log uploading in remote 'agent' machines + google_cloud_storage_key_path: /home/gyuho/gcloud-key.json + google_cloud_storage_bucket_name: dbtester-results + google_cloud_storage_sub_directory: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys + +all_database_id_list: [etcdv3, zookeeper, consul] + +datatbase_id_to_test_group: + etcdv3: + database_description: etcd v3.1 (Go 1.7.4) + peer_ips: + - 10.240.0.20 + - 10.240.0.21 + - 10.240.0.22 + database_port_to_connect: 2379 + agent_port_to_connect: 3500 + + etcdv3: + # --snapshot-count + snap_count: 100000 + # --quota-backend-bytes; 8 GB + quota_size_bytes: 8000000000 + + benchmark_options: + type: write + request_number: 3000000 + connection_number: 700 # for best throughput + client_number: 700 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + zookeeper: + database_description: Zookeeper r3.4.9 (Java 8) + peer_ips: + - 10.240.0.25 + - 10.240.0.27 + - 10.240.0.28 + database_port_to_connect: 2181 + agent_port_to_connect: 3500 + + # http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html + zookeeper: + # tickTime; the length of a single tick, which is the basic time unit used by ZooKeeper, + # as measured in milliseconds. + tick_time: 2000 + + # initLimit; Amount of time, in ticks to allow followers to connect and sync to a leader + # increased this value as needed, if the amount of data managed by ZooKeeper is large. + # (default 5) + init_limit: 5 + + # syncLimit; Amount of time, in ticks to allow followers to sync with ZooKeeper. + # (default 5) + sync_limit: 5 + + # snapCount; After snapCount transactions are written to a log file a snapshot + # is started and a new transaction log file is created. The default snapCount is 100,000. + snap_count: 100000 + + # maxClientCnxns; Limits the number of concurrent connections (at the socket level) + # that a single client, identified by IP address, may make to a single member of the ZooKeeper ensemble. + max_client_connections: 5000 + + benchmark_options: + type: write + request_number: 3000000 + connection_number: 300 # for best throughput + client_number: 300 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + consul: + database_description: Consul v0.7.3 (Go 1.7.4) + peer_ips: + - 10.240.0.30 + - 10.240.0.31 + - 10.240.0.33 + database_port_to_connect: 8500 + agent_port_to_connect: 3500 + + benchmark_options: + type: write + request_number: 3000000 + connection_number: 500 # for best throughput + client_number: 500 # for best throughput + # if specified, overwrite 'connection_number', 'connection_number' + connection_client_numbers: [] + + # 0, to not rate limit + rate_limit_requests_per_second: 0 + + # for 'write', 'read' + same_key: false + key_size_bytes: 256 + value_size_bytes: 1024 + + stale_read: false + + benchmark_steps: + step1_start_database: true + step2_stress_database: true + step3_stop_database: true + step4_upload_logs: true + + +datatbase_id_to_test_data: + etcdv3: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/etcd-v3.1-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + zookeeper: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/zookeeper-r3.4.9-java8 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + + consul: + # if not empty, all test data paths are prefixed + path_prefix: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/consul-v0.7.3-go1.7.4 + client_system_metrics_interpolated_path: client-system-metrics-interpolated.csv + client_latency_throughput_timeseries_path: client-latency-throughput-timeseries.csv + client_latency_distribution_all_path: client-latency-distribution-all.csv + client_latency_distribution_percentile_path: client-latency-distribution-percentile.csv + client_latency_distribution_summary_path: client-latency-distribution-summary.csv + client_latency_by_key_number_path: client-latency-by-key-number.csv + server_data_size_on_disk_summary_path: server-data-size-on-disk-summary.csv + server_memory_by_key_number_path: server-memory-by-key-number.csv + server_system_metrics_interpolated_path_list: + - 1-server-system-metrics-interpolated.csv + - 2-server-system-metrics-interpolated.csv + - 3-server-system-metrics-interpolated.csv + all_aggregated_output_path: all-aggregated.csv + +analyze: + all_aggregated_output_path_csv: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/all-aggregated.csv + all_aggregated_output_path_txt: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/all-aggregated.txt + +plot_path_prefix: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys +plot_list: +- column: AVG-LATENCY-MS + x_axis: Second + y_axis: Latency(millisecond) + +- column: AVG-THROUGHPUT + x_axis: Second + y_axis: Throughput(Requests/Second) + +- column: AVG-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Voluntary Context Switches + +- column: AVG-NON-VOLUNTARY-CTXT-SWITCHES + x_axis: Second + y_axis: Non-voluntary Context Switches + +- column: AVG-CPU + x_axis: Second + y_axis: CPU(%) + +- column: AVG-VMRSS-MB + x_axis: Second + y_axis: Memory(MB) + +- column: AVG-READS-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Reads (Delta per Second) + +- column: AVG-SECTORS-READ-DELTA + x_axis: Second + y_axis: Sectors Read (Delta per Second) + +- column: AVG-WRITES-COMPLETED-DELTA + x_axis: Second + y_axis: Disk Writes (Delta per Second) + +- column: AVG-SECTORS-WRITTEN-DELTA + x_axis: Second + y_axis: Sectors Written (Delta per Second) + +- column: AVG-RECEIVE-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Receive(bytes) (Delta per Second) + +- column: AVG-TRANSMIT-BYTES-NUM-DELTA + x_axis: Second + y_axis: Network Transmit(bytes) (Delta per Second) + +readme: + output_path: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/README.md + + images: + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA.svg + type: remote + + - title: 2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA + path: https://storage.googleapis.com/dbtester-results/2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA.svg + type: remote diff --git a/bench-configuration/02-install-cetcd.sh b/test-configs/install-cetcd.sh similarity index 100% rename from bench-configuration/02-install-cetcd.sh rename to test-configs/install-cetcd.sh diff --git a/bench-configuration/02-install-consul.sh b/test-configs/install-consul.sh similarity index 100% rename from bench-configuration/02-install-consul.sh rename to test-configs/install-consul.sh diff --git a/bench-configuration/03-install-dbtester.sh b/test-configs/install-dbtester.sh similarity index 81% rename from bench-configuration/03-install-dbtester.sh rename to test-configs/install-dbtester.sh index c0e196b9..044b84a5 100755 --- a/bench-configuration/03-install-dbtester.sh +++ b/test-configs/install-dbtester.sh @@ -8,7 +8,7 @@ rm -rf $HOME/go/src/github.com/coreos/dbtester git clone https://github.com/$USER_NAME/dbtester --branch $BRANCH_NAME $HOME/go/src/github.com/coreos/dbtester cd $HOME -go install -v ./go/src/github.com/coreos/dbtester +go install -v ./go/src/github.com/coreos/dbtester/cmd/dbtester dbtester agent -h dbtester control -h diff --git a/bench-configuration/01-install-etcd.sh b/test-configs/install-etcd.sh similarity index 100% rename from bench-configuration/01-install-etcd.sh rename to test-configs/install-etcd.sh diff --git a/bench-configuration/00-install-go.sh b/test-configs/install-go.sh similarity index 100% rename from bench-configuration/00-install-go.sh rename to test-configs/install-go.sh diff --git a/bench-configuration/02-install-zetcd.sh b/test-configs/install-zetcd.sh similarity index 100% rename from bench-configuration/02-install-zetcd.sh rename to test-configs/install-zetcd.sh diff --git a/bench-configuration/02-install-zookeeper-ubuntu.sh b/test-configs/install-zookeeper-ubuntu.sh similarity index 100% rename from bench-configuration/02-install-zookeeper-ubuntu.sh rename to test-configs/install-zookeeper-ubuntu.sh diff --git a/bench-configuration/04-run-dbtester.sh b/test-configs/run-dbtester.sh similarity index 63% rename from bench-configuration/04-run-dbtester.sh rename to test-configs/run-dbtester.sh index 418da072..2d55011c 100755 --- a/bench-configuration/04-run-dbtester.sh +++ b/test-configs/run-dbtester.sh @@ -7,9 +7,11 @@ nohup dbtester agent --network-interface ens4 --disk-device sda1 --agent-port # control; specify 'control' configuration file (client number, key number, key-value size), # this starts database stressing, and shuts down the database when done -nohup dbtester control -c config.yaml > $HOME/control.log 2>&1 & +nohup dbtester control --database-id etcdv3 --config config.yaml > $HOME/control.log 2>&1 & +nohup dbtester control --database-id zookeeper --config config.yaml > $HOME/control.log 2>&1 & +nohup dbtester control --database-id consul --config config.yaml > $HOME/control.log 2>&1 & # analyze; get all data from remote machines # and specify 'analyze' configuration file, # this aggregates data, generates all graphs, texts -dbtester analyze --config analyze.yaml +dbtester analyze --config config.yaml diff --git a/test-results/2017Q1-00-etcd-zookeeper-consul/README.md b/test-results/2017Q1-00-etcd-zookeeper-consul/README.md new file mode 100644 index 00000000..d73274a9 --- /dev/null +++ b/test-results/2017Q1-00-etcd-zookeeper-consul/README.md @@ -0,0 +1,496 @@ + + +


+##### Write 1M keys, 256-byte key, 1KB value value, clients 1 to 1,000 + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 345.7743 sec | 320.9959 sec | 676.6576 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 35,245 req/sec | 37,580 req/sec | 15,488 req/sec | +| AVG-THROUGHPUT | 2,892 req/sec | 3,108 req/sec | 1,477 req/sec | +| MIN-THROUGHPUT | 23 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 1.0942 ms | 0.9952 ms | 3.0193 ms | +| AVG-LATENCY | 14.0207 ms | 34.9720 ms | 44.3717 ms | +| SLOWEST-LATENCY | 101.5395 ms | 2334.6007 ms | 3475.2713 ms | +| Latency p10 | 2.308513 ms | 2.378813 ms | 3.971904 ms | +| Latency p25 | 5.879109 ms | 3.595997 ms | 7.811056 ms | +| Latency p50 | 10.100823 ms | 6.320842 ms | 20.224796 ms | +| Latency p75 | 17.160120 ms | 12.677824 ms | 56.790033 ms | +| Latency p90 | 28.890553 ms | 21.506040 ms | 89.507900 ms | +| Latency p95 | 44.861387 ms | 30.713207 ms | 106.807611 ms | +| Latency p99 | 62.570152 ms | 1186.951737 ms | 301.241777 ms | +| Latency p99.9 | 87.467729 ms | 2241.127019 ms | 2634.872172 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 5.1 GB | 5.4 GB | 5.5 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.4 GB | 4.3 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 271 MB | 356 MB | 202 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.5 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 449.90 % | 558.97 % | 421.60 % | +| SERVER-MAX-MEMORY-USAGE | 1.4 GB | 3.9 GB | 4.8 GB | +| CLIENT-MAX-CPU-USAGE | 552.00 % | 617.80 % | 224.00 % | +| CLIENT-MAX-MEMORY-USAGE | 361 MB | 4.4 GB | 225 MB | +| CLIENT-ERROR-COUNT | 0 | 2,093 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 3 | 221 | 11 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 1,222,851 | 960,275 | 2,333,199 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 739,936 | 12,769,072 | 4,013,148 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.4 GB | 8.8 GB | 3.0 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: connection closed" (count 1,747) +"zk: could not connect to a server" (count 346) +``` + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/01-write-1M-keys-client-variable/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 1M keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 37.4731 sec | 63.8379 sec | 309.0797 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 32,555 req/sec | 38,537 req/sec | 16,919 req/sec | +| AVG-THROUGHPUT | 26,685 req/sec | 15,656 req/sec | 3,235 req/sec | +| MIN-THROUGHPUT | 15,350 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 4.5030 ms | 2.3895 ms | 14.5025 ms | +| AVG-LATENCY | 26.1688 ms | 17.9204 ms | 154.4720 ms | +| SLOWEST-LATENCY | 205.8298 ms | 3471.7581 ms | 21463.6662 ms | +| Latency p10 | 10.580892 ms | 5.948893 ms | 29.430795 ms | +| Latency p25 | 12.626734 ms | 6.817741 ms | 34.096243 ms | +| Latency p50 | 18.452075 ms | 7.718642 ms | 42.522161 ms | +| Latency p75 | 26.930691 ms | 8.659562 ms | 63.027422 ms | +| Latency p90 | 49.843748 ms | 9.750484 ms | 263.017095 ms | +| Latency p95 | 67.991988 ms | 10.757740 ms | 601.571541 ms | +| Latency p99 | 135.153213 ms | 114.903303 ms | 1237.545701 ms | +| Latency p99.9 | 160.393852 ms | 2248.915050 ms | 11496.380241 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 4.9 GB | 5.4 GB | 14 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.8 GB | 4.3 GB | 12 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 274 MB | 351 MB | 211 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.4 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 416.67 % | 710.17 % | 410.67 % | +| SERVER-MAX-MEMORY-USAGE | 1.2 GB | 4.6 GB | 5.9 GB | +| CLIENT-MAX-CPU-USAGE | 448.00 % | 365.00 % | 223.00 % | +| CLIENT-MAX-MEMORY-USAGE | 219 MB | 1.9 GB | 90 MB | +| CLIENT-ERROR-COUNT | 0 | 509 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 3 | 253 | 162 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 110,436 | 101,558 | 665,193 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 371,988 | 9,306,936 | 37,002,460 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.8 GB | 7.1 GB | 2.9 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: could not connect to a server" (count 208) +"zk: connection closed" (count 301) +``` + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/02-write-1M-keys-best-throughput/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 1M keys, 256-byte key, 1KB value, 1,000 client + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 36.5547 sec | 59.5935 sec | 244.8620 sec | +| TOTAL-REQUEST-NUMBER | 1,000,000 | 1,000,000 | 1,000,000 | +| MAX-THROUGHPUT | 35,025 req/sec | 47,693 req/sec | 15,146 req/sec | +| AVG-THROUGHPUT | 27,356 req/sec | 16,697 req/sec | 4,083 req/sec | +| MIN-THROUGHPUT | 228 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 4.1857 ms | 1.4036 ms | 27.1684 ms | +| AVG-LATENCY | 36.4506 ms | 46.1962 ms | 244.4663 ms | +| SLOWEST-LATENCY | 233.1590 ms | 6787.1829 ms | 30479.0204 ms | +| Latency p10 | 14.321495 ms | 12.447591 ms | 66.233418 ms | +| Latency p25 | 17.784730 ms | 16.822188 ms | 74.271576 ms | +| Latency p50 | 23.783217 ms | 20.026128 ms | 92.736772 ms | +| Latency p75 | 44.930445 ms | 23.615952 ms | 151.332505 ms | +| Latency p90 | 67.957086 ms | 31.726640 ms | 338.858136 ms | +| Latency p95 | 121.316986 ms | 78.842487 ms | 696.780894 ms | +| Latency p99 | 163.614045 ms | 821.197693 ms | 1887.708027 ms | +| Latency p99.9 | 187.122508 ms | 2709.006521 ms | 20942.858889 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 5.0 GB | 5.3 GB | 6.6 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 3.9 GB | 4.2 GB | 5.4 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 282 MB | 357 MB | 243 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 1.4 GB | 1.4 GB | 1.5 GB | +| SERVER-MAX-CPU-USAGE | 451.00 % | 723.67 % | 436.67 % | +| SERVER-MAX-MEMORY-USAGE | 1.2 GB | 4.7 GB | 4.9 GB | +| CLIENT-MAX-CPU-USAGE | 554.00 % | 1227.00 % | 218.00 % | +| CLIENT-MAX-MEMORY-USAGE | 264 MB | 5.5 GB | 114 MB | +| CLIENT-ERROR-COUNT | 0 | 4,962 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 74 | 315 | 102 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 100,644 | 82,186 | 481,109 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 442,860 | 8,179,180 | 20,434,060 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 2.7 GB | 7.3 GB | 3.0 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: could not connect to a server" (count 3,301) +"zk: connection closed" (count 1,661) +``` + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/03-write-1M-keys-1000-client/AVG-TRANSMIT-BYTES-NUM-DELTA + + + + + +


+##### Write 3-million keys, 256-byte key, 1KB value, Best Throughput (etcd 700, Zookeeper 300, Consul 500 clients) + +- 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) + + +``` ++----------------------------------------+-------------------+------------------------+-----------------------+ +| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 | ++----------------------------------------+-------------------+------------------------+-----------------------+ +| TOTAL-SECONDS | 141.1728 sec | 4134.1565 sec | 2979.6229 sec | +| TOTAL-REQUEST-NUMBER | 3,000,000 | 3,000,000 | 3,000,000 | +| MAX-THROUGHPUT | 32,215 req/sec | 38,259 req/sec | 15,784 req/sec | +| AVG-THROUGHPUT | 21,250 req/sec | 465 req/sec | 1,006 req/sec | +| MIN-THROUGHPUT | 9,081 req/sec | 0 req/sec | 0 req/sec | +| FASTEST-LATENCY | 3.6479 ms | 1.8912 ms | 10.3322 ms | +| AVG-LATENCY | 32.9036 ms | 28.5018 ms | 496.5874 ms | +| SLOWEST-LATENCY | 1030.3392 ms | 4729.8104 ms | 34484.1252 ms | +| Latency p10 | 10.882650 ms | 5.694308 ms | 35.045139 ms | +| Latency p25 | 13.005974 ms | 6.357600 ms | 44.711879 ms | +| Latency p50 | 18.743999 ms | 7.379354 ms | 66.739638 ms | +| Latency p75 | 31.054943 ms | 8.886502 ms | 116.150396 ms | +| Latency p90 | 96.027241 ms | 11.474394 ms | 540.305996 ms | +| Latency p95 | 123.844111 ms | 14.391699 ms | 1209.603980 ms | +| Latency p99 | 148.837786 ms | 722.847010 ms | 11957.052613 ms | +| Latency p99.9 | 162.994644 ms | 2457.522611 ms | 26068.610794 ms | +| SERVER-TOTAL-NETWORK-RECEIVE-DATA-SUM | 15 GB | 26 GB | 102 GB | +| SERVER-TOTAL-NETWORK-TRANSMIT-DATA-SUM | 12 GB | 24 GB | 98 GB | +| CLIENT-TOTAL-NETWORK-RECEIVE-SUM | 832 MB | 978 MB | 688 MB | +| CLIENT-TOTAL-NETWORK-TRANSMIT-SUM | 4.3 GB | 3.3 GB | 4.4 GB | +| SERVER-MAX-CPU-USAGE | 421.00 % | 752.33 % | 410.67 % | +| SERVER-MAX-MEMORY-USAGE | 2.8 GB | 7.1 GB | 17 GB | +| CLIENT-MAX-CPU-USAGE | 442.00 % | 376.00 % | 217.00 % | +| CLIENT-MAX-MEMORY-USAGE | 265 MB | 1.9 GB | 174 MB | +| CLIENT-ERROR-COUNT | 0 | 1,076,632 | 0 | +| SERVER-AVG-READS-COMPLETED-DELTA-SUM | 14 | 309 | 94,864 | +| SERVER-AVG-SECTORS-READS-DELTA-SUM | 0 | 0 | 0 | +| SERVER-AVG-WRITES-COMPLETED-DELTA-SUM | 333,196 | 360,314 | 3,689,221 | +| SERVER-AVG-SECTORS-WRITTEN-DELTA-SUM | 1,604,172 | 67,295,610 | 794,919,246 | +| SERVER-AVG-DATA-SIZE-ON-DISK | 6.5 GB | 27 GB | 8.2 GB | ++----------------------------------------+-------------------+------------------------+-----------------------+ + + +zookeeper errors: +"zk: connection closed" (count 6,678) +"zk: could not connect to a server" (count 1,069,954) +``` + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-LATENCY-MS-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-THROUGHPUT + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-NON-VOLUNTARY-CTXT-SWITCHES + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-CPU + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-VMRSS-MB-BY-KEY-ERROR-POINTS + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-READS-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-READ-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-WRITES-COMPLETED-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-SECTORS-WRITTEN-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-RECEIVE-BYTES-NUM-DELTA + + + +2017Q1-00-etcd-zookeeper-consul/04-write-too-many-keys/AVG-TRANSMIT-BYTES-NUM-DELTA + + + diff --git a/control/util_math.go b/util_math.go similarity index 82% rename from control/util_math.go rename to util_math.go index 0da7a63f..6c7c477c 100644 --- a/control/util_math.go +++ b/util_math.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import "time" @@ -27,7 +27,7 @@ func max(n1, n2 int64) int64 { return n2 } -func assignRequest(ranges []int, total int) (rs []int) { +func assignRequest(ranges []int64, total int64) (rs []int64) { reqEach := int(float64(total) / float64(len(ranges))) // truncate 10000th digits if reqEach > 10000 { @@ -38,14 +38,14 @@ func assignRequest(ranges []int, total int) (rs []int) { reqEach = (reqEach / 1000) * 1000 } - curSum := 0 - rs = make([]int, len(ranges)) + curSum := int64(0) + rs = make([]int64, len(ranges)) for i := range ranges { if i < len(ranges)-1 { - rs[i] = reqEach - curSum += reqEach + rs[i] = int64(reqEach) + curSum += int64(reqEach) } else { - rs[i] = total - curSum + rs[i] = int64(total) - curSum } } return diff --git a/control/util_math_test.go b/util_math_test.go similarity index 81% rename from control/util_math_test.go rename to util_math_test.go index 623e16a6..f745dedb 100644 --- a/control/util_math_test.go +++ b/util_math_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "reflect" @@ -20,15 +20,15 @@ import ( ) func Test_assignRequest(t *testing.T) { - ranges := []int{1, 10, 50, 100, 300, 500, 700, 1000} - total := 1000000 + ranges := []int64{1, 10, 50, 100, 300, 500, 700, 1000} + total := int64(1000000) rs := assignRequest(ranges, total) - expected := []int{120000, 120000, 120000, 120000, 120000, 120000, 120000, 160000} + expected := []int64{120000, 120000, 120000, 120000, 120000, 120000, 120000, 160000} if !reflect.DeepEqual(rs, expected) { t.Fatalf("expected %+v, got %+v", expected, rs) } - cur := 0 + cur := int64(0) for _, v := range expected { cur += v } diff --git a/control/util_os.go b/util_os.go similarity index 99% rename from control/util_os.go rename to util_os.go index 4ebe4de8..08e99a37 100644 --- a/control/util_os.go +++ b/util_os.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "io" diff --git a/control/util_random_key.go b/util_random_key.go similarity index 85% rename from control/util_random_key.go rename to util_random_key.go index 516b05ba..3a35fd6a 100644 --- a/control/util_random_key.go +++ b/util_random_key.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester import ( "crypto/rand" @@ -24,20 +24,20 @@ import ( ) // sequentialKey returns '00012' when size is 5 and num is 12. -func sequentialKey(size, num int) string { +func sequentialKey(size, num int64) string { txt := fmt.Sprintf("%d", num) - if len(txt) > size { + if len(txt) > int(size) { return txt } - delta := size - len(txt) + delta := int(size) - len(txt) return strings.Repeat("0", delta) + txt } -func sameKey(size int) string { - return strings.Repeat("a", size) +func sameKey(size int64) string { + return strings.Repeat("a", int(size)) } -func randBytes(bytesN int) []byte { +func randBytes(bytesN int64) []byte { const ( letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" letterIdxBits = 6 // 6 bits to represent a letter index @@ -70,9 +70,9 @@ func mustRandBytes(n int) []byte { return rb } -func multiRandStrings(keyN, sliceN int) []string { +func multiRandStrings(keyN, sliceN int64) []string { m := make(map[string]struct{}) - for len(m) != sliceN { + for int64(len(m)) != sliceN { m[string(randBytes(keyN))] = struct{}{} } rs := make([]string, sliceN) diff --git a/control/util_sort.go b/util_sort.go similarity index 97% rename from control/util_sort.go rename to util_sort.go index 54dde9a3..2fb3e43e 100644 --- a/control/util_sort.go +++ b/util_sort.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package control +package dbtester type int64Slice []int64