remote_window_left is not enough

背景:因业务需要,客户端使用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 ,无法用最新版本实验。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值