Skip to content

Commit c05feed

Browse files
committed
benchmark: Introduce shared receive buffers(nil and simple) feature
1 parent 711db78 commit c05feed

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

benchmark/benchmain/main.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ var (
109109
clientWriteBufferSize = flags.IntSlice("clientWriteBufferSize", []int{-1}, "Configures the client write buffer size in bytes. If negative, use the default - may be a a comma-separated list")
110110
serverReadBufferSize = flags.IntSlice("serverReadBufferSize", []int{-1}, "Configures the server read buffer size in bytes. If negative, use the default - may be a a comma-separated list")
111111
serverWriteBufferSize = flags.IntSlice("serverWriteBufferSize", []int{-1}, "Configures the server write buffer size in bytes. If negative, use the default - may be a a comma-separated list")
112+
sharedRecvBufferPool = flags.StringWithAllowedValues("sharedRecvBufferPool", sharedRecvBufferPoolAll, "Configures the shared receive buffer pool. One of: nil, simple", allSharedRecvBufferPools)
112113

113114
logger = grpclog.Component("benchmark")
114115
)
@@ -133,6 +134,10 @@ const (
133134
networkModeLAN = "LAN"
134135
networkModeWAN = "WAN"
135136
networkLongHaul = "Longhaul"
137+
// Shared recv buffer pool
138+
sharedRecvBufferPoolNil = "nil"
139+
sharedRecvBufferPoolSimple = "simple"
140+
sharedRecvBufferPoolAll = "all"
136141

137142
numStatsBuckets = 10
138143
warmupCallCount = 10
@@ -144,6 +149,7 @@ var (
144149
allCompModes = []string{compModeOff, compModeGzip, compModeNop, compModeAll}
145150
allToggleModes = []string{toggleModeOff, toggleModeOn, toggleModeBoth}
146151
allNetworkModes = []string{networkModeNone, networkModeLocal, networkModeLAN, networkModeWAN, networkLongHaul}
152+
allSharedRecvBufferPools = []string{sharedRecvBufferPoolNil, sharedRecvBufferPoolSimple, sharedRecvBufferPoolAll}
147153
defaultReadLatency = []time.Duration{0, 40 * time.Millisecond} // if non-positive, no delay.
148154
defaultReadKbps = []int{0, 10240} // if non-positive, infinite
149155
defaultReadMTU = []int{0} // if non-positive, infinite
@@ -321,6 +327,15 @@ func makeClient(bf stats.Features) (testgrpc.BenchmarkServiceClient, func()) {
321327
if bf.ServerWriteBufferSize >= 0 {
322328
sopts = append(sopts, grpc.WriteBufferSize(bf.ServerWriteBufferSize))
323329
}
330+
switch bf.SharedRecvBufferPool {
331+
case sharedRecvBufferPoolNil:
332+
// Do nothing.
333+
case sharedRecvBufferPoolSimple:
334+
opts = append(opts, grpc.WithSharedRecvBufferPool(newSimpleSharedRecvBufferPool()))
335+
sopts = append(sopts, grpc.SharedRecvBufferPool(newSimpleSharedRecvBufferPool()))
336+
default:
337+
logger.Fatalf("Unknown shared recv buffer pool type: %v", bf.SharedRecvBufferPool)
338+
}
324339

325340
sopts = append(sopts, grpc.MaxConcurrentStreams(uint32(bf.MaxConcurrentCalls+1)))
326341
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
@@ -528,6 +543,7 @@ type featureOpts struct {
528543
clientWriteBufferSize []int
529544
serverReadBufferSize []int
530545
serverWriteBufferSize []int
546+
sharedRecvBufferPools []string
531547
}
532548

533549
// makeFeaturesNum returns a slice of ints of size 'maxFeatureIndex' where each
@@ -572,6 +588,8 @@ func makeFeaturesNum(b *benchOpts) []int {
572588
featuresNum[i] = len(b.features.serverReadBufferSize)
573589
case stats.ServerWriteBufferSize:
574590
featuresNum[i] = len(b.features.serverWriteBufferSize)
591+
case stats.SharedRecvBufferPool:
592+
featuresNum[i] = len(b.features.sharedRecvBufferPools)
575593
default:
576594
log.Fatalf("Unknown feature index %v in generateFeatures. maxFeatureIndex is %v", i, stats.MaxFeatureIndex)
577595
}
@@ -638,6 +656,7 @@ func (b *benchOpts) generateFeatures(featuresNum []int) []stats.Features {
638656
ClientWriteBufferSize: b.features.clientWriteBufferSize[curPos[stats.ClientWriteBufferSize]],
639657
ServerReadBufferSize: b.features.serverReadBufferSize[curPos[stats.ServerReadBufferSize]],
640658
ServerWriteBufferSize: b.features.serverWriteBufferSize[curPos[stats.ServerWriteBufferSize]],
659+
SharedRecvBufferPool: b.features.sharedRecvBufferPools[curPos[stats.SharedRecvBufferPool]],
641660
}
642661
if len(b.features.reqPayloadCurves) == 0 {
643662
f.ReqSizeBytes = b.features.reqSizeBytes[curPos[stats.ReqSizeBytesIndex]]
@@ -708,6 +727,7 @@ func processFlags() *benchOpts {
708727
clientWriteBufferSize: append([]int(nil), *clientWriteBufferSize...),
709728
serverReadBufferSize: append([]int(nil), *serverReadBufferSize...),
710729
serverWriteBufferSize: append([]int(nil), *serverWriteBufferSize...),
730+
sharedRecvBufferPools: setSharedRecvBufferPool(*sharedRecvBufferPool),
711731
},
712732
}
713733

@@ -783,6 +803,19 @@ func setCompressorMode(val string) []string {
783803
}
784804
}
785805

806+
func setSharedRecvBufferPool(val string) []string {
807+
switch val {
808+
case sharedRecvBufferPoolNil, sharedRecvBufferPoolSimple:
809+
return []string{val}
810+
case sharedRecvBufferPoolAll:
811+
return []string{sharedRecvBufferPoolNil, sharedRecvBufferPoolSimple}
812+
default:
813+
// This should never happen because a wrong value passed to this flag would
814+
// be caught during flag.Parse().
815+
return []string{}
816+
}
817+
}
818+
786819
func main() {
787820
opts := processFlags()
788821
before(opts)
@@ -882,3 +915,33 @@ type nopDecompressor struct{}
882915

883916
func (nopDecompressor) Do(r io.Reader) ([]byte, error) { return io.ReadAll(r) }
884917
func (nopDecompressor) Type() string { return compModeNop }
918+
919+
// simpleSharedRecvBufferPool is a simple implementation of sharedRecvBufferPool.
920+
type simpleSharedRecvBufferPool struct {
921+
sync.Pool
922+
}
923+
924+
func newSimpleSharedRecvBufferPool() *simpleSharedRecvBufferPool {
925+
return &simpleSharedRecvBufferPool{
926+
Pool: sync.Pool{
927+
New: func() interface{} {
928+
bs := make([]byte, 0)
929+
return &bs
930+
},
931+
},
932+
}
933+
}
934+
935+
func (p *simpleSharedRecvBufferPool) Get(size int) []byte {
936+
bs := p.Pool.Get().(*[]byte)
937+
if cap(*bs) < size {
938+
*bs = make([]byte, size)
939+
return *bs
940+
}
941+
942+
return (*bs)[:size]
943+
}
944+
945+
func (p *simpleSharedRecvBufferPool) Put(bs *[]byte) {
946+
p.Pool.Put(bs)
947+
}

benchmark/stats/stats.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const (
5656
ClientWriteBufferSize
5757
ServerReadBufferSize
5858
ServerWriteBufferSize
59+
SharedRecvBufferPool
5960

6061
// MaxFeatureIndex is a place holder to indicate the total number of feature
6162
// indices we have. Any new feature indices should be added above this.
@@ -121,6 +122,8 @@ type Features struct {
121122
ServerReadBufferSize int
122123
// ServerWriteBufferSize is the size of the server write buffer in bytes. If negative, use the default buffer size.
123124
ServerWriteBufferSize int
125+
// SharedRecvBufferPool represents the shared recv buffer pool used.
126+
SharedRecvBufferPool string
124127
}
125128

126129
// String returns all the feature values as a string.
@@ -139,12 +142,13 @@ func (f Features) String() string {
139142
return fmt.Sprintf("networkMode_%v-bufConn_%v-keepalive_%v-benchTime_%v-"+
140143
"trace_%v-latency_%v-kbps_%v-MTU_%v-maxConcurrentCalls_%v-%s-%s-"+
141144
"compressor_%v-channelz_%v-preloader_%v-clientReadBufferSize_%v-"+
142-
"clientWriteBufferSize_%v-serverReadBufferSize_%v-serverWriteBufferSize_%v-",
145+
"clientWriteBufferSize_%v-serverReadBufferSize_%v-serverWriteBufferSize_%v-"+
146+
"sharedRecvBufferPool_%v-",
143147
f.NetworkMode, f.UseBufConn, f.EnableKeepalive, f.BenchTime, f.EnableTrace,
144148
f.Latency, f.Kbps, f.MTU, f.MaxConcurrentCalls, reqPayloadString,
145149
respPayloadString, f.ModeCompressor, f.EnableChannelz, f.EnablePreloader,
146150
f.ClientReadBufferSize, f.ClientWriteBufferSize, f.ServerReadBufferSize,
147-
f.ServerWriteBufferSize)
151+
f.ServerWriteBufferSize, f.SharedRecvBufferPool)
148152
}
149153

150154
// SharedFeatures returns the shared features as a pretty printable string.
@@ -216,6 +220,8 @@ func (f Features) partialString(b *bytes.Buffer, wantFeatures []bool, sep, delim
216220
b.WriteString(fmt.Sprintf("ServerReadBufferSize%v%v%v", sep, f.ServerReadBufferSize, delim))
217221
case ServerWriteBufferSize:
218222
b.WriteString(fmt.Sprintf("ServerWriteBufferSize%v%v%v", sep, f.ServerWriteBufferSize, delim))
223+
case SharedRecvBufferPool:
224+
b.WriteString(fmt.Sprintf("SharedRecvBufferPool%v%v%v", sep, f.SharedRecvBufferPool, delim))
219225
default:
220226
log.Fatalf("Unknown feature index %v. maxFeatureIndex is %v", i, MaxFeatureIndex)
221227
}

0 commit comments

Comments
 (0)