千兆网络接口的 CPU 限制为 25MB/s。如何才能最大化吞吐量?

千兆网络接口的 CPU 限制为 25MB/s。如何才能最大化吞吐量?

我有一台 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 设置的吞吐量。

相关内容