TCP 流工作负载调整

流工作负载将大量的数据从一个端点移动到另一个端点。 流工作负载的示例是文件传输、备份或恢复工作负载或批量数据传输。 这些工作负载中主要关注的衡量标准就是带宽,但是也可以考虑端到端等待时间。

影响流式应用程序的 TCP 性能的主要可调参数如下:

  • tcp_recvspace
  • tcp_sendspace
  • rfc1323
  • MTU 路径发现
  • tcp_nodelayack
  • 智能大对象 (sb_max)
  • 适配器选项,例如校验和卸载和 TCP 大量发送 (TCP Large Send)
下表显示了为获得最佳性能而建议的可调值大小,以适配器类型和 MTU 大小为基础:
设备 速度 MTU 大小 tcp_sendspace tcp_recvspace sb_max 1 rfc1323
令牌环 4 或 16 MB 1492 16384 16384 32768 0
以太网 10 Mbit 1500 16384 16384 32768 0
以太网 100 Mbit 1500 16384 16384 65536 0
以太网 Gigabit 1500 131072 65536 131072 0
以太网 Gigabit 9000 131072 65535 262144 0
以太网 Gigabit 9000 262144 1310722 524288 1
以太网 10 Gigabit 1500 131072 65536 131072 0
以太网 10 Gigabit 9000 262144 131072 262144 1
ATM 155 Mbit 1500 16384 16384 131072 0
ATM 155 Mbit 9180 65535 655353 131072 0
ATM 155 Mbit 65527 655360 6553604 1310720 1
FDDI 100 Mbit 4352 45056 45056 90012 0
光纤通道 2 Gigabit 65280 655360 655360 1310720 1

(1) 建议对 sb_max 可调参数使用缺省值 1048576。 表中显示的值是可接受的 sb_max 可调参数最小值。

(2) 在千兆以太网的巨型帧上使用这些选项并启用 rfc1323 时,性能会稍好一些。

(3) TCP 发送和接收空间的某些组合将导致吞吐量极低(1 MB 或更低)。 为了避免这个问题,可将 tcp_sendspace 可调参数设置为至少为 3 倍 MTU 大小,或者大于等于接收方的 tcp_recvspace 值。

(4) 对于它的窗口大小,TCP 只有 16 位的值可用。 这可以转换为窗口大小的最大值为 65536 字节。 对于 MTU 大小较大(例如 32 KB 或 64 KB)的适配器来说,TCP 流性能可能会很差。 例如,在一个具有 64 KB MTU 大小且 tcp_recvspace 设置为 64 KB 的设备上,TCP 只能发送一个信息包,然后其窗口就会关闭。 它必须等待从接收端返回的 ACK 信号,然后才能再次发送。 此问题可通过下列某个方法解决:
  • 启用 rfc1323,这样可增强 TCP,并使其能克服 16 位限制,从而能够使用大于 64 KB 的窗口大小。 然后可将 tcp_recvspace 可调参数设置为一个较大值,例如 10 倍的 MTU 大小,以允许 TCP 发送数据,从而提供优良的性能。
  • 减少适配器的 MTU 大小。 例如,使用 ifconfig at0 mtu 16384 命令将 ATM MTU 大小设置为 16 KB。 这会导致 TCP 计算较小的 MSS 值。 如果使用 16 KB 的 MTU 大小,那么 TCP 对于 64 KB 的窗口大小可发送 4 个信息包。

下面是调整 TCP 流工作负载的一般准则:

  • 将 TCP 发送和接收空间设置为最少 10 倍的 MTU 大小。
  • 如果 MTU 大小高于 8 KB,那么应该启用 rfc1323 以允许更大的 TCP 接收空间值。
  • 对于高速适配器来说,较大的 TCP 发送和接收空间值有助于提高性能。
  • 对于高速适配器来说,tcp_sendspace 可调值应该是 tcp_recvspace 值的 2 倍。
  • 缺省情况下,设置 lo0 接口的 rfc1323。 因为 lo0 的缺省 MTU 大小比 1500 大,所以 tcp_sendspacetcp_recvspace 可调值设置为 128K。

ftprcp 命令是可从调整 tcp_sendspacetcp_recvspace 可调参数获益的 TCP 应用程序示例。