提升服务器性能
希望提升您的高端 Linux 服务器的性能吗?您的 Linux 系统是否连接到高速网络?您的服务器是否花费过多资源来处理 TCP/IP 协议栈和以太网帧?这些只是当今网络环境中的一些问题。这些问题的出现是因为过去十年中,互联网和私有企业网络上的 TCP/IP 流量呈爆炸式增长,并且没有迹象表明这种增长会放缓。互联网在全球范围内的广泛普及以及 iSCSI 等新型网络存储技术的发展正在推动网络速度变得更快。尽管今天制造的处理器正在以惊人的速度提高速度,但与网络相关的增长很可能继续超过处理器速度的提升,从而拖慢服务器的主要任务,使其不得不处理网络数据包。
英特尔开发了一个原型,可以将整个 TCP/IP 协议栈从基于 Linux 的操作系统卸载到智能网络接口卡 (iNIC) 上。
iNIC 包含一个实时操作系统 (RTOS) 和一个完整的 TCP/IP 版本 4 协议栈。iNIC 上的 I/O 处理器 (IOP) 处理所有网络数据包,从而使主机处理器能够处理其他任务。为了实现这种分工,需要在主机端添加一层薄薄的逻辑来路由所有通过 iNIC 的网络流量。
这项技术基于智能 I/O (I2O) 架构,该架构已集成到 Linux 2.4.x 内核中。图 1 是为那些不熟悉 I2O 的人提供的 I2O 入门知识。I2O 规范是主机操作系统 (OS) 和位于 IOP 上的 I/O 设备之间基于消息的通信机制。IOP 运行一个智能 RTOS (IRTOS),其中包含每个连接设备的设备驱动程序模块 (DDM)。为了获得可移植性,I2O 使用了分离式驱动程序模型。该规范为每个受支持的设备类别(即 LAN、磁带、磁盘)定义了一组抽象消息。主机操作系统使用抽象消息层与 IOP 上运行的 DDM 进行通信。DDM 将这些 I2O 消息转换为硬件特定的命令。为了与 I2O 设备通信,主机操作系统必须具有一个驱动程序,该驱动程序知道如何将操作系统设备命令转换为 I2O 设备类命令。主机操作系统中的这个模块称为操作系统模块 (OSM)。
该解决方案基于此架构的扩展,创建了套接字类。对 I2O 架构进行了更改,以提高性能并最大限度地减少通常与分离式驱动程序模型相关的延迟。
套接字类定义了主机操作系统和 DDM 之间通信所需的消息。OSM 和 DDM 这两个驱动程序通过一个双层通信系统进行通信。消息层设置通信会话,传输层定义如何共享信息。DDM 由两个模块组成:中间服务模块 (ISM) 和硬件设备模块 (HDM)。ISM 提供 TCP/IP 版本 4 协议栈的全部功能。HDM 是 iNIC 的设备驱动程序。套接字 OSM 与 Linux 中的任何其他网络设备都不同。正常的网卡驱动程序是协议独立的,并且在网络应用程序编程接口 (API) 处与 Linux 内核接口。另一方面,套接字 OSM 将直接在套接字 API 下方接口。这允许将必要的套接字服务卸载到运行套接字类 ISM 的 IOP 上。套接字 OSM 替换了 TCP/IP 协议栈为内核提供的服务,从而为 Linux 内核提供必要的接口。它还将套接字请求和数据以套接字卸载格式传输和转换为在 iNIC 上运行的 TCP/IP 卸载协议栈。
OSM 分为以下子系统:用户界面、消息接口、内核接口和内存管理。
用户界面替换了内核中的 af_inet 套接字层。它向用户程序提供反馈,就像原生(非 TCP/IP 卸载)内核会提供反馈一样。
消息接口提供套接字卸载系统的初始化和控制。它将用户套接字请求转换为套接字消息。
内核接口为 OSM 提供内核服务。这是 OSM 提供通常由 TCP/IP 协议栈提供给内核的任何服务的点。此子系统的设计旨在最大限度地减少 Linux 内核所需的修改。
内存管理模块提供用户空间应用程序之间数据传输所需的缓冲区池。内存管理旨在:1) 尽量减少数据复制和 DMA 请求,2) 尽量减少主机中断,3) 避免需要昂贵的物理-虚拟地址映射,以及 4) 避免运行时动态内存分配的开销。OSM 中维护着两个 DMA 功能的数据缓冲区池。发送缓冲区包含发往 iNIC 的数据;接收缓冲区接收从套接字设备进入内核的数据。
如图 3 所示,Linux 网络组件由分层结构组成。用户空间程序员通过套接字访问网络服务,使用 Linux 套接字层提供的函数。include/linux/net.h 中定义的套接字结构构成了套接字接口实现的基础。用户层下方是 INET 套接字层。它管理基于 IP 协议(例如 TCP 和 UDP)的通信端点。此层由 include/net/sock.h 中定义的数据结构 sock 表示。INET 套接字层下方的层由套接字类型决定,可以是 UDP 或 TCP 层,也可以直接是 IP 层。IP 层下方是网络设备,它们接收来自 IP 层的最终数据包。
套接字 OSM 替换了 INET 套接字层。从套接字层传递的所有与套接字相关的请求都转换为 I2O 消息,这些消息被传递到 IOP 上的 ISM。
嵌入式系统软件包括消息传递层、TCP/IP 协议栈、设备驱动程序和 RTOS。
消息传递层是软件的一部分,它从 OSM 接收消息,解析消息,并对 TCP/IP 协议栈进行套接字调用。该层还接收来自网络协议栈的回复,并将适当的回复发送给 OSM。为了提高性能并最大限度地减少分离式驱动程序系统中固有的延迟影响,消息传递层会批量处理、回复和流水线请求。
嵌入式 TCP/IP 协议栈是 BSD 4.2 协议栈的零拷贝实现。它为消息传递层提供网络协议栈的所有功能。与 IOP 上运行的所有软件一样,该协议栈已经过优化,可以在配备 Intel XScale 微架构(ARM 架构兼容)的 Intel 80310 I/O 处理器芯片组上运行。在优化期间对 TCP/IP 协议栈进行了基准测试,以确保它在所有数据流量大小下都能良好运行。
HDM 的编写旨在利用 NIC 硬件的所有卸载功能。这包括发送和接收时的 TCP 和 IP 校验和、大型 TCP 数据包(大于 1,500 字节)的分段以及芯片支持的中断批处理。支持的 NIC 硅芯片是 Intel 82550 快速以太网多功能 PCI/CardBus 控制器和 Intel 82543GC 千兆以太网控制器。
RTOS 是一种专有操作系统,专为复杂的 I/O 操作的需求而设计。此操作系统完全符合 I2O 标准。选择它的部分原因是设计人员愿意为原型设计工作修改操作系统。
如前所述,应用程序层发出的套接字调用被转换为消息,这些消息通过 PCI 总线发送到 I/O 处理器。此嵌入式系统是一台用于执行 I/O 事务的完整计算机。它由处理器、内存、RTOS 和 PCI 总线组成。因为它专为 I/O 设计,所以它将最大限度地减少上下文切换的影响。一旦消息到达 IOP,就会对其进行解析。然后,在嵌入式网络协议栈上调用应用程序请求的套接字调用。一旦套接字操作完成,就会向 OSM 发送回复消息。
使用原型运行的基准测试表明,TCP/IP 协议栈的卸载显着降低了主机处理器的 CPU 利用率和中断次数。在负载较重的机器上,卸载的协议栈能够保持整体网络性能,并且主机 CPU 周期能够继续专用于工作负载应用程序。在原生机器中,主机处理器被中断的频率更高,并且网络应用程序因 CPU 资源匮乏而受到影响,从而导致网络性能下降。
随着 iSCSI(通过在 TCP/IP 数据包中封装 SCSI 实现基于 IP 的存储)主题开始升温,对最大限度地减少网络开销的需求将继续增长。将 TCP/IP 协议栈移动到 IOP 的努力可以迅速转移到在智能 iSCSI 适配器的后端提供功能齐全的 TCP/IP 协议栈。这将通过使 iSCSI 可以通过正常的 SCSI API 访问,从而最大限度地减少 iSCSI 对 Linux 平台的影响。为了与光纤通道竞争,iSCSI 必须提供可比的性能。
另一个未来的增强功能是嵌入式 Linux 将用于 RTOS。在此原型设计工作开始时,使用了 Intel i960 RM/RN 处理器,并且嵌入式 Linux 尚不可用。从那时起,英特尔推出了 XScale 微架构,从而可以采用适用于英特尔 StrongARM 内核的嵌入式 Linux。基于 Linux 的 StrongARM Linux 到 XScale 微架构的移植将在年底前完成。
此原型设计工作背后有几个目标:1) 证明通过从主机处理器卸载网络任务来提高性能可以减少主机处理器周期,否则这些周期会被网络数据处理消耗;2) 表明 iNIC 上专用软件的使用在执行相同的网络任务时保持了整体网络性能;以及 3) 使 I/O 处理器能够与主机处理器协同工作以处理网络流量,从而以最小的成本最大限度地提高基于 Linux 的服务器的性能。
使用嵌入式处理器将 TCP/IP 协议卸载到专用网络软件环境是提高系统性能的有效方法。随着高速网络部署的进步和网络存储的普及,TCP/IP 不可避免地将发挥重要作用。

