相比原生 Linux(Native Linux),采用Intel® DPDK技术后能够大幅提升IP转性能的主要原因在于Intel® DPDK采用了如下描述的主要特征。
轮询模式取代中断 通常当数据包进入的时候,Native Linux会从网络接口控制器(NIC,Network Interface Controller)接收到中断,然后调度软中断,对所得的中断进行上下文切换,并唤醒系统调用,如read()和write()。
相比之下,Intel® DPDK采用了优化的轮询模式驱动(PMD,Poll Mode Driver)代替默认的以太网驱动程序,从而可以不断地接收数据包,避免软件中断,上下文切换和唤醒系统调用,从而大大的节省重要的CPU资源,并且降低了延迟。
HugePage取代传统页 相比Native Linux的4kB 页,采用更大的页尺寸意味着可以节省页的查询时间,并减少转译查找缓存(TLB,Translation Lookaside Buffer)丢失的可能。
Intel® DPDK作为用户空间(User-space)应用运行时,在自己的内存空间中分配HugePage至存储帧缓冲区,环形和其他相关缓冲区,这些缓冲区是由其他应用程序控制,甚至是Linux内核。本白皮书描述的测试中,总计1024@2MB的HugePage被保留用于运行IP转发应用。
零拷贝缓冲区 在传统的数据包处理过程中,原生 Linux(Native Linux)解封包的报头,然后根据Socket ID将数据复制到用户空间(User Space)缓冲区。一旦用户空间(User Space)应用程序完成了数据的处理,一个write()系统调用将被唤醒并把数据送至内核,负责将数据从用户空间(User Space)拷贝至内核缓冲区,封装包的报头,最后借助相关的物理端口将数据发出去。显然,原生 Linux(Native Linux)在内核缓冲区和用户空间(User Space)缓冲区之间进行拷贝动作,牺牲了很多的时间和资源。
相比之下,Intel® DPDK在自己保留的内存区域接收数据包,这个区域位于用户空间(User Space)缓冲区,之后根据配置规则将这些数据包分类到每一个Flow中。在处理完解封包之后,在相同的用户空间(User Space)缓冲区中使用正确的报头进行包封装,最后通过相关的物理端口发送这些数据。
Run-to-Completion(RTC,运行到完成)和Core Affinity 在执行应用之前,Intel® DPDK会进行初始化,分配所有的低级资源,如内存空间,PCI设备,定时器,控制台,这些资源将被保留且仅用于那些基于Intel® DPDK的应用。初始化完成之后,每一个核(或线程,当BIOS设置中启用了Intel®超线程技术时)将被启用来负责每一个执行单元,并根据实际应用的需求,运行相同的或不同的工作负载。
此外,Intel® DPDK还提供了一种方法,即可以设置每个执行单元运行在每一个核心上,以维持更多的Core Affinity,从而避免缓存丢失。在此白皮书描述的测试中,aTCA-6200处理器刀片的物理端口根据Affinity被绑定在两个不同的CPU线程上。
无锁执行和缓存校准 Intel® DPDK提供的库和API,被优化成无锁,以防止多线程应用程序死锁现象的发生。对于缓冲区、环形和其他数据结构,Intel® DPDK也进行了优化,执行了缓存校准,以达到缓存行(Cache-Line)的效率最大化,同时最大限度减少缓存行(Cache-Line)的冲突。
|