diff --git a/netty/src/main/java/io/grpc/netty/NettyClientHandler.java b/netty/src/main/java/io/grpc/netty/NettyClientHandler.java index 1ac14585159..0c43ed5d527 100644 --- a/netty/src/main/java/io/grpc/netty/NettyClientHandler.java +++ b/netty/src/main/java/io/grpc/netty/NettyClientHandler.java @@ -224,6 +224,12 @@ static NettyClientHandler newHandler( Http2Settings settings = new Http2Settings(); settings.pushEnabled(false); + // Netty default, gRPC default: 0x4000 = 16,384 B = 16 KiB + // GRPC_CLIENT_MAX_FRAME_SIZE override default: 64 KiB + // Absolute maximum (inclusive): 0xFFFFFF = 16,777,215 B = (16 MiB - 1 B) + // (defined in https://www.rfc-editor.org/rfc/rfc9113.html#SETTINGS_MAX_FRAME_SIZE) + settings.maxFrameSize( + Integer.parseInt(System.getenv().getOrDefault("GRPC_CLIENT_MAX_FRAME_SIZE", "64")) * 1024); settings.initialWindowSize(flowControlWindow); settings.maxConcurrentStreams(0); settings.maxHeaderListSize(maxHeaderListSize); diff --git a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java index 6382471f46a..a5b83276927 100644 --- a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java +++ b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java @@ -226,7 +226,18 @@ static NettyServerHandler newHandler( final Http2Connection connection = new DefaultHttp2Connection(true); WeightedFairQueueByteDistributor dist = new WeightedFairQueueByteDistributor(connection); - dist.allocationQuantum(16 * 1024); // Make benchmarks fast again. + // Amount of bytes that will be allocated to each stream. + // Netty default: 1 KiB + // gRPC default: 16 KiB + // gRPC default override: 64 KiB + // Env var default: GRPC_CLIENT_MAX_FRAME_SIZE or 64 KiB + int aq = 64; + if (System.getenv("GRPC_SERVER_STREAM_ALLOCATION_QUANTUM") != null) { + aq = Integer.parseInt(System.getenv("GRPC_SERVER_STREAM_ALLOCATION_QUANTUM")); + } else if (System.getenv("GRPC_CLIENT_MAX_FRAME_SIZE") != null) { + aq = Integer.parseInt(System.getenv("GRPC_CLIENT_MAX_FRAME_SIZE")); + } + dist.allocationQuantum(aq * 1024); // Make benchmarks fast again. DefaultHttp2RemoteFlowController controller = new DefaultHttp2RemoteFlowController(connection, dist); connection.remote().flowController(controller);