Skip to content

Commit 1acfea8

Browse files
authored
grpc: Enable shared write buffers by default (grpc#8957)
gRPC is already using pooled buffers extensively. These write buffers can hold more than 20% of the "in use" memory when using LB policies like roundrobin, least request etc. The pools help releasing the memory when a subchannel is inactive. ## Benchmarks There is no significant performance difference in the local benchmarks. Before ``` go1.24.13/grpc1.80.0-dev streaming-networkMode_Local-bufConn_true-keepalive_false-benchTime_2m0s-trace_false-latency_0s-kbps_0-MTU_0-maxConcurrentC alls_120-reqSize_1024B-respSize_1024B-compressor_off-channelz_false-preloader_false-clientReadBufferSize_-1-clientWriteBuf ferSize_-1-serverReadBufferSize_-1-serverWriteBufferSize_-1-sleepBetweenRPCs_0s-connections_1-recvBufferPool_simple-shared WriteBuffer_false: 50_Latency: 344.0650µs 90_Latency: 478.0550µs 99_Latency: 884.7730µs Avg_Latency: 354.6700µs Bytes/op: 4964.3704955955A llocs/op: 19.35011915747468 Histogram (unit: µs) Count: 40403676 Min: 9.7 Max: 213729.4 Avg: 354.67 ------------------------------------------------------------ [ 9.742000, 9.743000) 1 0.0% 0.0% [ 9.743000, 9.750424) 0 0.0% 0.0% [ 9.750424, 9.812970) 0 0.0% 0.0% [ 9.812970, 10.339881) 3 0.0% 0.0% [ 10.339881, 14.778782) 1522 0.0% 0.0% [ 14.778782, 52.173796) 39748 0.1% 0.1% [ 52.173796, 367.203851) 23974441 59.3% 59.4% ###### [ 367.203851, 3021.138790) 16383483 40.5% 100.0% #### [ 3021.138790, 25378.912455) 3968 0.0% 100.0% [ 25378.912455, 213729.439000) 509 0.0% 100.0% [ 213729.439000, 1800467.071380) 1 0.0% 100.0% Number of requests: 40403676 Request throughput: 2.7582242816e+09 bit/s Number of responses: 40403676 Response throughput: 2.7582242816e+09 bit/s ``` After ``` go1.24.13/grpc1.80.0-dev streaming-networkMode_Local-bufConn_true-keepalive_false-benchTime_2m0s-trace_false-latency_0s-kbps_0-MTU_0-maxConcurrentC alls_120-reqSize_1024B-respSize_1024B-compressor_off-channelz_false-preloader_false-clientReadBufferSize_-1-clientWriteBuf ferSize_-1-serverReadBufferSize_-1-serverWriteBufferSize_-1-sleepBetweenRPCs_0s-connections_1-recvBufferPool_simple-shared WriteBuffer_true: 50_Latency: 346.4820µs 90_Latency: 478.2350µs 99_Latency: 695.2270µs Avg_Latency: 353.1640µs Bytes/op: 4972.45957928533 5 Allocs/op: 19.64101560175674 Histogram (unit: µs) Count: 40619977 Min: 10.1 Max: 74013.3 Avg: 353.16 ------------------------------------------------------------ [ 10.103000, 10.104000) 1 0.0% 0.0% [ 10.104000, 10.110488) 0 0.0% 0.0% [ 10.110488, 10.159069) 2 0.0% 0.0% [ 10.159069, 10.522840) 5 0.0% 0.0% [ 10.522840, 13.246726) 612 0.0% 0.0% [ 13.246726, 33.642970) 15498 0.0% 0.0% [ 33.642970, 186.368403) 2763883 6.8% 6.8% # [ 186.368403, 1329.964187) 37638929 92.7% 99.5% ######### [ 1329.964187, 9893.117609) 200384 0.5% 100.0% [ 9893.117609, 74013.323000) 662 0.0% 100.0% [ 74013.323000, 554140.273508) 1 0.0% 100.0% Number of requests: 40619977 Request throughput: 2.772990429866667e+09 bit/s Number of responses: 40619977 Response throughput: 2.772990429866667e+09 bit/s ``` RELEASE NOTES: * grpc: Enable shared write buffers by default. Use the the [WithSharedWriteBuffer](https://pkg.go.dev/google.golang.org/grpc#WithSharedWriteBuffer) dial option or the [SharedWriteBuffer](https://pkg.go.dev/google.golang.org/grpc#SharedWriteBuffer) server option to disable it.
1 parent 8360b4c commit 1acfea8

File tree

3 files changed

+7
-5
lines changed

3 files changed

+7
-5
lines changed

benchmark/benchmain/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ var (
117117
sleepBetweenRPCs = flags.DurationSlice("sleepBetweenRPCs", []time.Duration{0}, "Configures the maximum amount of time the client should sleep between consecutive RPCs - may be a comma-separated list")
118118
connections = flag.Int("connections", 1, "The number of connections. Each connection will handle maxConcurrentCalls RPC streams")
119119
recvBufferPool = flags.StringWithAllowedValues("recvBufferPool", recvBufferPoolSimple, "Configures the shared receive buffer pool. One of: nil, simple, all", allRecvBufferPools)
120-
sharedWriteBuffer = flags.StringWithAllowedValues("sharedWriteBuffer", toggleModeOff,
120+
sharedWriteBuffer = flags.StringWithAllowedValues("sharedWriteBuffer", toggleModeOn,
121121
fmt.Sprintf("Configures both client and server to share write buffer - One of: %v", strings.Join(allToggleModes, ", ")), allToggleModes)
122122

123123
logger = grpclog.Component("benchmark")

dialoptions.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -705,10 +705,11 @@ func WithDisableHealthCheck() DialOption {
705705
func defaultDialOptions() dialOptions {
706706
return dialOptions{
707707
copts: transport.ConnectOptions{
708-
ReadBufferSize: defaultReadBufSize,
709-
WriteBufferSize: defaultWriteBufSize,
710-
UserAgent: grpcUA,
711-
BufferPool: mem.DefaultBufferPool(),
708+
ReadBufferSize: defaultReadBufSize,
709+
WriteBufferSize: defaultWriteBufSize,
710+
SharedWriteBuffer: true,
711+
UserAgent: grpcUA,
712+
BufferPool: mem.DefaultBufferPool(),
712713
},
713714
bs: internalbackoff.DefaultExponential,
714715
idleTimeout: 30 * time.Minute,

server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ var defaultServerOptions = serverOptions{
189189
maxSendMessageSize: defaultServerMaxSendMessageSize,
190190
connectionTimeout: 120 * time.Second,
191191
writeBufferSize: defaultWriteBufSize,
192+
sharedWriteBuffer: true,
192193
readBufferSize: defaultReadBufSize,
193194
bufferPool: mem.DefaultBufferPool(),
194195
}

0 commit comments

Comments
 (0)