Linux系统网络性能实例分析

由于TCP/IP是使用最普遍的Internet协议 , 下面只集中讨论TCP/IP 栈和以太网(Ethernet) 。 术语 LinuxTCP/IP栈和 Linux网络栈可互换使用 , 因为 TCP/IP栈是 Linux内核的组成部分 , 也被看作是 Linux默认的网络栈 。
一、实例分析中使用的基准测试
1、 NetBench
NetBench是一种 Ziff-Davis基准测试 ,可以测量文件服务器对来自客户端(向服务器提交网络文件操作的请求)的远程文件 I/O请求进行处理的程度 。 NetBench报告关于吞吐率和客户响应时间的测量结果 。 该基准测试主要用于测量 LinuxTCP/IP发送端(NetBench服务器)的吞吐率性能 , 因为对于该基准测试而言 , 接收端客户是 32位的 Windows客户 。
2、 Netperf3 Netperf3是一种测试 Linux网络吞吐率和网络扩展性的微型基准测试 。 该版本提供了多线程支持 。IBM公司对 Netperf3的功能加以增强 , 使其包含了对多网卡(NIC)和多客户的支持 。 添加这两个特性是为了测量Linux网络 SMP和网卡的扩展性 。IBM公司还添加了另一个可旁路 TCP/IP栈的接口 , 用于测试网络驱动程序 。Netperf3所测的度量是吞吐率(以每秒兆位为单位) 。
二、Linux 2.6 内核中的增强机制
在当前的计算机系统里 , 互连总线速度和内存访问延迟并没有与处理器速度(GHz)和网络带宽容量(吉比特网络)成比例增长 。 减少对互连总线和内存等相对慢速部件的访问次数通常可以改进系统(包括网络)的性能 。 在 TCP/IP栈中 ,作为传输和接收过程的组成部分 , 会发生多次数据复制操作 , 从而在互连总线中产生巨大流量 。 这些流量引起访存次数的增加 , 从而导致低下的网络性能和扩展性问题 。 在 SMP 和 NUMA系统中 ,额外的高速CPU与相对慢速的互连总线之间的矛盾进一步加剧了扩展性问题。总线速率、总线吞吐率以及工作负荷生成的总线流量对于改进 Linux网络栈的性能至关重要 。 为了消除或减少数据流经总线的次数以及为了减少访存次数而对 Linux网络栈实施的任何改进都可以改善 Linux软件栈性能 。 下面分析2.6内核实现的一些增强特性 , 这些特性减少了在 TCP/IP 协议栈中执行的复制次数 , 从而提高了网络栈性能 。 这些增强特性具体包括以下内容:

  • SendFile支持
  • TCP分段卸载(TCP SegmentationOffloading ,TSO)支持
  • 进程和 IRQ亲合度
  • 网络设备驱动程序 API(NAPI)
  • TCP卸载引擎(TCP OffloadEngine ,TOE
1、SendFile
Linux 2.4网络栈支持 SendFileAPI , 允许通过直接内存访问(DMA)机制将应用数据从文件系统缓冲区 cache直接发送到网卡缓冲区 。通过使用网络栈和网络接口卡(NIC)中的 Zerocopy功能支持 , SendFileAPI可以将应用数据通过 DMA直接发送到网络上进行传输 , 而不必执行通常的用户空间到内核空间的复制操作 。 在典型的无 SendFile支持的情况下 ,应用程序发送文件的步骤如下:
  • 分配一个缓冲区 。
  • 将文件数据复制到缓冲区中(首先将文件数据从磁盘复制到内核缓冲区 cache , 然后再复制到应用程序的缓冲区) 。
  • 对复制到内核 socket缓冲区中的数据执行发送操作 。
  • 获取到达 NIC的 DMA 。
SendFileAPI和 Zerocopy可以旁路多余的复制操作 , 从而减少了涉及到许多复杂且CPU密集的操作的上下文切换过程 。 另外 , 相同数据的多个副本如果在多个 CPU中被处理 ,则会增加内存延迟、 cache不命中率以及地址转换后备缓冲器(translation lookasidebuffer ,TLB)cache不命中率 ,从而对性能产生负面影响 。额外复制的直接和间接后果会导致网络性能低下 。如名字所示 , SendFileAPI只能传输文件系统数据 。 因此 , 诸如 Web服务器、Telnet等处理动态数据和交互式数据的应用无法使用这个 API 。 由于在 Internet上传输的数据大部分是静态(文件)数据并且文件传输是这种通信的主体部分 , 因此SendFile API 和Zerocopy对于改进网络应用的性能非常重要 。 适当地使用了 SendFile和 Zerocopy的应用程序能够极大地改进网络性能 。


推荐阅读