为什么80%的码农都做不了架构师?>>>
FROM: how-to-calculate-tcp-throughput-for-long-distance-links
如何计算广域网链路的 TCP 吞吐量
刚刚点亮数据中心之间的高速网络(光线),但是你却恼怒的观察到高速广域网链路上的低的文件传输速度 - Bummer!在给思科一级支持工程师(Cicso TAC)电话和开始检修你的网络之前,快速计算一下从一个主机经过长距离的链路到另一个主机之间实际上你可以获得的 TCP 吞吐量是多少。
使用 TCP 传输数据时,两个最重要的因素是 TCP 窗口大小 和 往返延迟。如果你知道这两个参数,你就可以计算出两个主机间的最大吞吐量,不管带宽是多少。
计算 TCP吞吐量的公式
TCP窗口大小(bits) / 延迟(秒) = 每秒吞吐量(bits)
举一个简单的例子。从芝加哥到纽约有 1G 的以太网链路,往返延迟 30ms。如果使用 FTP 在芝加哥的一台服务器和纽约的一台服务器之间传输一个大文件,所能期望的最大吞吐量是多少?
首先把 TCP窗口大小 从字节变成位。这个例子中我们使用 Windows 标准的 64K 窗口大小。
64KB = 65536 Bytes. 65536 * 8 = 524288 bits
接着,把用位表示的窗口大小除以用秒表示的往返延迟。延迟 30ms 的话,在计算中使用 0.03秒。
524288 bits / 0.030 seconds = 17476266 bits per second throughput = 17.4 Mbps maximum possible throughput
这样的话,尽管在数据中心之间我有 1G 的链路带宽,但是基于 给定的窗口大小 和 往返延迟,在传输文件时我所能期望的最大的吞吐量是 17.4 Mbps。
做什么才能变快? 增加窗口大小 或 缩减延迟。
为了增加 TCP窗口大小,可以在每个服务器上做出手动调整,传递更大的窗口大小。这产生了一个问题:你将使用多大的窗口大小?可以使用上面公式的反向计算来确定最优的窗口大小。
计算最优 TCP窗口大小 的公式
带宽(bits每秒) * 往返延迟(秒) = TCP窗口大小(bits) / 8 = TCP窗口大小(字节)
因此在芝加哥和纽约之间 1G 的带宽和 30ms 的延迟的例子中,可以计算如下:
1,000,000,000 bps * 0.030 seconds = 30,000,000 bits / 8 = 3,750,000 Bytes
因此为 FTP连接 配置 3750KB 的 TCP窗口大小,将会填充管道,获得 1Gbps 的吞吐量。
服务器增加 TCP窗口大小,其中一个缺点是需要更多的缓冲内存,因为未应答的数据必须存储在内存中为了应对可能的重传。另一个潜在的缺陷是性能(是不是很讽刺),发生在包丢失时,因为窗口内任何的包丢失都会导致整个窗口重传 - 除非你的 TCP协议栈使用一种 TCP增强技术,叫做选择性应答(selective acknowledgements),但是大部分服务器没有使用此种技术。
另一个选择就是在需要更大窗口的一端放置广域网加速器(WAN accelerator) 和 在加速器之间使用其他TCP优化,比如选择性应答,对服务器不需要特殊的调优或额外的内存。加速器可能也使用第7层应用具体的优化来减少往返次数。
减少延迟?这怎么可能? 除非你能克服光速的限制,否则对于缩减延迟你什么都做不了。再一次,你有一个选择,就是设置加速器,加速器应答本地服务器的报文段,愚弄服务器让它认为看到非常低的局域网延迟。因为服务器看到非常快速的局域网应答,而不是等待远处的服务器应答,这就是为什么我们不需要调整服务器的窗口大小的原因。
在这个例子中,最合适的广域网加速器是 Cisco 7371 WAAS Appliance。 WAAS指的是 Wide Area Application Services。
WAAS设备将会使用 TCP优化,比如大的窗口 和 选择性应答。除此之外,WAAS设备会消除 TCP流 中的冗余信息,产生高的压缩比率。每个设备会记住之前看到的数据,如果再次看到相同的数据,这些数据将会被2个字节的符号替换。这个符号会被另一端的WAAS设备识别,在发送给服务器之前,它用原来的数据替换符号。
这些优化的结果是:在芝加哥和纽约的服务器之间,服务器不需要任何调优,就会获得类似局域网的更高的吞吐量。
给定吞吐量计算最大延迟的公式
在两个使用标准 64KB TCP窗口大小 的服务器之间,你可能想获的 10 Gbps FTP 吞吐量。为了达到10 Gbps,你所能有的最大延迟是多少?
TCP窗口大小(bits) / 吞吐量(bits每秒) = 最大往返延迟时间
524288 bits / 10,000,000,000 bits per second = 52.4 microseconds