在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直接发送到网络上进行传输,而不必执行通常的用户空间到内核空间的复制操作。