下一篇 上一篇 目录

3. 性能提示

如果您正遭受以太网吞吐量低下的困扰,或者想在 ftp 传输中获得更高的速度,这里有一些您可以使用的提示。

ttcp.c 程序是测量原始吞吐速度的一个很好的测试工具。另一个常用的技巧是执行 ftp> get large_file /dev/null,其中 large_file 是大于 1MB 的文件,并且驻留在发送机器的缓冲区缓存中。(至少执行两次 `get` 命令,因为第一次将预热发送机器上的缓冲区缓存。)您希望文件在缓冲区缓存中,因为您不希望将磁盘的文件访问速度纳入您的测量。这也是为什么您将传入数据发送到 /dev/null 而不是磁盘的原因。

3.1 一般概念

即使是 8 位网卡也能够无问题地接收背靠背的数据包。当计算机无法足够快地从网卡上获取接收到的数据包,从而为更多传入数据包腾出空间时,困难就出现了。如果计算机没有快速清除网卡内存中已接收的数据包,网卡将没有空间放置新数据包。

在这种情况下,网卡要么丢弃新数据包,要么覆盖先前接收到的数据包。这两种情况都会严重中断流量的顺畅流动,导致/请求重传,并可能严重降低性能,降幅高达 5 倍!

具有更多板载内存的网卡能够“缓冲”更多数据包,因此可以处理更大的背靠背数据包突发,而不会丢弃数据包。这反过来意味着,为了避免丢弃数据包,网卡不需要主机计算机在从缓冲区中拉取数据包方面具有那么低的延迟。

大多数 8 位网卡都有 8kB 的缓冲区,而大多数 16 位网卡都有 16kB 的缓冲区。大多数 Linux 驱动程序将保留缓冲区中的 3kB(用于两个 Tx 缓冲区),这使得 8 位网卡仅剩下 5kB 的接收空间。这仅够容纳三个完整大小(1500 字节)的以太网数据包。

3.2 ISA 网卡和 ISA 总线速度

如上所述,如果数据包能够足够快地从网卡中移除,那么即使 Rx 数据包缓冲区内存很小,也不会发生丢包/溢出情况。决定数据包从网卡移除到计算机内存的速度的因素是连接两者的数据路径的速度——即 ISA 总线速度。(如果 CPU 是速度极慢的 386sx-16,那么这也会起作用。)

推荐的 ISA 总线时钟约为 8MHz,但许多主板和外围设备可以在更高的频率下运行。ISA 总线的时钟频率通常可以在 CMOS 设置中设置,通过选择主板/CPU 时钟频率的除数。一些 ISA 和 PCI/ISA 主板可能没有此选项,因此您只能使用出厂默认设置。

例如,以下是在 40MHz 486 上,使用 8 位 WD8003EP 网卡,针对不同 ISA 总线速度,通过 TTCP 程序测量的接收速度。


        ISA Bus Speed (MHz)     Rx TTCP (kB/s)
        -------------------     --------------
        6.7                     740
        13.4                    970
        20.0                    1030
        26.7                    1075

使用 TCP/IP,对于任何 10Mb/s 以太网卡,您都很难做到比 1075kB/s 更好。但是,不要期望每个系统都能在快速 ISA 总线速度下工作。大多数系统在高于 13MHz 的速度下将无法正常运行。(此外,一些 PCI 系统的 ISA 总线速度固定为 8MHz,因此最终用户无法选择提高它。)

除了更快的传输速度外,通常还会受益于 CPU 使用率的降低,这归因于更短的内存和 I/O 周期。(请注意,位于 ISA 总线上的硬盘和显卡通常也会因 ISA 总线速度的提高而获得性能提升。)

在尝试超过 8MHz 的 ISA 总线速度之前,请务必备份您的数据,并彻底测试所有 ISA 外围设备在任何速度提升后都能正常运行。

3.3 设置 TCP Rx 窗口

再次强调,板载 RAM 容量小且网卡与计算机内存之间数据路径相对较慢的网卡会遇到问题。默认的 TCP Rx 窗口设置为 32kB,这意味着与您在同一子网上的快速计算机可以向您倾倒 32k 的数据,而无需停下来查看您是否已正确接收到任何数据。

最新版本的 route 命令具有动态设置此窗口大小的能力。通常,只有对于本地网络才需要减小此窗口,因为位于几个路由器或网关之后的计算机具有足够的“缓冲”,不会构成问题。一个示例用法是


        route add <whatever> ... window <win_size>

其中 win_size 是您希望使用的窗口大小(以字节为单位)。在 8MHz 或更低速度下运行的 ISA 总线上的 8 位 3c503 网卡,窗口大小约为 4kB 时效果良好。过大的窗口会导致溢出和丢包,并急剧降低以太网吞吐量。您可以通过执行 cat /proc/net/dev 来检查运行状态,这将显示发生的任何丢包或溢出情况。

3.4 提高 NFS 性能

有些人发现,在使用 8kB(原生 Sun)NFS 数据包大小的情况下,在 NFS 客户端中使用 8 位网卡会导致性能低于预期。

这的可能原因是 8 位和 16 位网卡之间板载缓冲区大小的差异。最大以太网数据包大小约为 1500 字节。现在,8kB NFS 数据包将作为大约 6 个背靠背的最大尺寸以太网数据包到达。8 位和 16 位网卡都能无问题地接收背靠背数据包。问题出现在当机器没有及时从网卡缓冲区中移除数据包时,缓冲区溢出。8 位网卡每次传输需要额外的 ISA 总线周期也无济于事。如果您有 8 位网卡,您可以做的就是将 NFS 传输大小设置为 2kB(甚至 1kB),或者尝试提高 ISA 总线速度,以便更快地清除网卡的缓冲区。我发现,在 8MHz 下的旧 WD8003E 网卡(在没有其他系统负载的情况下)可以跟上 2kB NFS 大小的接收,但不能跟上 4kB,在 4kB 时,性能下降了三倍。

另一方面,如果默认挂载选项是使用 1kB 大小,并且您至少有 16 位 ISA 网卡,您可能会发现改为 4kB(甚至 8kB)会显着提高性能。


下一篇 上一篇 目录