2006年9月12日,英特尔专门在北京中国大饭店召开了一场主题为“优化平台、提升效率”的技术研讨会。期间,英特尔详细的剖析了I/O加速技术,并且详细的解答了关于服务器应用中I/O相关的问题。
英特尔指出,目前之所以网络带宽投资和产出不成正比的原因主要包括两个方面。原因之一是,网络应用的类型增加快速,而每种应用所需要处理的数据量也越来越多,服务器所要面临的数据增长速度甚至有超过服务器性能增长的趋势。原因之二是,自从上个世纪80年代起,尽管技术上有巨大的进步,但是TCP/IP(网络堆栈)的处理方式却几乎没有变化,这也就是说当前非常先进的CPU依然要处理那些未经优化的TCP/IP协议。比如,TCP/IP协议的传输过程中需要封装、解包,这些动作对于处理器而言并不是一个复杂的过程,但是却是会占用处理器的时间,而且网络带宽越高,这个问题越严重。
图1-1:9月12日,英特尔公司亚太区通信市场总监程宇樑在北京向 主流媒体介绍I/O加速技术 |
目前有几种技术在试图提升网络应用的效能,降低网络应用对于系统处理器资源的占用。TOE(TCP Offload Engine,TCP卸载引擎)通过网卡上的专用处理器处理部分或者全部的封包,借此来降低对于系统处理器资源的占用,不过这种解决方案也只是对于具有某些特征的数据包有效;RDMA(Remote Direct Memory Access,远程直接内存访问)是发送端系统直接将有效数据送至目的系统的指定的内存中,无需移动数据包的时间消耗,因此大大提升了网络传输的效率。但是这种技术需要专用的网卡,应用程序也需要进行修改,甚至还增加了一个RDMA层的封装过程,而且这种操作风险较高,因此目前看来还并非一个吸引人的解决方案;Onloading技术将系统处理器作为处理网络流量的第一引擎,尽可能的提升CPU处理器网络数据包的效率,这种思想已经被英特尔借鉴。
客户端请求/服务器响应的模式已经应用了10多年的时间了,而通过TCP/IP协议交换数据也已经是处理网络数据必需方法,因此了解基于传统模式的数据传输流程将有助于我们发现目前网络I/O中的问题。
图1-2:数据进出服务器应用程序的流程,这个过程中的各个环节 均有各自的开销和延迟,这些开销和延迟包括处理客户端发送来 的TCP/IP包、将包中有效数据发送给应用程序、获取存储信息和 在将处理结果封装成TCP/IP包 |
-
客户端通过网卡将请求以TCP/IP数据包的形式发送给服务器。数据包包括TCP报头信息和实际要传送的数据。
-
服务器将TCP/IP包进行处理,然后将其中的信息分配给相应的应用程序。
-
运行在服务器上的应用程序了解了客户端请求,然后去存储器中查找所需的数据来响应请求
-
应用程序访问存储器来获得数据以满足客户端的请求
-
存储将应用程序所请求的数据反给应用程序
-
应用程序按照客户端的请求将从存储器调用数据进行处理
-
服务器将处理器结果封成TCP/IP包然后传回客户端
图1告诉我们网络封包必需经过接收、验证和处理才能将其中的有效数据提供给应用程序。运行服务器上的应用程序常常需要从内存取出必要的数据并且将结果返回给服务器。最后,服务器必需将应用程序影响结果封装到TCP/IP包中然后发回给客户端。显然网络I/O瓶颈是多方面因素造成的,是一个平台层面的问题。
I/OAT——英特尔的解决方案
伴随着英特尔Bensley平台的发布,英特尔同时抛出了I/OAT(I/O加速技术)的概念。概括的来说,I/OAT是一个整合于平台中的用于移动数据、访问数据和降低网络I/O过程中系统开销的I/O解决方案。Intel I/OAT可以帮助从服务器应用程序中更快、更高效(占用更少的CPU周期)的获取数据。升级到支持I/OAT的平台,用户原来的应用程序立刻可以从中受益(比如可以同时访问更多的数据、处理更多用户的请求)而无需进行任何的修改。
图2-1 |
Intel I/OAT主要在三个方面解决网络I/O瓶颈:
-
降低系统开销
-
流线型内存访问
-
优化TCP/IP协议计算
Intel I/OAT通过适度的中断、适度的内存访问、并行计算、数据移动和减少上下文切换等措施来降低系统开销。比如通过预取操作来提升内存访问和数据移动效率,直接访问子系统可用于卸载数据移动和异步拷贝,TSO(TCP segmentation offload)运算转移给网卡或者板载LAN控制器,并且在数据流和特定的处理器核心之间建立密切的联系。这些技术可以降低网络I/O过程中的CPU占用率,包括协议计算,并且明显的降低由于缓存未命中和Cache line bouncing所引起的CPU停滞。
-
Network Flow Affinity:分割网络堆栈处理并且动态的分配到多个物理或者逻辑CPU,这种方式可以使得数据得到更快的处理。
-
异步低成本拷贝:采用了增强型DMA,可以用更少的CPU时钟从系统内存中的网卡缓冲区复制有效数据到应用程序缓冲区,节约下来的CPU资源可以进一步提升应用程序的负载能力。
-
通过优化TCP/IP栈改进TCP/IP协议:主要优化分离封包头部和有效数据的处理。结合与栈相关的改进可以降低处理协议的时钟数量。
所有的这些改进可以有效的促进网络性能,它们的统称就是英特尔I/OAT。
需要注意的是,封包大小的变化也会使得上述的几个方面的对于网络I/O的影响的比重发生变化。一般来说,I/O尺寸越小,系统开销会越大,这也就意味着应用不同或者说需要传输的数据类型不同,其所面临的问题也是有所不同的。如图2-3所示,TCP/IP处理所占用的CPU资源远比系统开销和内存访问低,因此我们所熟悉的TOE技术所能发挥的作用也是很有限的。此外,将网络堆栈卸载的任务交给一个具有固定速度的微处理器,其风险也是可想而知的,这也是为什么关键网络配置中并不会应用TOE功能的原因。
支持RDMA协议的网卡可以直接将有效数据存放于应用程序的内存空间从而降低数据移动过程所产生的开销。RDMA在现有网络协议上的附加协议,为了安排每次数据传输它当然也会产生自己的开销。
RDMA并没有将这些任务分配给CPU,而是利用TOE(TCP offload Engine)。通过将TOE和RDMA结合在一起,来改进数据移动和卸载处理这两个协议所需的开销。RDMA的缺点也很明显,它需要修改应用程序,使得它们可以支持RDMA功能,因此只有少数的服务器环境可以支持RDMA协议。此外,RDMA是一个端到端协议,它需要所有参与数据传输的系统都支持该协议。因为这些原因,使得RDMA的接受度并不高。
相对而言,英特尔I/OAT则可以解决所有的服务器I/O瓶颈问题,而且仅仅使用TCP/IP协议无需对于现有或者未来的应用程序做修改。
启用I/OAT功能的三个必备条件
要正确的启用I/OAT功能,三个方面的条件缺一不可:
-
操作系统的支持
Windows Server 2003 SP1对于I/OAT功能提供了支持,但是需要安装KB912222更新程序,微软网站上是这样介绍的:
“Microsoft Windows Server 2003 可伸缩网络包包含将网络处理转移到硬件的功能。 TCP Chimney 构架具有允许将 TCP/IP 处理转移到硬件的功能。 Receive Side Scaling 允许将接收数据包的处理分配给多个 CPU。 TCPA 也是一种转移功能,这种功能可以使用 PCI 总线上的硬件 DMA 引擎来协助接收处理。 安装本更新程序之后,可能需要重新启动计算机。”
主流的Linux操作系统也已经提供了对于I/OAT功能的支持。
-
硬件设备的支持
笼统的来讲,目前只有基于Bensley平台的产品才支持I/OAT。比如,英特尔最新的双核Xeon 5000/5100系列处理器为处理网络堆栈进行优化,处理该类操作效率会更高。MCH芯片则整合了数据移动引擎(Data movement engine)。另外,在MAC层实现了硬件辅助加速——这个部分是需要我们重点强调的,属于Bensley平台体系的南桥芯片有两款:6311/6321ESB,只有其中的6321ESB支持英特尔I/OAT。
图3-1: HY82563是一款配合6321ESB所整合的MAC功能的双端口PHY 芯片,目前我们所接触到的Bensley平台均采用了这颗芯片 |
-
驱动程序的支持
如果要正确的启用I/OAT功能,用户还需要安装支持I/OAT功能的网卡驱动程序。如果安装的驱动程序不支持I/OAT功能,网卡还是可以正常工作的,但是在设备管理器中会发现网卡设备前面有黄色叹号的标记。
图3-2 |
英特尔提供了一个名称为“Intel I/OAT System Check”的工具,这个工具可以检验用户的硬件是否支持I/OAT,I/OAT功能是否正确启用。图4-1显示该工具侦测到硬件平台支持I/OAT但是并没有启用。
I/OAT功能的部署
在用户给一部基于Bensley平台的服务器安装Windows Server 2003 SP1操作系统的过程,我们建议按照如下的顺序进行安装,这样可以较为顺利的启用I/OAT功能。
-
安装Windows Server 2003 SP1
-
安装INF驱动程序包
-
安装支持I/OAT的驱动程序
图4-1 |
在安装Windows server 2003操作系统,安装INF驱动程序之后,设备管理器中发现一个名称为“Base System Device”的未知设备(如图4-1所示),这是启用I/O AT功能的重要设备。需要说明的是,我们先后安装过INF 7.3.x.xxxx和INF 8.1.x.xxxx,I/OAT功能均可正常的工作。对于安装INF和KB912222更新程序的顺序并不太重要,无论是先安装INF还是先安装KB912222更新程序,我们均可得到希望的结果。
如果网卡驱动程序带有安装程序那么直接执行该安装程序,如果没有则需要通过设备管理器界面升级“Base System Device”和网卡的驱动程序。
图4-2 |
硬件升级向导一般会从服务器随机附带的驱动光盘中找到“Base System Device”设备的驱动程序,这个设备被识别为Intel 5000 Series Chipsets Integrated Device-1A38。
图4-3 |
在查看Intel 5000 Series Chipsets Integrated Device-1A38的设备属性,会发现一个名称为“Setting”的标签,在这里用户可以选择是否启用英特尔I/O加速技术。
英特尔官方测试数据
英特尔公布的是在Linux操作系统和Windows操作系统下,对于基于单核Xeon处理器和支持I/OAT技术的双核Xeon处理器的服务器平台进行的对比测试结果。该文档中英特尔并没有太详细的描述测试方法,不过我们在英特尔于9月12日举行的“英特尔I/O加速技术研讨会”上对于其测试方法有了一定的了解。
图5-1 |
被测服务器中上一般会安装若干数量的网卡,上图所示的示意图中是安装了6块支持I/OAT的网卡,我们下面展示的曲线图中则最高进程了8块支持I/OAT技术的网卡。
图5-2 |
如上图所示,在2端口的时候,支持I/OAT的平台和不支持I/OAT的平台的吞吐量差异不大,但是CPU占用率却有巨大差异,前者只有7%而后者则达到了24%。
4-8端口时,不支持I/OAT的Intel E7520平台的吞吐量基本稳定在4000Mbps左右,甚至还有轻微下降的趋势,但是此时CPU已经几乎是满载了。支持I/OAT的新双核Intel Xeon平台的吞吐量却基本上保持了线性增长,当8端口时吞吐量已经达到了11000Mbps以上,而CPU占用率依然只有56%。
图5-3 |
在Microsoft Windows Server 2003操作系统下的测试结果所表现出来的趋势同Linux操作系统下的测试结果相同。支持I/OAT功能的双核Xeon平台处理器占用率在11-70%之间(占用CPU资源比Linux平台略高),而吞吐量也是在4000-11000Mbps之间。各位读者一定注意到,上图中并没有在Intel E7520平台上的CPU占用率曲线,主要是在4端口时,该系统已经完全饱和,无法很好的侦测处理器占用率了。
英特尔I/OAT效能实测
由于条件的限制我们验证I/OAT效能的方法同英特尔官方的并不相同。我们在如下表所示的平台上配置了文件服务器,然后利用Netbench v7.03 NIC.tst测试脚本进行了测试,同时利用Windows Server 2003内置的“系统监视器”监测处理器占用率。
测试平台配置 | |
主板 |
Gigabyte GA-7BESH-RH |
芯片组 |
Intel 5000P+6321ESB |
驱动程序 |
INF 7.3.1.1013 |
处理器 |
Intel Xeon 5080 |
主频 |
3.73GHz |
FSB |
1066MHz DIB |
L2容量 |
2 x 2MB |
处理器设置 |
XDbit Disable |
内存 |
三星512MB 1Rx8 PC2-4200F x8 |
内存时序 |
444-11 |
磁盘控制器 |
LSI Logic MegaRaid SAS 8408E RAID卡 |
硬盘 |
FUJITSU MAX3147RC x 4 |
驱动程序 |
1.17.0.32 |
磁盘设置 |
四块硬盘配置为RAID 5模式,磁盘分为两个分区,均为NTFS格式,系统默认簇,主分区20GB,其它分为扩展分区,共享文件夹、磁盘测试均在格式化后的扩展分区进行 |
操作系统 |
Microsoft Windows Server2003,5.02.3790,SP1 |
网卡 |
Intel Pro/1000EB Network Connection with I/O Acceleration |
驱动程序 |
9.3.28.0(1/23/2006) |
这款基于英特尔Bensley平台的服务器采用了Xeon 5080处理器(Dempsey核心,3.73GHz),可支持I/OAT技术。
未开启I/O AT功能时处理器负载 |
开启I/O AT功能时处理器负载 |
从上面的数据可以看出,未启用I/OAT技术时,运行NIC.tst测试时处理器负载大约是15.3%,而开启I/OAT技术之后,处理器负载为12.5%,处理器负载下降幅度为18%。
IT168评测中心观点
从测试来看,单个千兆网卡应用时,I/OAT对于性能的提升并不明显,它的优势在于多端口网卡扩展性,支持I/OAT的硬件设备几乎可以提供接近于线性的扩展能力——这一点从英特尔公布的数据可以看出。即便用户的应用仅仅限于单端口网卡,那么也能因为更低的CPU占用率受益,这主要I/OAT针对TCP/IP栈进行优化的结果。
英特尔I/O加速技术的主要特性表现为:可操作性、可升级性和可靠性。I/O加速技术有利于减少CPU的资源浪费,使系统在处理多种紧急任务时可以获得更多的资源。该技术主要通过优化CPU、芯片组、网络控制器和软件的运行效能来缩小操作性能方面的瓶径。此为I/OAT的可操作性;利用英特尔标准千兆网络适配器可以很方便的升级到8千兆和万兆以太网端口,并且基本保持性能的线性增长,此为I/OAT的可升级性;I/OAT的已经获得了Windows Server 2003和Linux等主流操作系统的支持,是一个安全和灵活的选择,此为I/OAT的可靠性。
总而言之,不局限于I/O问题的本身,从整个平台的层面来着手,这就是英特尔I/OAT的解决之道。