DPDK與SR-IOV兩者目前主要用於提高IDC(數據中心)中的網絡數據包的加速。但是在NFV(網絡功能虛擬化)場景下DPDK與SR-IOV各自的使用場景是怎樣的?以及各自的優缺點?
本文主要通過從以下幾點來闡述這個問題:
1、什么是DPDK?
2、什么是SR-IOV?
3、DPDK與SR-IOV有何不同?
4、DPDK與SR-IOV各自適合的應用場景是怎樣的?
1、什么是DPDK?
DPDK(Data Plane Development Kit)是6Wind、Intel開發的一款高性能的數據平面開發工具包。為了方便理解DPDK我們先了解下Linux內核是如何處理網絡數據包的。

圖1 左:Linux kernel 右:DPDK
默認情況下,Linux 使用內核來處理網絡數據包,隨着IDC(數據中心)NIC速率逐步從40G到目前主流的100G,未來將逐步替換為400G。Linux內核已經不再適合處理高速網絡。
內核弊端:
1、中斷處理:當網絡中大量數據包到來時,會頻繁產生中斷請求,頻繁的中斷會產生較高的性能開銷、並造成上下文的切換產生時延。
2、內存拷貝:網絡數據包到來時,網卡通過 DMA 等拷貝到內核緩沖區,內核協議棧再從內核空間拷貝到用戶態空間,在 Linux 內核協議棧中,這個耗時操作甚至占到了數據包整個處理流程的 57.1%。
3、局部性失效:目前主流處理器都是多個CPU核心的,這意味着一個數據包的處理可能跨多個 CPU 核心。比如:一個數據包可能中斷在 cpu0,內核態處理在 cpu1,用戶態處理在 cpu2,這樣跨多個核心,容易造成 CPU 緩存失效,造成局部性失效。
從前面的分析得知目前網絡IO的實現的方式中,內核是導致性能瓶頸的原因所在,要解決性能問題就需要繞過內核,直接在用戶態收發包。
1、內核bypass:通過UIO(Userspace I/O)旁路數據包,實現用戶態數據包收發,減少上下文切換以及內存拷貝。
2、使用多核編程代替多線程編程:設置 CPU 的親和性,將線程和 CPU 核進行一比一綁定,減少彼此之間調度切換。
3、使用大頁內存代替普通的內存:減少 cache-miss。
4、采用無鎖技術:解決資源競爭問題。
2、帶有OVS的DPDK
什么是OVS?
OVS(Open vSwitch)是一款高質量的開源虛擬交換機,運行在hypervisor中並為虛擬機提供虛擬網絡。

圖2 NVF中OVS所處位置
OVS是實施VNF(Virtual Network Function)的一部分,位於hypervisor中,如圖2所示流量可以從一個VNF通過OVS傳遞到另一個VNF中。
OVS 的轉發平面是內核的一部分,無論OVS有多好,它都面臨着與前面討論的 Linux 網絡協議棧相同的問題。

圖3 左:Kernel+OVS 右:DPDK+OVS
如圖3所示:基於 DPDK 的轉發路徑替換標准的 OVS 內核轉發路徑,在主機上創建一個用戶空間 vSwitch,它完全運行在用戶空間中從而提高了 OVS 交換機的性能。
3、SR-IOV
在講述SR-IOV之前我們先講述一下PCI直通技術。
什么是PCI直通?
PCI直通:不使用hypervisor也可以向虛擬機提供完整的網卡。虛擬機認為自己與網卡直接相連。如圖4所示,有兩個NIC卡和兩個VNF,每個都獨占訪問其中一個NIC卡。

圖4 網卡直通
PCI直通缺點:由於下面的兩個網卡被VNF1和VNF3獨占。並且沒有第三個專用網卡分配給VNF2使用。
什么是SR-IOV?
SR-IOV(Single Root I/O Virtualization)規范:定義了一種用於虛擬化PCIe設備的機制。這種機制可以將單個PCIe以太網控制器虛擬化為多個PCIe設備

圖5 SR-IOV
通過創建PCIe設備的VF,每個VF可以分配給單個VM/VNF,從而消除由於網卡不夠的問題。
4、DPDK vs SR-IOV
數據中心中存在東西向流量與南北向流量。

圖6
在同一個服務器內的東西向流量,DPDK性能優於SR-IOV。這很容易理解:如果流量是在服務器內部路由/交換的,而不是到NIC。SR-IOV沒有任何優勢。相反,SR-IOV會成為一個瓶頸(流量路徑會變長,網卡資源會被占用)。

圖7為Intel官方給出東西向流量場景下DPDK與SR-IOV的性能測試數據。
在南北流量(也包括從一個服務器到另一個服務器的東西流量)的場景中,SR-IOV性能要優於DPDK。

圖8

圖9
圖9為Intel官方給出的南北向流量場景下DPDK與SR-IOV的性能測試數據。
