@@ -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+
786819func main () {
787820 opts := processFlags ()
788821 before (opts )
@@ -882,3 +915,33 @@ type nopDecompressor struct{}
882915
883916func (nopDecompressor ) Do (r io.Reader ) ([]byte , error ) { return io .ReadAll (r ) }
884917func (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+ }
0 commit comments