diff --git a/README.md b/README.md
index a3d39ccb..d42cae33 100644
--- a/README.md
+++ b/README.md
@@ -32,34 +32,39 @@ 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 | 335 | 217 | 257 |
-| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 |
-| WRITES-COMPLETED-DELTA-SUM | 1,231,556 | 955,211 | 2,516,639 |
-| SECTORS-WRITTEN-DELTA-SUM | 729,836 | 10,554,668 | 44,590,452 |
-| AVG-DATA-SIZE | 2.4 GB | 7.7 GB | 3.0 GB |
-| RECEIVE-BYTES-SUM | 5.1 GB | 5.4 GB | 7.9 GB |
-| TRANSMIT-BYTES-SUM | 3.9 GB | 4.4 GB | 6.7 GB |
-| MAX-CPU-USAGE | 445.33 % | 547.73 % | 411.23 % |
-| MAX-MEMORY-USAGE | 1348.55 MB | 3886.00 MB | 6300.68 MB |
-| TOTAL-SECONDS | 348.6809 sec | 325.9369 sec | 833.0403 sec |
-| MAX-THROUGHPUT | 35,607 req/sec | 36,742 req/sec | 14,389 req/sec |
-| AVG-THROUGHPUT | 2,867 req/sec | 3,060 req/sec | 1,200 req/sec |
-| MIN-THROUGHPUT | 154 req/sec | 0 req/sec | 0 req/sec |
-| FASTEST-LATENCY | 1.1331 ms | 1.1178 ms | 3.0202 ms |
-| AVG-LATENCY | 13.9505 ms | 30.7027 ms | 199.2154 ms |
-| SLOWEST-LATENCY | 268.1365 ms | 4791.4295 ms | 22578.4875 ms |
-| Latency p10 | 2.329807 ms | 2.425453 ms | 3.935582 ms |
-| Latency p25 | 5.932790 ms | 3.847339 ms | 7.653584 ms |
-| Latency p50 | 10.211023 ms | 6.907074 ms | 21.364391 ms |
-| Latency p75 | 17.023281 ms | 13.768245 ms | 59.155494 ms |
-| Latency p90 | 28.458718 ms | 23.767844 ms | 161.821492 ms |
-| Latency p95 | 43.808491 ms | 29.821734 ms | 317.361200 ms |
-| Latency p99 | 62.109107 ms | 699.922794 ms | 4416.572182 ms |
-| Latency p99.9 | 92.473754 ms | 2228.556340 ms | 20750.406953 ms |
-+----------------------------+-------------------+------------------------+-----------------------+
++-----------------------------+-------------------+------------------------+-----------------------+
+| | 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 | 1316.36 MB | 3596.23 MB | 4691.18 MB |
+| 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 |
++-----------------------------+-------------------+------------------------+-----------------------+
```
@@ -94,3 +99,5 @@ All logs and results can be found at https://console.cloud.google.com/storage/br
+
+
diff --git a/analyze/analyze_data_3_benchmark_metrics.go b/analyze/analyze_data_3_benchmark_metrics.go
index 77ae1ab1..13957451 100644
--- a/analyze/analyze_data_3_benchmark_metrics.go
+++ b/analyze/analyze_data_3_benchmark_metrics.go
@@ -86,13 +86,6 @@ func (data *analyzeData) importBenchMetrics(fpath string) (err error) {
return err
}
- type rowData struct {
- clientN int64
- minLat float64
- avgLat float64
- maxLat float64
- throughput float64
- }
sec2Data := make(map[int64]rowData)
for i := 0; i < oldTSCol.Count(); i++ {
tv, err := oldTSCol.Value(i)
@@ -185,14 +178,7 @@ func (data *analyzeData) importBenchMetrics(fpath string) (err error) {
v, ok := sec2Data[second]
if !ok {
- prev, pok := sec2Data[second-1]
- if !pok {
- prev, pok = sec2Data[second+1]
- if !pok {
- return fmt.Errorf("benchmark missing a lot of rows around %d", second)
- }
- }
-
+ prev := findClosest(second, sec2Data)
newControlClientNumCol.PushBack(dataframe.NewStringValue(prev.clientN))
newMinLatencyCol.PushBack(dataframe.NewStringValue(0.0))
newAvgLatencyCol.PushBack(dataframe.NewStringValue(0.0))
@@ -231,3 +217,59 @@ func (data *analyzeData) importBenchMetrics(fpath string) (err error) {
data.benchMetrics.frame = df
return
}
+
+type rowData struct {
+ clientN int64
+ minLat float64
+ avgLat float64
+ maxLat float64
+ throughput float64
+}
+
+func findClosest(second int64, sec2Data map[int64]rowData) rowData {
+ v, ok := sec2Data[second]
+ if ok {
+ return v
+ }
+ var min int64
+ var max int64
+ for k := range sec2Data {
+ if min == 0 || min > k {
+ min = k
+ }
+ if max == 0 || max < k {
+ max = k
+ }
+ }
+ r, ok := _findClosestLower(second, sec2Data, min, max)
+ if ok {
+ return r
+ }
+ r, ok = _findClosestUpper(second, sec2Data, min, max)
+ if !ok {
+ panic(fmt.Errorf("something wrong with benchmark data... too many data points are missing"))
+ }
+ return r
+}
+
+func _findClosestUpper(second int64, sec2Data map[int64]rowData, min, max int64) (rowData, bool) {
+ if second < min || second > max {
+ return rowData{}, false
+ }
+ v, ok := sec2Data[second]
+ if ok {
+ return v, true
+ }
+ return _findClosestUpper(second+1, sec2Data, min, max)
+}
+
+func _findClosestLower(second int64, sec2Data map[int64]rowData, min, max int64) (rowData, bool) {
+ if second < min || second > max {
+ return rowData{}, false
+ }
+ v, ok := sec2Data[second]
+ if ok {
+ return v, true
+ }
+ return _findClosestLower(second-1, sec2Data, min, max)
+}
diff --git a/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md b/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md
index 91c535ff..0322c241 100755
--- a/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md
+++ b/bench-results/2017Q1-02-etcd-zookeeper-consul/README.md
@@ -16,34 +16,39 @@
```
-+----------------------------+-------------------+------------------------+-----------------------+
-| | etcd-v3.1-go1.7.4 | zookeeper-r3.4.9-java8 | consul-v0.7.3-go1.7.4 |
-+----------------------------+-------------------+------------------------+-----------------------+
-| READS-COMPLETED-DELTA | 335 | 217 | 257 |
-| SECTORS-READS-DELTA-SUM | 0 | 0 | 0 |
-| WRITES-COMPLETED-DELTA-SUM | 1,231,556 | 955,211 | 2,516,639 |
-| SECTORS-WRITTEN-DELTA-SUM | 729,836 | 10,554,668 | 44,590,452 |
-| AVG-DATA-SIZE | 2.4 GB | 7.7 GB | 3.0 GB |
-| RECEIVE-BYTES-SUM | 5.1 GB | 5.4 GB | 7.9 GB |
-| TRANSMIT-BYTES-SUM | 3.9 GB | 4.4 GB | 6.7 GB |
-| MAX-CPU-USAGE | 445.33 % | 547.73 % | 411.23 % |
-| MAX-MEMORY-USAGE | 1348.55 MB | 3886.00 MB | 6300.68 MB |
-| TOTAL-SECONDS | 348.6809 sec | 325.9369 sec | 833.0403 sec |
-| MAX-THROUGHPUT | 35,607 req/sec | 36,742 req/sec | 14,389 req/sec |
-| AVG-THROUGHPUT | 2,867 req/sec | 3,060 req/sec | 1,200 req/sec |
-| MIN-THROUGHPUT | 154 req/sec | 0 req/sec | 0 req/sec |
-| FASTEST-LATENCY | 1.1331 ms | 1.1178 ms | 3.0202 ms |
-| AVG-LATENCY | 13.9505 ms | 30.7027 ms | 199.2154 ms |
-| SLOWEST-LATENCY | 268.1365 ms | 4791.4295 ms | 22578.4875 ms |
-| Latency p10 | 2.329807 ms | 2.425453 ms | 3.935582 ms |
-| Latency p25 | 5.932790 ms | 3.847339 ms | 7.653584 ms |
-| Latency p50 | 10.211023 ms | 6.907074 ms | 21.364391 ms |
-| Latency p75 | 17.023281 ms | 13.768245 ms | 59.155494 ms |
-| Latency p90 | 28.458718 ms | 23.767844 ms | 161.821492 ms |
-| Latency p95 | 43.808491 ms | 29.821734 ms | 317.361200 ms |
-| Latency p99 | 62.109107 ms | 699.922794 ms | 4416.572182 ms |
-| Latency p99.9 | 92.473754 ms | 2228.556340 ms | 20750.406953 ms |
-+----------------------------+-------------------+------------------------+-----------------------+
++-----------------------------+-------------------+------------------------+-----------------------+
+| | 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 | 1316.36 MB | 3596.23 MB | 4691.18 MB |
+| 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 |
++-----------------------------+-------------------+------------------------+-----------------------+
```
diff --git a/glide.lock b/glide.lock
index 8f5ebf68..120573da 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,5 +1,5 @@
-hash: e4221ab3d1946bec9cdc59b39500f727496088a18b9cc31889a46f608a6e562a
-updated: 2017-02-04T20:14:17.251307566-08:00
+hash: 35875650d8e05eff855d29a77c8ddf25cbb1be878950c57324f680ee3808401a
+updated: 2017-02-04T20:30:04.541079683-08:00
imports:
- name: bitbucket.org/zombiezen/gopdf
version: 1c63dc69751bc45441c2ce1f56b631c55294b4d5
@@ -96,7 +96,7 @@ imports:
- runtime/internal
- utilities
- name: github.com/gyuho/dataframe
- version: f9fe6fd9537b000e95362aefbcc0250679e1549b
+ version: 73de2c550b1177c1640f3dacbbc1af00f913fedb
- name: github.com/gyuho/psn
version: 04e255d485181cbe8bc9002416a2ad3143f104ba
subpackages:
diff --git a/glide.yaml b/glide.yaml
index ed2e2982..7d9b2d7a 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -53,7 +53,7 @@ import:
- vg/vgpdf
- vg/vgsvg
- package: github.com/gyuho/dataframe
- version: f9fe6fd9537b000e95362aefbcc0250679e1549b
+ version: 73de2c550b1177c1640f3dacbbc1af00f913fedb
- package: github.com/gyuho/psn
version: 04e255d485181cbe8bc9002416a2ad3143f104ba
- package: github.com/hashicorp/consul
diff --git a/vendor/github.com/gyuho/dataframe/dataframe.go b/vendor/github.com/gyuho/dataframe/dataframe.go
index bbe89cee..cfdbc51c 100644
--- a/vendor/github.com/gyuho/dataframe/dataframe.go
+++ b/vendor/github.com/gyuho/dataframe/dataframe.go
@@ -62,6 +62,8 @@ func New() Frame {
}
// NewFromRows creates Frame from rows.
+// Pass 'nil' header if first row is used as header strings.
+// Pass 'non-nil' header if the data starts from the first row, without header strings.
func NewFromRows(header []string, rows [][]string) (Frame, error) {
if len(rows) < 1 {
return nil, fmt.Errorf("empty row %q", rows)
@@ -129,6 +131,8 @@ func NewFromRows(header []string, rows [][]string) (Frame, error) {
}
// NewFromCSV creates a new Frame from CSV.
+// Pass 'nil' header if first row is used as header strings.
+// Pass 'non-nil' header if the data starts from the first row, without header strings.
func NewFromCSV(header []string, fpath string) (Frame, error) {
f, err := openToRead(fpath)
if err != nil {