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_sendspace 和 tcp_recvspace 可调值设置为 128K。
ftp 和 rcp 命令是可从调整 tcp_sendspace 和 tcp_recvspace 可调参数获益的 TCP 应用程序示例。