在100Gb网络上,我创建了一个服务器来监听4个端口,grpc客户端可以达到3GB + / s的吞吐量。 但是,当服务器在一个端口上侦听时,grpc客户端只能达到1GB / s的吞吐量,即使我设置了
args.SetInt(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES, 1024*1024*1024);
args.SetInt(GRPC_ARG_MAX_CONCURRENT_STREAMS, 10);
似乎grpc客户端只能同时使用一个连接到一个端口服务。我对吗?
这样做的正确方法是什么?
我的代码在这里:
客户:https://github.com/gongweibao/tests/blob/develop/grpc_test/client.cc
服务器:https://github.com/gongweibao/tests/blob/develop/grpc_test/server.cc
答案 0 :(得分:3)
如果没有更多数据(如火焰图等),很难准确说出你的程序在哪里遇到瓶颈。
当您将gRPC服务器更改为侦听一个端口时,我发现这种情况会发生,我可以猜测减速的位置。看起来您在继续循环(1)的顶部请求服务器端调用。我建议采用不同的模式;请求一些固定数量的呼叫(在100s内),然后在处理程序循环结束时,重新请求一个调用,这样服务器总是“武装”来重新调用许多传入的RPC。
此模式的示例可以在我们的QPS驱动程序代码(经过精心调优,高度优化的基准测试应用程序)中找到(2)。
TF也是这样做的(3)。
另外,在我阅读你的代码时,只是进行了一些小的抽查。有些地方你可能会考虑调整以获得更好的数字。例如,您可能只想在此处分配一次(4),以避免对每个RPC重复的malloc调用进行基准测试。另外,为什么要在这里对bytebuffer进行自定义序列化(5)?这可能会错过特定于原型的优化。