背景:因业务需要,客户端使用brpc , 服务器端使用 grpc c++ 1.23.0 版本,当客户端每次请求1M数据时,客户端上报 remote_window_left is not enough 错误;
定位手段:使用双方的helloword 例子(brpc hello client 请求 grpc hello server)测试,没有问题,怀疑server端使用特殊的启动参数。
查看server 端代码:
ServerBuilder builder;
builder.AddListeningPort(server_address_, grpc::InsecureServerCredentials());
builder.SetResourceQuota(quota.SetMaxThreads(128));
builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE, 0); // 注释调这一行就没有问题了
builder.AddChannelArgument(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES, 4*1024*1024);
builder.RegisterService((grpc::Service *)this);
server_ = builder.BuildAndStart();
最终解决方案:注释调builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE, 0);
那为什么注释后好用了呢?
tlw 是transport local window 的缩写, 50051 是server端的端口号,
没有注释的情况:
1)通过tcpdump 抓包,
2)server端流控日志:
0x7f699c0030d8[0][svr] | t updt sent | trw:65535, tlw:65535, taw:65535, srw: , slw: , saw:
0x7f699c0030d8[0][svr] | t updt recv | trw:65535 -> 1048576, tlw:65535, taw:65535, srw: , slw: , saw:
从数据上看 本地记录的窗口大小和通知给client 端的窗口大小不一致;
注释后的场景:
1)通过tcpdump抓包
2)server端流控日志:
0x7fd648003098[0][svr] | t updt sent | trw:65535, tlw:4194304, taw: 65535 -> 4194304, srw: , slw: , saw:
0x7fd648003098[0][svr] | t updt recv | trw: 65535 -> 1048576, tlw:4194304, taw:4194304, srw: , slw: , saw:
从数据上看 本地记录的窗口大小和通知给client 端的窗口大小一致;
疑问:
不知道是不是brpc c++ 的bug ,通过 builder.AddChannelArgument(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES, 4 * 1024 * 1024)
只是改变了 setting frame 里的值,没有改变本地变量的值。
因为最近无法连接到github.com ,无法用最新版本实验。