一剂良方克顽疾 英特尔I/O加速技术综述

  【IT168评测中心】越来越多的业务的成功依赖于快速的数据传输和处理。网络应用类型的不断创新,也在快速提升对于网络效能的需求。比如,IDC调查报告显示面世时间不长的iSCSI存储系统近几年推动了600%以上的以太网数据包的增长。

  为了更快的向应用程序传输数据或者得到数据,IT经理们不断的在新型网络和存储架构上进行着投资,以期获得更高的效能。然而网络瓶颈却越来越成为阻碍这些投资发挥完全作用的最大障碍。

  多种良方只为克顽疾一种

  自从上个世纪80年代起,尽管IT技术有了巨大的进步,但是TCP/IP(网络堆栈)的处理方式却几乎没有变化。也就是说,即便用户使用最先进的CPU依然要处理那些未经优化的TCP/IP协议,由此产生巨大的系统开销并不奇怪。比如,TCP/IP协议的传输过程中需要封装、解包,这些动作对于处理器而言并不是一个复杂的过程,但是却是会占用处理器周期,而且网络带宽越高,这个问题越严重。

频繁的内存访问会影响CPU效能

  系统开销的增大不仅仅表现在占用较多的处理器周期,还会导致处理网络相关数据导致时的内存访问效率降低的问题。这又会进一步的降低CPU效能和网络效率。

  客户端请求/服务器响应的模式已经应用了多年,通过TCP/IP协议交换数据也已经是处理网络数据必需方法,因此了解基于传统模式的数据传输流程将有助于我们发现目前网络I/O中的“顽疾”所在。

数据进出服务器应用程序的流程
  1. 客户端通过网卡将请求以TCP/IP数据包的形式发送给服务器。数据包包括TCP报头信息和实际要传送的数据。

  2. 服务器处理TCP/IP包,然后将其中的信息分配给相应的应用程序。

  3. 运行在服务器上的应用程序获悉客户端请求,然后去存储器中查找所需的数据来响应请求

  4. 应用程序访问存储器来获得数据以满足客户端的请求

  5. 存储将应用程序所请求的数据反给应用程序

  6. 应用程序按照客户端的请求将从存储器调用数据进行处理

  7. 服务器将处理器结果封装成TCP/IP包然后传回客户端

  这个过程中的各个环节均有各自的开销和延迟,这些开销和延迟包括处理客户端发送来的TCP/IP包、将包中有效数据 发送给应用程序、获取存储信息和在将处理结果封装成TCP/IP包。在过去,网络流量较低,处理网络相关数据所产生的开销,远远低于用于执行正常任务的开 销,所以并不被人所关注。现在,虽然网络流量的大幅度提升,处理网络相关数据所产生的系统开销则越来越不能忽视,甚至已经影响到了正常应用。

  这些问题已经引起了业界的普遍关注,并且已经有了几种解决方案:

  • TOE(TCP Offload Engine,TCP卸载引擎)通过网卡上的专用处理器处理部分或者全部的封包,借此来降低对于系统处理器资源的占用,不过这种解决方案也只是对于具有某些特征的数据包有效;

  • RDMA(Remote Direct Memory Access,远程直接内存访问)是发送端系统直接将有效数据送至目的系统的指定的内存中,无需移动数据包的时间消耗,因此大大提升了网络传输的效率。但 是这种技术需要专用的网卡,应用程序也需要进行修改,甚至还增加了一个RDMA层的封装过程,而且这种操作风险较高,因此目前看来还并非一个吸引人的解决 方案;

  • Onloading技术将系统处理器作为处理网络流量的第一引擎,尽可能的提升CPU处理器网络数据包的效率,这种思想已经被英特尔借鉴。

  这些方案中TOE是被应用非常广泛的,几乎每次关于I/OAT的技术讲座中,都会有听众询问两者之间的异同。从结果 上看,两者非常的类似,都是尽量的提升网络处理效能,降低处理器负载。两种技术的实现方式却是南辕北辙,TOE仅仅着眼于NIC本身,通过增加协处理器来 提升数据包的处理效率。I/OAT的精髓却是不局限于I/O问题的本身,从整个平台的层面入手解决问题。

  头痛不医头,第一代Intel I/O加速技术

  平台化策略使得英特尔不再仅以推出速度更快的处理器为满足,他们更加注重整个平台的协调和平衡,任何浪费都可能会让他们在提升处理器性能上所做的努力付之东流。所以,英特尔在去年推出Bensley平台的同时,也推出了英特尔I/O加速技术(I/OAT),充分表达了“以应用为中心的服务器I/O观点”。

  概括的来说,I/OAT是一个整合于系统平台中的用于移动数据、访问数据和降低网络I/O过程中系统开销的I/O解决方案。Intel I/OAT可以帮助从服务器应用程序中更快、更高效(占用更少的CPU周期)的获取数据。升级到支持I/OAT的平台,用户原来的应用程序立刻可以从中受益(比如可以同时访问更多的数据、处理更多用户的请求)而无需进行任何的修改。

  Intel I/OAT主要在三个方面解决网络I/O瓶颈:

  • 降低系统开销

  • 实现流线型内存访问

  • 优化TCP/IP协议计算

  Intel I/OAT通过适度的中断、适度的内存访问、并行计算、数据移动和减少上下文切换等措施来降低系统开销。比如通过预取操作来提升内存访问和数据移动效率,直接访问子系统可用于卸载数据移动和异步拷贝,TSO(TCP segmentation offload)运算转移给网卡(NIC)或者板载LAN控制器(LOM),并且在数据流和特定的处理器核心之间建立密切的联系。这些技术可以降低网络I/O过程中的CPU占用率,包括协议计算,并且明显的降低由于缓存未命中和Cache line bouncing所引起的CPU停滞。

英特尔I/OAT所涉及的方方面面

  如上图所示,Intel I/OAT涉及到服务器系统的方方面面:

  • Network Flow Affinity:分割网络堆栈处理并且动态的分配到多个物理或者逻辑CPU,这种方式可以使得数据得到更快的处理。

  • 异步低成本拷贝:采用了增强型DMA,可以用更少的CPU时钟从系统内存中的网卡缓冲区复制有效数据到应用程序缓冲区,节约下来的CPU资源可以进一步提升应用程序的负载能力。

  • 通过优化TCP/IP栈改进TCP/IP协议:主要优化分离封包头部和有效数据的处理。结合与栈相关的改进可以降低处理协议的时钟数量。


  I/OAT的微妙的生存环境

  Intel I/OAT刚刚推出之初,其应用环境并不成熟,比如在Windows Server 2003 SP1系统上需要额外安装SNP包和特有的驱动程序,Linux世界尚未接纳这项技术,而且只有Intel自己生产的网卡控制器芯片能支持这个功能。我们曾经在2006年度服务器横评中发现,英特尔I/O加速技术所面临的局势非常微妙:

  在这14台服务器中,有3台服务器采用了AMD Opteron平台,因此这21%的产品肯定不支持英特尔I/O加速技术,在剩余的11台服务器中,只有3台服务器支持TOE技术,剩余的8台服务器全部支持英特尔I/O加速技术,从数量上看英特尔I/O加速技术毫无悬念的取得了占有率的领先。

  然而,我们发现此次参测的DELL POWEREDGE 2950服务器、HP ProLiant DL380 G5服务器、IBM X3650服务器全部选择了TOE技术,而没有采用英特尔I/O加速技术。这三家厂商在全球服务器市场占据什么样的地位自不必说,而这三款产品也是各家厂商的主力机型。

  短短的一年之后,在IDF2007会议期间,我们获悉Intel I/OAT获得了很多重量级厂商的,其应用环境已经趋于成熟:

  • Linux 2.6.18内核支持

  • Novell SUSE Linux Enterprise 10支持

  • Micorsoft Server 2003 SNP支持

  • VMware ESX 3.x即将正式支持


  实战I/OAT部署

  要正确的启用I/OAT功能,支持I/OAT的硬件、操作系统驱动程序三个方面的条件缺一不可:

  • 操作系统的支持

  目前Windows Server 2003 with service pack 2可直接支持I/OAT,而Windows Server 2003 with service pack 1用户则需要安装Microsoft Scalable networking pack,这个补丁包为Windows Server 2003 SP1增加了新的体系结构增强功能和应用程序编程接口 (API),以支持下一代的网络加速和基于硬件的卸载技术。

  此外,Linux 2.6.18及其以上版本内核、Novell SUSE Linux Enterprise 10等主流的Linux操作系统都已经支持该功能。

  • 硬件设备的支持

  笼统的来讲,目前只有基于Bensley平台的产品才支持I/OAT。比如,英特尔最 新的双核Xeon 5000/5100系列处理器为处理网络堆栈进行优化,处理该类操作效率会更高。MCH芯片则整合了数据移动引擎(Data movement engine)。另外,在MAC层实现了硬件辅助加速——这个部分是需要我们重点强调的,属于Bensley平台体系的南桥芯片有两 款:6311/6321ESB,只有其中的6321ESB支持英特尔I/OAT。

HY82563是一款配合6321ESB所整合的MAC功能的双端口PHY芯片,目前我们所接触到的Bensley平台均采用了这颗芯片

  Intel给出了目前支持I/OAT的网卡的列表:

  • Intel PRO/1000 PT Server Adapter

  • Intel PRO/1000 PT Dual Port Server Adapter

  • Intel PRO/1000 PT Quad Port Server Adapter

  • Intel PRO/1000 PT Quad Port Low Profile Server Adapter

  • Intel PRO/1000 PF Server Adapter

  • Intel PRO/1000 PF Dual Port Server Adapter

  • Intel PRO/1000 PF Quad Port Server Adapter

  • Intel PRO/1000 PT Network Connection

  • Intel PRO/1000 PF Network Connection

  • Intel PRO/1000 EB Network Connection with I/O Acceleration

  • Intel PRO/1000 EB Backplane Connection with I/O Acceleration

  • Intel PRO/1000 PB Server Connection

  • Intel PRO/1000 PB Dual Port Server Connection

  • 驱动程序的支持

  如果要正确的启用I/OAT功能,用户还需要安装支持I/OAT功能的网卡驱动程序。如果安装的驱动程序不支持I/OAT功能,网卡还是可以正常工作的,但是在设备管理器中会发现网卡设备前面有黄色叹号的标记。

  英特尔提供了一个名称为“Intel I/OAT System Check”的工具,这个工具可以检验用户的硬件是否支持I/OAT,I/OAT功能是否正确启用。图4-1显示该工具侦测到硬件平台支持I/OAT但是并没有启用。

  根据我们的经验,在一台符合要求的服务器上部署Windows Server 2003 SP2可以较为容易的启用I/OAT功能,但是不少用户在Windows Server 2003 SP1上则遇到了问题。这里我们介绍一下方法:

  第一步,安装Windows Server 2003 SP1

  第二步,安装INF驱动程序包,INF 7.3.x.xxxx和INF 8.1.x.xxxx及其以上版本均可。安装INF驱动程序之后,设备管理器中发现一个名称为“Base System Device”的未知设备(如上图所示),这是启用I/O AT功能的重要设备。

  第三步,安装KB912222更新程序,也就是Microsoft Scalable networking pack

  第四步,安装1A38设备的驱动程序。一般需要通过设备管理器界面升级“Base System Device”,正确安装驱动之后,其被识别为“Intel 5000 Series Chipsets Integrated Device-1A38。”

  在查看Intel 5000 Series Chipsets Integrated Device-1A38的设备属性,会发现一个名称为“Setting”的标签,在这里用户可以选择是否启用英特尔I/O加速技术。至此,我们成功的启用了I/OAT功能。

  TOE的实现,也是壁垒重重

  从前面的介绍,用户会发现顺利的启用Intel I/OAT所具备的条件着实不少。用户如果要在服务器系统中引入TOE技术,那么也需要满足硬件、驱动程序、操作系统等三大方面的要求。

  以我们在过去所测试的DELL POWEREDGE 2950服务器、HP ProLiant DL380 G5服务器、IBM X3650服务器这三款支持TOE技术的服务器为例,它们均配置了采用Broadcom BCM5708或者BCM5706C芯片的千兆网卡,这两个系列的芯片才支持TOE、RDMA、iSCSI等加速技术。

  用户需要使用Broadcom NetXtreme 8.3和NetXtreme II 2.6及其以上版本的驱动程序才能支持TOE等技术。

  用户在Windwos Server 2003 SP1操作系统上也需要安装Microsoft SNP补丁才能实现对于TOE的支持。Liunx世界因为可靠性等原因,并没有实现对于TOE的正式支持,比如Redhat目前的Red Hat Enterprise Linux版本并不支持这个功能,而且未来的版本也不会提供支持(http://kbase.redhat.com/faq/FAQ_45_4898.shtm)。

  Intel I/OAT广泛部署于基于Benlsey平台设计的服务器上,有点类似于标准配置的味道,而TOE则不同,它需要用户根据情况另外花钱购买。比如部分Dell服务器的板载网卡是支持TOE功能的,但是用户需要另外购买硬件钥匙才能启用该功能。

  应用TOE的限制也不少,如果系统中安装或激活某些防火墙、构建VPN服务器、启用桥接功能、启用路由服务、启用IPNAT、启用IPSec等功能时,TOE均无法正常工作。Intel 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
EIST Disable
C1 State Disable
HyperThreading 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技术。

测试平台1:未开启I/O AT功能时处理器负载

测试平台1:开启I/O AT功能时处理器负载

  从上面的数据可以看出,未启用I/OAT技术时,运行NIC.tst测试时处理器负载大约是15.3%,而开启I/OAT技术之后,处理器负载为12.5%,处理器负载下降幅度为18%。

  英特尔的公布的资料中展示了I/OAT在Linux和Windows Server 2003两种操作系统中的表现。一个硬件平台是基于E7520芯片组构建的不支持I/OAT功能,一个硬件平台则是基于Benlsey平台构建的支持I /OAT功能。每台服务器中都安装8个千兆网卡,读者会发现I/OAT在多网卡应用中其作用更加明显。

 

  Linux环境下,在2端口的时候,支持I/OAT的平台和不支持I/OAT的平台的吞吐量差异不大,但是CPU占用率却有巨大差异,前者只有7%而后者则达到了24%。

  4-8端口时,不支持I/OAT的Intel E7520平台的吞吐量基本稳定在4000Mbps左右,甚至还有轻微下降的趋势,但是此时CPU已经几乎是满载了。支持I/OAT的新双核Intel Xeon平台的吞吐量却基本上保持了线性增长,当8端口时吞吐量已经达到了11000Mbps以上,而CPU占用率依然只有56%。

 

  在Microsoft Windows Server 2003操作系统下的测试结果所表现出来的趋势同Linux操作系统下的测试结果相同。支持I/OAT功能的双核Xeon平台处理器占用率在11-70% 之间(占用CPU资源比Linux平台略高),而吞吐量也是在4000-11000Mbps之间。各位读者一定注意到,上图中并没有在Intel E7520平台上的CPU占用率曲线,主要是在4端口时,该系统已经完全饱和,无法很好的侦测处理器占用率了。

  直接缓存访问,第二代I/OAT

  英特尔计划在2007年将会全面升级DP和MP服务器平台,无论是定位于嵌入式应用的Cranberry Lake平台、还是定位于主流双路处理器的Stoakley平台、或者是定位于多路处理器的Caneland平台,都将会支持新一代的I/OAT2技术(代号Crystal Beach2)。

  I/OAT2有两个主要的设计目的,第一个是进一步增强数据中心网络I/O能力,第二个继续保持英特尔I/OAT的无状态架构优势。同样,I/OAT2依然是一个平台级的I/O优化方案,涉及到了CPU、芯片组、网卡控制器、等多个方面。

 

  第一代的I/OAT通过增强软件接口、软件预取到CPU、优化数据流等措施,实现对于TCP协议栈的优化处理。新一代的I/OAT2利用DCA(Direct Cache Access,直接高级缓存访问)技术,进一步降低频繁存取内存对系统性能所造成的负面影响。I/OAT2通过芯片组支持QuickData技术,该技术通过直接将网络数据放入内存中无需处理器参与,从而加速了标准网络数据的传送过程。英特尔在此基础上增加了DCA和MSI-X等功能,以提升数据传输和复制的效率。

  支持IOAT2的网卡控制器不仅支持无状态卸载,TCP分配&效验和卸载,优化多队列&数据流,分离头部/有效负载等功能,还通过增加对于DCA、MSI-X、中断快速响应、头部分离/复制等功能的支持,提升IO效能。

 

  可以看到DCA和MSI-X两个功能是此次IOAT2所带来的主要改进。DCA(Direct Cache Access,直接高级缓存访问)基本工作原理是使得CPU高速缓存中的数据可以被网络控制器优先访问,一方面充分利用缓存中的数据,另外一个方面利用高 速缓存低延迟的特性,来避免CPU频繁的访问内存,降低系统开销。DCA有两种基本的工作模式,当处理小型I/O任务的时候,甚至不需要芯片组中 QuickData引擎的参与,只有当处理大型I/O任务的时候才需要。

  MSI-X(Extended Message Signaled Interrupts,扩展消息信号中断)是MSI(消息信号中断)的增强版本,是PCIe 1.1规范中增加的新特性,可以将PCIe总线中的数据封包进行更灵活的分割,满足不同应用的需求。在I/OAT2中结合了直接内存访问、选择性中断行为 的流量区别等功能,提供了更快的中断速度。

  I/OAT2还支持头部分离/复制这一新特性。头部分离是TCP/IP协议处理过程中一个必不可少的过程,I /OAT2将来自数据/有效负载的TCP、IP头部放入不同的内存缓冲中。头部复制动作则是将头部进行拷贝并放置于不同的缓冲中,然后将整个数据包放入另 一个缓冲中。头部复制可用于处理更长的头部。

  I/OAT2顺应服务器应用虚拟化潮流,可提供更高效的网络数据传输,比如VM、VMM网络协议栈处理效率均可受益,该技术还可以加速数据从网络NIC硬件队列到虚拟NIC的移动。此外还利用了VMDq(NIC使用多硬件队列给VMM软交换机加速)来提升虚拟化应用的效能。

  英特尔将会于9月上旬发布新的服务器平台,届时I/OAT2技术也会正式浮出水面,它的效能将会对于英特尔新平台在网络应用中的表现有着重大影响,我们期待着能够尽快验证并享用这一新的平台技术。


原文网址:http://publish.it168.com/2007/0824/20070824045901.shtml

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shape-aware Loss 是一种用于图像分割任务的损失函数,它通过考虑目标形状信息来提高分割模型的性能。下面是使用 PyTorch 实现 Shape-aware Loss 的代码和使用方法: ```python import torch import torch.nn as nn class ShapeAwareLoss(nn.Module): def __init__(self, lambda_shape=1.0, reduction='mean'): super(ShapeAwareLoss, self).__init__() self.lambda_shape = lambda_shape self.reduction = reduction def forward(self, inputs, targets): bce_loss = nn.BCEWithLogitsLoss(reduction='none')(inputs, targets) shape_loss = self._compute_shape_loss(targets) total_loss = bce_loss + self.lambda_shape * shape_loss if self.reduction == 'mean': return total_loss.mean() elif self.reduction == 'sum': return total_loss.sum() else: return total_loss def _compute_shape_loss(self, targets): # 计算形状损失的具体实现 # 这里可以根据具体需求进行编写,下面是一个简单示例 shape_loss = torch.mean(torch.abs(targets - torch.mean(targets))) return shape_loss # 使用示例 criterion = ShapeAwareLoss(lambda_shape=0.5) inputs = torch.randn(10, 1, 256, 256) # 模型预测结果 targets = torch.randn(10, 1, 256, 256) # 真实标签 loss = criterion(inputs, targets) loss.backward() ``` 在上面的代码中,我们定义了一个名为 `ShapeAwareLoss` 的自定义损失函数类,它继承自 `nn.Module`。在 `forward` 方法中,我们首先计算二值交叉熵损失(`bce_loss`),然后计算形状损失(`shape_loss`)通过调用 `_compute_shape_loss` 方法。最后,将二值交叉熵损失和形状损失加权相加得到最终的损失值。 在使用示例中,我们创建了一个 `ShapeAwareLoss` 实例,并传入了 `lambda_shape` 参数。然后,我们创建了模型的预测结果 `inputs` 和对应的真实标签 `targets`。通过调用 `criterion` 实例的前向传播方法,即可计算出 Shape-aware Loss,并进行反向传播以更新模型参数。 请注意,这只是 Shape-aware Loss 的一个简单实现例子,你可以根据自己的需求和实际场景进行更改和调整。具体的形状损失计算方法需要根据具体任务和需求来设计,并在 `_compute_shape_loss` 方法中实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值