Skip to content

Commit 6666e14

Browse files
Added multi command support via -cmd and -cmd-ratio (#21)
* Added multi command support via -cmd and -cmd-ratio * Enabled setting the delay between client setup. * Enable cluster benchmarks on multi-command
1 parent d124862 commit 6666e14

File tree

6 files changed

+815
-33
lines changed

6 files changed

+815
-33
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ coverage.txt
33
redis-benchmark-go
44
dist
55
*.json
6+
dump.rdb

cli.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package main
2+
3+
import (
4+
shellwords "github.com/mattn/go-shellwords"
5+
"log"
6+
"math"
7+
"math/rand"
8+
"strconv"
9+
)
10+
11+
type arrayStringParameters []string
12+
13+
func (i *arrayStringParameters) String() string {
14+
return "my string representation"
15+
}
16+
17+
func (i *arrayStringParameters) Set(value string) error {
18+
*i = append(*i, value)
19+
return nil
20+
}
21+
22+
func sample(cdf []float32) int {
23+
r := rand.Float32()
24+
bucket := 0
25+
for r > cdf[bucket] {
26+
bucket++
27+
}
28+
return bucket
29+
}
30+
31+
func prepareCommandsDistribution(queries arrayStringParameters, cmds [][]string, cmdRates []float64) (int, []float32) {
32+
var totalDifferentCommands = len(cmds)
33+
var totalRateSum = 0.0
34+
var err error
35+
for i, rawCmdString := range queries {
36+
cmds[i], _ = shellwords.Parse(rawCmdString)
37+
if i >= len(benchmarkCommandsRatios) {
38+
cmdRates[i] = 1
39+
40+
} else {
41+
cmdRates[i], err = strconv.ParseFloat(benchmarkCommandsRatios[i], 64)
42+
if err != nil {
43+
log.Fatalf("Error while converting query-rate param %s: %v", benchmarkCommandsRatios[i], err)
44+
}
45+
}
46+
totalRateSum += cmdRates[i]
47+
}
48+
// probability density function
49+
if math.Abs(1.0-totalRateSum) > 0.01 {
50+
log.Fatalf("Total ratio should be 1.0 ( currently is %f )", totalRateSum)
51+
}
52+
// probability density function
53+
if len(benchmarkCommandsRatios) > 0 && (len(benchmarkCommandsRatios) != (len(benchmarkCommands))) {
54+
log.Fatalf("When specifiying -cmd-ratio parameter, you need to have the same number of -cmd and -cmd-ratio parameters. Number of time -cmd ( %d ) != Number of times -cmd-ratio ( %d )", len(benchmarkCommands), len(benchmarkCommandsRatios))
55+
}
56+
pdf := make([]float32, len(queries))
57+
cdf := make([]float32, len(queries))
58+
for i := 0; i < len(cmdRates); i++ {
59+
pdf[i] = float32(cmdRates[i])
60+
cdf[i] = 0
61+
}
62+
// get cdf
63+
cdf[0] = pdf[0]
64+
for i := 1; i < len(cmdRates); i++ {
65+
cdf[i] = cdf[i-1] + pdf[i]
66+
}
67+
return totalDifferentCommands, cdf
68+
}

cluster_conn.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,36 @@ import (
66
"log"
77
)
88

9-
func getOSSClusterConn(addr string, opts radix.Dialer, clients uint64) *radix.Cluster {
9+
func getOSSClusterConn(addr string, dialer radix.Dialer, clients uint64) *radix.Cluster {
1010
var err error
1111
var vanillaCluster *radix.Cluster
1212
var size int = int(clients)
1313
ctx := context.Background()
1414
laddr := make([]string, 1)
1515
laddr[0] = addr
1616
poolConfig := radix.PoolConfig{}
17-
poolConfig.Dialer = opts
17+
poolConfig.Dialer = dialer
1818
poolConfig.Size = size
1919

20+
poolConfig.Dialer.CustomConn = func(ctx context.Context, network, addr string) (radix.Conn, error) {
21+
conn, err := dialer.Dial(ctx, network, addr)
22+
if err != nil {
23+
return nil, err
24+
}
25+
return conn, nil
26+
}
27+
2028
clusterConfig := radix.ClusterConfig{}
2129
clusterConfig.PoolConfig = poolConfig
2230

2331
vanillaCluster, err = clusterConfig.New(ctx, laddr)
2432
if err != nil {
25-
log.Fatalf("Error preparing for benchmark, while creating new connection. error = %v", err)
33+
log.Fatalf("Error preparing for benchmark, while creating new connection to %s. error = %v", addr, err)
2634
}
2735
// Issue CLUSTER SLOTS command
2836
err = vanillaCluster.Sync(ctx)
2937
if err != nil {
30-
log.Fatalf("Error preparing for benchmark, while issuing CLUSTER SLOTS. error = %v", err)
38+
log.Fatalf("Error preparing for benchmark, while issuing CLUSTER SLOTS to %s. error = %v", addr, err)
3139
}
3240
return vanillaCluster
3341
}

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ go 1.14
44

55
require (
66
github.com/HdrHistogram/hdrhistogram-go v1.1.0
7-
github.com/google/go-cmp v0.5.5 // indirect
7+
github.com/mattn/go-shellwords v1.0.12
88
github.com/mediocregopher/radix/v4 v4.1.2
9+
github.com/mitchellh/gox v1.0.1 // indirect
10+
github.com/tcnksm/ghr v0.16.0 // indirect
911
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 // indirect
1012
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
1113
)

0 commit comments

Comments
 (0)