我有一台 Acer Aspire R1600-U910H,配有 nForce 千兆网络适配器。它的最大 TCP 吞吐量约为 25MB/s,显然受到单核 Intel Atom 230 的限制;当达到最大吞吐量时,CPU 使用率约为 50%-60%,考虑到这是启用了超线程的 CPU,这相当于满负荷使用。
Windows XP 和 Ubuntu 8.04 上都出现了同样的问题。在 Windows 上,我安装了最新的 nForce 芯片组驱动程序,禁用了省电功能,并启用了校验和卸载。在 Linux 上,默认驱动程序已启用校验和卸载。Nvidia 网站上没有可用的 Linux 驱动程序。
ethtool -k eth0
显示校验和卸载已启用:
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: off
generic segmentation offload: off
以下是powertop
网络空闲时的输出:
Wakeups-from-idle per second : 61.9 interval: 10.0s
no ACPI power usage estimate available
Top causes for wakeups:
90.9% (101.3) <interrupt> : eth0
4.5% ( 5.0) iftop : schedule_timeout (process_timeout)
1.8% ( 2.0) <kernel core> : clocksource_register (clocksource_watchdog)
0.9% ( 1.0) dhcdbd : schedule_timeout (process_timeout)
0.5% ( 0.6) <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)
当达到最大吞吐量约25MB/s时:
Wakeups-from-idle per second : 11175.5 interval: 10.0s
no ACPI power usage estimate available
Top causes for wakeups:
99.9% (22097.4) <interrupt> : eth0
0.0% ( 5.0) iftop : schedule_timeout (process_timeout)
0.0% ( 2.0) <kernel core> : clocksource_register (clocksource_watchdog)
0.0% ( 1.0) dhcdbd : schedule_timeout (process_timeout)
0.0% ( 0.6) <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)
注意每秒 20000 次中断。这可能是 CPU 使用率高和吞吐量低的原因吗?如果是这样,我该如何改善这种情况?
作为参考,网络中的其他计算机通常可以以 50+MB/s 的速度传输而不会出现问题。当以 110MB/s 的速度传输时,配备 Core 2 CPU 的计算机每秒仅产生 5000 次中断。中断数量比 Atom 系统少约 20 倍(如果中断与吞吐量成线性关系)。
增加 TCP 窗口大小可以解决问题吗?这是操作系统中的通用设置,还是特定于应用程序的设置?
还有一个小问题:我如何才能知道 eth0 正在使用的驱动程序是什么?
答案1
听起来网卡有一个相当小的缓冲区并且以中断模式运行,如果您的网卡和驱动程序支持,您可以通过切换到轮询来增加吞吐量。
但是,如果不切换到具有更大缓冲区的 NIC,该问题可能无法完全解决,而该硬件可能无法做到这一点。
答案2
我怎样才能找出 eth0 正在使用的驱动程序是什么?
检查输出消息可能有帮助。
这是我在这台计算机上输入答案时遇到的一个特殊情况:
$ dmesg | grep ethernet
forcedeth: Reverse Engineered nForce ethernet driver. Version 0.62.
在某些情况下,NIC 支持直接内置于内核中(而不是作为模块)。因此它至少不会出现在修改。
答案3
尝试使用TCP 优化器。选择其优化建议可以持续提高默认安装 TCP 设置的吞吐量。