单个TCP连接的吞吐量不好

我有一个千兆上联的服务器,并与iperf3 100个并行连接testing我得到至less600 MBit / s,这取决于其他服务器(我试过一些公共testing服务器)。 但是,当我运行iperf3与一个连接,我得到10-15 MBit/s ,两个20-30 MBit/s等。

我没有非常复杂的iptables规则,没有其他的想法,为什么这么慢。 单个TCP连接的限制因素是什么,它比可能的带宽慢10倍?

单个TCP会话受到每个会话窗口大小的限制,该窗口代表在任何给定时间在两个端点之间可以“飞行”的最大字节数。 所以如果你的链接有很高的延迟,你可以达到windowSize / RTT的每个会话限制。

解决这个问题的唯一方法(因为你通常不能做很多关于RTT的事情)要么使用更多的会话,要么使用窗口缩放来显着增加窗口大小。 我不知道iPerf的设置与此相关,或者如果端点之间可能有防火墙或其他filter,即使iPerf和您的服务器都支持,也会阻止扩展。

我终于find了问题的原因。

我有一些瓶Web应用程序,它使用Redisstream事件给用户。 当用户断开连接时,应用程序保持redis pubsub连接处于活动状态,而不再读取数据。

这会导致一个很长的Send-Q / Recv-Q ,这显然会导致tcp堆栈变慢并产生内核警告:“ TCP:内存不足 – 考虑调整tcp_mem ”。

  • 短期修复:用长数据包队列杀死进程。
  • 长期解决scheme:修复行为不端的程序。