下一页 上一页 目录

7. 技术信息

对于那些想要更多了解网卡工作原理,或者想摆弄现有驱动程序的人来说,这些信息应该很有用。 如果您不属于这类人,那么您可能想跳过本节。

7.1 编程 I/O vs. 共享内存 vs. DMA

如果您已经可以背靠背地发送和接收数据包,那么您就无法在导线上放置更多的比特。 每个现代以太网卡都可以接收背靠背的数据包。 Linux DP8390 驱动程序(wd80x3、SMC-Ultra、3c503、ne2000 等)非常接近于背靠背地发送数据包(取决于当前的interrupt延迟),而 3c509 和 AT1500 硬件可以完全自动地发送背靠背的数据包,没有任何问题。

编程 I/O (例如 NE2000, 3c509)

优点:不使用任何受限的系统资源,只使用少量的 I/O 寄存器,并且没有 16M 限制。

缺点:通常传输速率最慢,CPU 一直在等待,并且交错的数据包访问通常很困难甚至不可能。

共享内存 (例如 WD80x3, SMC-Ultra, 3c503)

优点:简单,比编程 I/O 快,并允许随机访问数据包。 在可能的情况下,linux 驱动程序会在复制来自网卡的传入 IP 数据包时计算校验和,从而进一步减少 CPU 使用率,与等效的 PIO 网卡相比。

缺点:占用内存空间(对于 DOS 用户来说是一个大问题,但在 Linux 下基本上不是问题),并且仍然占用 CPU。

总线主控直接内存访问 (例如 LANCE, DEC 21040)

优点:在数据传输期间释放 CPU,可以将缓冲区串联在一起,可能只需要很少或不需要占用 ISA 总线上的 CPU 时间。 大多数总线主控 linux 驱动程序现在都使用“copybreak”方案,其中大型数据包直接由网卡放入内核网络缓冲区,而小型数据包由 CPU 复制,这为后续处理预热了缓存。

缺点:(仅适用于 ISA 总线网卡)需要低内存缓冲区和网卡的 DMA 通道。 任何总线主控都会遇到其他总线占用者的问题,例如一些原始的 SCSI 适配器。 一些设计糟糕的主板芯片组在 ISA 总线主控方面存在问题。

7.2 总线宽度对性能的影响

ISA 总线可以达到 5.3MB/秒 (42Mb/秒),这听起来对于 10Mbps 以太网来说已经足够了。 对于 100Mbps 网卡,您显然需要更快的总线才能利用网络带宽。 33MHz 32 位 PCI 总线可以达到 133MB/秒,但这对于千兆以太网来说是不够的。

ISA 8 位和 ISA 16 位网卡

您可能很难再买到新的 ISA 以太网卡了,但您可能仍然可以找到一些适合“家庭以太网”系统的剩余或过时的网卡。 如果您真的想复古一下,您甚至可以使用旧的半槽 8 位 ISA 网卡,但请注意,它们大多数是 10Base-2 的。

一些 8 位网卡可以为轻度到中度使用提供足够的性能,例如 wd8003、3c503 和 ne1000。 3c501 性能较差,这些可怜的 15 年前的 XT 时代的遗物应该避免使用。(把它们寄给 Alan,他收集这些东西...)

8 位数据路径对性能的影响不大,因为您仍然可以期望从快速主机获得大约 500 到 800kB/s 的 ftp 下载速度到 8 位 wd8003 网卡(在快速 ISA 总线上)。 如果您的大部分网络流量都将流向远程站点,那么路径中的瓶颈将在其他地方,您唯一会注意到的速度差异是在本地子网上的网络活动期间。

32 位 PCI (VLB/EISA) 以太网卡

显然,对于 100Mbps 和更高的网络,连接到计算机的 32 位接口是必须的。 如果您进入千兆以太网,那么 133 兆字节/秒的 PCI 总线(对于 33MHz 32 位 PCI)仍然是您的限制因素。

但是旧的 10Mbs 网络实际上并不需要 32 位接口。 请参阅 编程 I/O vs. ... 了解为什么在 8MHz ISA 总线上使用 10Mbps 以太网卡实际上不是瓶颈。 即使在快速总线上使用慢速以太网卡并不一定意味着更快的传输速度,但通常意味着降低 CPU 开销,这对于多用户系统来说是好事。

7.3 零拷贝对性能的影响

当发送或接收网络数据时,您可以很容易地想象到它被从应用程序复制到内核内存,然后再从那里复制到网卡内存。 所有这些数据移动都需要时间和 CPU 资源。 正如上面在总线主控 DMA 部分暗示的那样,一个设计合理的网卡可以减少所有这些复制,最理想的情况当然是零拷贝。 对于某些现代 PCI 网卡,可以通过简单地将网卡指向数据并实质上说“自己获取”来实现零拷贝。 如果以最小的服务器负载获得最大性能对您很重要,那么请检查您的硬件和驱动程序是否支持零拷贝。

7.4 硬件校验和对性能的影响

无法保证您的数据从计算机 A 传输到计算机 B 时不会被损坏。 为了确保数据是 OK 的,发送者将构成您数据的所有数字相加,并将此校验和也一起发送。 接收者重新计算此校验和,并将其与发送者计算的校验和进行比较。 如果两者不匹配,则接收者知道数据已损坏,它将拒绝坏数据。

计算这些和值需要时间和主计算机的额外负载。 一些更高级的网卡能够使用硬件来完成这些 Rx 和/或 Tx 和值计算,这允许主 CPU 将此任务卸载到网卡。

需要数据拷贝的网卡不能从硬件校验和中获得太多好处,因为可以将求和操作与拷贝操作结合起来,只需付出极小的额外开销。 因此,硬件 Tx 校验和仅在零拷贝(即使用 sendfile() 的应用程序)情况下使用,因此硬件 Rx 校验和目前更有用。

请注意,即使在自己进行拷贝和校验和的情况下,一台合理的计算机也可以饱和 100BaseT 链路,因此零拷贝/硬件校验和只会显示为 CPU 使用率降低。 您必须升级到千兆以太网才能看到速度提升。

7.5 NAPI(Rx 中断缓解)对性能的影响

当网卡从网络接收到数据包时,通常发生的情况是网卡通过引发中断来请求 CPU 的注意。 然后 CPU 确定是谁引起了中断,并运行网卡的驱动程序中断处理程序,该处理程序将反过来读取网卡的中断状态以确定网卡想要做什么,然后在这种情况下,运行网卡驱动程序的接收部分,最后退出。

现在想象一下,您正在接收大量 Rx 数据,例如在某些服务器上一直保持每秒 10,000 个数据包。 您可以想象,进出驱动程序 Rx 部分的上述 IRQ 运行会增加大量开销。 通过基本上关闭 Rx 中断并只是停留在驱动程序的 Rx 部分,可以节省大量的 CPU 时间,因为它知道几乎有源源不断的 Rx 工作要做。 这就是 NAPI 的基本思想。

从 2.6 内核开始,一些驱动程序有一个配置选项来启用 NAPI。 在内核附带的 Documentation/networking 目录中也有一些文档。


下一页 上一页 目录