我有一台带有千兆上行链路的服务器,iperf3
使用 100 个并行连接进行测试,我得到至少 600 MBit/s,具体取决于另一台服务器(我尝试了一些公共测试服务器)。但是当我iperf3
使用一个连接运行时,我得到10-15 MBit/s
了两个20-30 MBit/s
,依此类推。
我没有很复杂的 iptables 规则,也没有其他想法,为什么它这么慢。单个 tcp 连接的限制因素是什么,它们比可能的带宽慢 10 倍?
我有一台带有千兆上行链路的服务器,iperf3
使用 100 个并行连接进行测试,我得到至少 600 MBit/s,具体取决于另一台服务器(我尝试了一些公共测试服务器)。但是当我iperf3
使用一个连接运行时,我得到10-15 MBit/s
了两个20-30 MBit/s
,依此类推。
我没有很复杂的 iptables 规则,也没有其他想法,为什么它这么慢。单个 tcp 连接的限制因素是什么,它们比可能的带宽慢 10 倍?
我终于找到了问题的原因。
我有一些烧瓶 webapp,它使用 redis 将事件流式传输给用户。当用户断开连接时,应用程序保持 redis pubsub 连接处于活动状态,不再读取数据。
这会导致长
Send-Q
/Recv-Q
,这显然会导致 tcp 堆栈变慢并产生内核警告:“ TCP:内存不足 - 考虑调整 tcp_mem ”。单个 TCP 会话受到每个会话窗口大小的限制,该窗口表示在任何给定时间两个端点之间可以“飞行”的最大字节数。因此,如果您的链接有高延迟,您可以达到每个会话的限制,即 windowSize / RTT。
解决这个问题的唯一方法(因为您通常不能对 RTT 做很多事情)要么使用更多会话,要么使用窗口缩放显着增加窗口大小。我不知道 iPerf 的设置与此相关,或者您是否可能在端点之间有防火墙或其他过滤器,即使 iPerf 和您的服务器都支持它,也会阻止缩放。