Skip to content

Commit fda001d

Browse files
wenyihu6tbg
authored andcommitted
asim: simplify logic in history.ShowRecordedValueAt
Previously, we introduced support for showing initial and final metric values in 3da645a, including an additional sorting step. However, the store metrics were already provided in sorted order. This commit removes the unnecessary sorting to simplify the logic. Epic: none Release note: none
1 parent 0e24e97 commit fda001d

File tree

12 files changed

+115
-116
lines changed

12 files changed

+115
-116
lines changed

pkg/kv/kvserver/asim/history/history.go

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package history
88
import (
99
"context"
1010
"fmt"
11-
"sort"
1211
"strings"
1312

1413
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/asim/metrics"
@@ -20,6 +19,10 @@ import (
2019
// Currently it only contains the store metrics of the run.
2120
// TODO(kvoli): Add a range log like structure to the history.
2221
type History struct {
22+
// Recorded contains per-store metrics snapshots at each tick. The outer slice
23+
// grows over time at each tick, while each inner slice has one StoreMetrics per
24+
// store. E.g. Recorded[0] is the first tick, Recorded[0][0] is the first store's
25+
// metrics at the first tick.
2326
Recorded [][]metrics.StoreMetrics
2427
S state.State
2528
}
@@ -31,72 +34,30 @@ func (h *History) Listen(ctx context.Context, sms []metrics.StoreMetrics) {
3134

3235
func (h *History) ShowRecordedValueAt(idx int, stat string) string {
3336
var buf strings.Builder
34-
type storeIDWithStat struct {
35-
StoreID int64
36-
Value float64
37-
}
38-
tick := h.Recorded[idx]
39-
orderedStoreIDs := make([]storeIDWithStat, 0, len(tick))
40-
values := make([]float64, 0, len(tick))
41-
for _, sm := range tick {
42-
var value float64
43-
switch stat {
44-
case "qps":
45-
value = float64(sm.QPS)
46-
// case "cpu":
47-
// value = float64(sm.CPU)
48-
// case "write_bytes_per_second":
49-
// value = float64(sm.WriteBytesPerSecond)
50-
case "write":
51-
value = float64(sm.WriteKeys)
52-
case "write_b":
53-
value = float64(sm.WriteBytes)
54-
case "read":
55-
value = float64(sm.ReadKeys)
56-
case "read_b":
57-
value = float64(sm.ReadBytes)
58-
case "replicas":
59-
value = float64(sm.Replicas)
60-
case "leases":
61-
value = float64(sm.Leases)
62-
case "lease_moves":
63-
value = float64(sm.LeaseTransfers)
64-
case "replica_moves":
65-
value = float64(sm.Rebalances)
66-
case "replica_b_rcvd":
67-
value = float64(sm.RebalanceRcvdBytes)
68-
case "replica_b_sent":
69-
value = float64(sm.RebalanceSentBytes)
70-
case "range_splits":
71-
value = float64(sm.RangeSplits)
72-
case "disk_fraction_used":
73-
value = sm.DiskFractionUsed
74-
default:
75-
return "<unrecognized stat>"
76-
}
77-
orderedStoreIDs = append(orderedStoreIDs, storeIDWithStat{
78-
StoreID: sm.StoreID,
79-
Value: value,
80-
})
81-
values = append(values, value)
82-
}
83-
sort.Slice(orderedStoreIDs, func(i, j int) bool {
84-
return orderedStoreIDs[i].StoreID < orderedStoreIDs[j].StoreID
85-
})
37+
38+
storeMetricsAtTick := h.Recorded[idx]
39+
values := make([]float64, 0, len(storeMetricsAtTick))
40+
8641
_, _ = fmt.Fprintf(&buf, "[")
87-
for i, store := range orderedStoreIDs {
42+
43+
// Extract values for each store. Note that h.Recorded[idx] is already sorted
44+
// by store ID when appending to h.Recorded.
45+
for i, sm := range storeMetricsAtTick {
8846
if i > 0 {
89-
_, _ = fmt.Fprintf(&buf, " ")
47+
_, _ = fmt.Fprintf(&buf, ", ")
9048
}
49+
value := sm.GetMetricValue(stat)
9150
if stat == "disk_fraction_used" {
92-
_, _ = fmt.Fprintf(&buf, "s%v=%.2f", store.StoreID, store.Value)
51+
_, _ = fmt.Fprintf(&buf, "s%v=%.2f", sm.StoreID, value)
9352
} else {
94-
_, _ = fmt.Fprintf(&buf, "s%v=%.0f", store.StoreID, store.Value)
53+
_, _ = fmt.Fprintf(&buf, "s%v=%.0f", sm.StoreID, value)
9554
}
55+
values = append(values, value)
9656
}
9757
_, _ = fmt.Fprintf(&buf, "]")
9858
stddev, _ := stats.StandardDeviation(values)
59+
mean, _ := stats.Mean(values)
9960
sum, _ := stats.Sum(values)
100-
_, _ = fmt.Fprintf(&buf, " (stddev=%.2f,sum=%.2f)", stddev, sum)
61+
_, _ = fmt.Fprintf(&buf, " (stddev=%.2f, mean=%.2f, sum=%.0f)", stddev, mean, sum)
10162
return buf.String()
10263
}

pkg/kv/kvserver/asim/metrics/tracker.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,44 @@ type StoreMetrics struct {
4040
DiskFractionUsed float64
4141
}
4242

43+
// GetMetricValue extracts the requested metric value from StoreMetrics.
44+
func (sm *StoreMetrics) GetMetricValue(stat string) float64 {
45+
switch stat {
46+
case "qps":
47+
return float64(sm.QPS)
48+
// case "cpu":
49+
// value = float64(sm.CPU)
50+
// case "write_bytes_per_second":
51+
// value = float64(sm.WriteBytesPerSecond)
52+
case "write":
53+
return float64(sm.WriteKeys)
54+
case "write_b":
55+
return float64(sm.WriteBytes)
56+
case "read":
57+
return float64(sm.ReadKeys)
58+
case "read_b":
59+
return float64(sm.ReadBytes)
60+
case "replicas":
61+
return float64(sm.Replicas)
62+
case "leases":
63+
return float64(sm.Leases)
64+
case "lease_moves":
65+
return float64(sm.LeaseTransfers)
66+
case "replica_moves":
67+
return float64(sm.Rebalances)
68+
case "replica_b_rcvd":
69+
return float64(sm.RebalanceRcvdBytes)
70+
case "replica_b_sent":
71+
return float64(sm.RebalanceSentBytes)
72+
case "range_splits":
73+
return float64(sm.RangeSplits)
74+
case "disk_fraction_used":
75+
return sm.DiskFractionUsed
76+
default:
77+
return 0
78+
}
79+
}
80+
4381
// the MetricsTracker to report new store metrics for a tick.
4482
type StoreMetricsListener interface {
4583
Listen(context.Context, []StoreMetrics)

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_add_node

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ plot stat=replicas sample=1
5252
20 ┤ ╭──╯
5353
0 ┼─╯
5454
replicas
55-
initial store values: [s1=301 s2=0 s3=0] (stddev=141.89,sum=301.00)
56-
last store values: [s1=300 s2=301 s3=300] (stddev=0.47,sum=901.00)
55+
initial store values: [s1=301, s2=0, s3=0] (stddev=141.89, mean=100.33, sum=301)
56+
last store values: [s1=300, s2=301, s3=300] (stddev=0.47, mean=300.33, sum=901)
5757

5858
# vim:ft=sh

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_fulldisk

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ plot stat=replicas
3636
164 ┤ ╰─╯ ╰──╮╭─────╮╭╮
3737
151 ┤ ╰╯ ╰╯╰─────
3838
replicas
39-
initial store values: [s1=300 s2=300 s3=300 s4=300 s5=300] (stddev=0.00,sum=1500.00)
40-
last store values: [s1=342 s2=338 s3=339 s4=334 s5=156] (stddev=72.94,sum=1509.00)
39+
initial store values: [s1=300, s2=300, s3=300, s4=300, s5=300] (stddev=0.00, mean=300.00, sum=1500)
40+
last store values: [s1=342, s2=338, s3=339, s4=334, s5=156] (stddev=72.94, mean=301.80, sum=1509)
4141

4242
# Plot the % of disk storage capacity used. We should see s5 hovering right
4343
# around 92.5-95% (the storage capacity threshold value).
@@ -60,5 +60,5 @@ plot stat=disk_fraction_used
6060
0.07 ┤
6161
0.00 ┼───────────────────────────────────────────────────────────────────────────────
6262
disk_fraction_used
63-
initial store values: [s1=0.00 s2=0.00 s3=0.00 s4=0.00 s5=0.83] (stddev=0.33,sum=0.83)
64-
last store values: [s1=0.00 s2=0.00 s3=0.00 s4=0.00 s5=0.94] (stddev=0.38,sum=0.94)
63+
initial store values: [s1=0.00, s2=0.00, s3=0.00, s4=0.00, s5=0.83] (stddev=0.33, mean=0.17, sum=1)
64+
last store values: [s1=0.00, s2=0.00, s3=0.00, s4=0.00, s5=0.94] (stddev=0.38, mean=0.19, sum=1)

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_io_overload

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ plot stat=replicas
3535
33 ┤ ╭───╯
3636
0 ┼───────────────────────────────────────────────────────────────────────────────
3737
replicas
38-
initial store values: [s1=500 s2=500 s3=500 s4=0 s5=0] (stddev=244.95,sum=1500.00)
39-
last store values: [s1=372 s2=381 s3=371 s4=376 s5=0] (stddev=150.04,sum=1500.00)
38+
initial store values: [s1=500, s2=500, s3=500, s4=0, s5=0] (stddev=244.95, mean=300.00, sum=1500)
39+
last store values: [s1=372, s2=381, s3=371, s4=376, s5=0] (stddev=150.04, mean=300.00, sum=1500)
4040

4141
plot stat=leases
4242
----
@@ -57,5 +57,5 @@ plot stat=leases
5757
33 ┤ ╭─────────╯ ╭╭────────────╯
5858
0 ┼───────────────────────────────────────────────────────────────────────────────
5959
leases
60-
initial store values: [s1=500 s2=0 s3=0 s4=0 s5=0] (stddev=200.00,sum=500.00)
61-
last store values: [s1=230 s2=98 s3=67 s4=105 s5=0] (stddev=74.86,sum=500.00)
60+
initial store values: [s1=500, s2=0, s3=0, s4=0, s5=0] (stddev=200.00, mean=100.00, sum=500)
61+
last store values: [s1=230, s2=98, s3=67, s4=105, s5=0] (stddev=74.86, mean=100.00, sum=500)

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_liveness

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ plot stat=replicas
5050
29 ┤ ╰───╮ ╰───────╮
5151
0 ┤ ╰────────────────────────────────────────────────
5252
replicas
53-
initial store values: [s1=300 s2=300 s3=300 s4=300 s5=300 s6=300 s7=300] (stddev=0.00,sum=2100.00)
54-
last store values: [s1=430 s2=428 s3=409 s4=414 s5=419 s6=0 s7=0] (stddev=189.86,sum=2100.00)
53+
initial store values: [s1=300, s2=300, s3=300, s4=300, s5=300, s6=300, s7=300] (stddev=0.00, mean=300.00, sum=2100)
54+
last store values: [s1=430, s2=428, s3=409, s4=414, s5=419, s6=0, s7=0] (stddev=189.86, mean=300.00, sum=2100)
5555

5656
# Both nodes should begin losing leases immediately after their liveness status
5757
# is changed to dead or decommissioning (5 minutes later).
@@ -74,7 +74,7 @@ plot stat=leases
7474
10 ┤ ╰──╮ ╰──╮
7575
0 ┤ ╰───────────────────────────────────────────────
7676
leases
77-
initial store values: [s1=100 s2=100 s3=100 s4=100 s5=100 s6=100 s7=100] (stddev=0.00,sum=700.00)
78-
last store values: [s1=135 s2=147 s3=140 s4=141 s5=137 s6=0 s7=0] (stddev=63.34,sum=700.00)
77+
initial store values: [s1=100, s2=100, s3=100, s4=100, s5=100, s6=100, s7=100] (stddev=0.00, mean=100.00, sum=700)
78+
last store values: [s1=135, s2=147, s3=140, s4=141, s5=137, s6=0, s7=0] (stddev=63.34, mean=100.00, sum=700)
7979

8080
# vim:ft=sh

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_multi_store

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ plot stat=leases
4040
0.93 ┤ ╭─╯────────────╭──────────────────────────────────────────────────────────────
4141
0.00 ┼────────────────╯───────────────────────────────╯
4242
leases
43-
initial store values: [s1=14 s2=0 s3=0 s4=0 s5=0 s6=0 s7=0 s8=0 s9=0 s10=0 s11=0 s12=0 s13=0 s14=0] (stddev=3.61,sum=14.00)
44-
last store values: [s1=1 s2=1 s3=1 s4=1 s5=1 s6=1 s7=1 s8=1 s9=1 s10=1 s11=1 s12=1 s13=1 s14=1] (stddev=0.00,sum=14.00)
43+
initial store values: [s1=14, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0, s8=0, s9=0, s10=0, s11=0, s12=0, s13=0, s14=0] (stddev=3.61, mean=1.00, sum=14)
44+
last store values: [s1=1, s2=1, s3=1, s4=1, s5=1, s6=1, s7=1, s8=1, s9=1, s10=1, s11=1, s12=1, s13=1, s14=1] (stddev=0.00, mean=1.00, sum=14)

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_rebalancing

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ plot stat=qps sample=2
5959
335 ┤ │││ │ │ │
6060
0 ┼─────────────────────────────╯─────────────────────────╯
6161
qps
62-
initial store values: [s1=0 s2=0 s3=0 s4=0 s5=0 s6=0 s7=0] (stddev=0.00,sum=0.00)
63-
last store values: [s1=996 s2=997 s3=996 s4=1000 s5=1000 s6=1005 s7=1001] (stddev=3.01,sum=6995.00)
62+
initial store values: [s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0] (stddev=0.00, mean=0.00, sum=0)
63+
last store values: [s1=996, s2=997, s3=996, s4=1000, s5=1000, s6=1005, s7=1001] (stddev=3.01, mean=999.29, sum=6995)
6464

6565
# The cluster settings and simulation variables can be modified to examine how
6666
# allocation behaves during uncommon scenarios. Update the gossip delay to be
@@ -97,8 +97,8 @@ plot stat=qps sample=3
9797
467 ┤ │ │││ ││ │ │ ││ │
9898
0 ┼─────────────────────────────────╯───────────────╯
9999
qps
100-
initial store values: [s1=0 s2=0 s3=0 s4=0 s5=0 s6=0 s7=0] (stddev=0.00,sum=0.00)
101-
last store values: [s1=1003 s2=997 s3=1002 s4=1003 s5=999 s6=994 s7=999] (stddev=3.11,sum=6997.00)
100+
initial store values: [s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0] (stddev=0.00, mean=0.00, sum=0)
101+
last store values: [s1=1003, s2=997, s3=1002, s4=1003, s5=999, s6=994, s7=999] (stddev=3.11, mean=999.57, sum=6997)
102102

103103
# Plot the replica movements for the same sample, we should see a steadily
104104
# increasing counter for each store; indicating that rebalancing activity is
@@ -122,7 +122,7 @@ plot stat=replica_moves sample=3
122122
0.93 ┤ │╭╭╯────│ ╭──────╯ ╭──────────────────────────────
123123
0.00 ┼────────────────────────────────────────────────╯
124124
replica_moves
125-
initial store values: [s1=0 s2=0 s3=0 s4=0 s5=0 s6=0 s7=0] (stddev=0.00,sum=0.00)
126-
last store values: [s1=14 s2=6 s3=5 s4=5 s5=5 s6=2 s7=1] (stddev=3.89,sum=38.00)
125+
initial store values: [s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0] (stddev=0.00, mean=0.00, sum=0)
126+
last store values: [s1=14, s2=6, s3=5, s4=5, s5=5, s6=2, s7=1] (stddev=3.89, mean=5.43, sum=38)
127127

128128
# vim:ft=sh

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_splitting

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ plot stat=replicas sample=2
4646
1.33 ┤ │
4747
1.00 ┼───╯
4848
replicas
49-
initial store values: [s1=1] (stddev=0.00,sum=1.00)
50-
last store values: [s1=6] (stddev=0.00,sum=6.00)
49+
initial store values: [s1=1] (stddev=0.00, mean=1.00, sum=1)
50+
last store values: [s1=6] (stddev=0.00, mean=6.00, sum=6)
5151

5252
# Update the load generator to use a zipfian distribution instead of a uniform.
5353
# Now the load based splitter must find a split key from a skewed distribution
5454
# repeatedly - if the load split algorithm is good, we should expect the same
5555
# number of splits as the uniform workload. However, that is not the case as we
5656
# require more splits with a zipfian distribution.
57-
gen_load rate=10000 rw_ratio=1 access_skew=true replace=true
57+
gen_load rate=10000 rw_ratio=1 access_skew=true
5858
----
5959

6060
eval duration=5m samples=2 seed=42
@@ -63,24 +63,24 @@ OK
6363

6464
plot stat=replicas sample=4
6565
----
66-
9.00 ┤ ╭────────────────────────────────────────────────────
67-
8.47
68-
7.93 ┤ ╭───╯
69-
7.40
70-
6.87 ┤ ╭──╯
71-
6.33 ┤
72-
5.80 ┤ ╭───╯
73-
5.27
74-
4.73 ╭──╯
75-
4.20╭──╯
76-
3.67 ┤ │
77-
3.13╭──╯
78-
2.60
79-
2.07╭──╯
80-
1.53
81-
1.00 ┼───╯
82-
replicas
83-
initial store values: [s1=1] (stddev=0.00,sum=1.00)
84-
last store values: [s1=9] (stddev=0.00,sum=9.00)
66+
15.00 ┤ ──────────────────────────────────────────────
67+
14.07 ╭──╯
68+
13.13 ┤ ╭───╯
69+
12.20╭──╯
70+
11.27 ┤ ╭──╯
71+
10.33 ┤ ╭──╯
72+
9.40 ┤ ╭───╯
73+
8.47╭──╯
74+
7.53
75+
6.60
76+
5.67 ┤ │
77+
4.73
78+
3.80╭──╯
79+
2.87
80+
1.93╭──╯
81+
1.00 ┼───╯
82+
replicas
83+
initial store values: [s1=1] (stddev=0.00, mean=1.00, sum=1)
84+
last store values: [s1=15] (stddev=0.00, mean=15.00, sum=15)
8585

8686
# vim:ft=sh

pkg/kv/kvserver/asim/tests/testdata/non_rand/example_zone_config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,5 @@ plot stat=replicas
7070
3.47 ┤ ╰╰╰╰───────╮─╮
7171
0.00 ┤ ╰──╰╰──╰──╰──────────────────────────────────────────────────────────
7272
replicas
73-
initial store values: [s1=17 s2=17 s3=17 s4=17 s5=17 s6=16 s7=16 s8=17 s9=17 s10=17 s11=17 s12=17 s13=16 s14=16 s15=16 s16=16 s17=17 s18=17 s19=17 s20=16 s21=17 s22=16 s23=17 s24=17 s25=17 s26=17 s27=17 s28=16 s29=17 s30=16 s31=17 s32=17 s33=16 s34=16 s35=17 s36=17] (stddev=0.47,sum=600.00)
74-
last store values: [s1=50 s2=49 s3=50 s4=50 s5=51 s6=49 s7=50 s8=50 s9=52 s10=49 s11=50 s12=50 s13=0 s14=0 s15=0 s16=0 s17=0 s18=0 s19=0 s20=0 s21=0 s22=0 s23=0 s24=0 s25=0 s26=0 s27=0 s28=0 s29=0 s30=0 s31=0 s32=0 s33=0 s34=0 s35=0 s36=0] (stddev=23.57,sum=600.00)
73+
initial store values: [s1=17, s2=17, s3=17, s4=17, s5=17, s6=16, s7=16, s8=17, s9=17, s10=17, s11=17, s12=17, s13=16, s14=16, s15=16, s16=16, s17=17, s18=17, s19=17, s20=16, s21=17, s22=16, s23=17, s24=17, s25=17, s26=17, s27=17, s28=16, s29=17, s30=16, s31=17, s32=17, s33=16, s34=16, s35=17, s36=17] (stddev=0.47, mean=16.67, sum=600)
74+
last store values: [s1=50, s2=49, s3=50, s4=50, s5=51, s6=49, s7=50, s8=50, s9=52, s10=49, s11=50, s12=50, s13=0, s14=0, s15=0, s16=0, s17=0, s18=0, s19=0, s20=0, s21=0, s22=0, s23=0, s24=0, s25=0, s26=0, s27=0, s28=0, s29=0, s30=0, s31=0, s32=0, s33=0, s34=0, s35=0, s36=0] (stddev=23.57, mean=16.67, sum=600)

0 commit comments

Comments
 (0)