一文掌握 DPDK 技術

圖片

交換機、路由器、防火牆等網絡設備通常需要實時處理大量數據包。在現代網絡中,數據包處理是一個非常重要的環節。傳統上,高效的數據包處理需要使用專門且昂貴的硬件,而數據平面開發套件 (DPDK) 能在低成本商用硬件上做到這一點。通過使用商用硬件,還可以將網絡功能轉移到雲端,並在虛擬化環境中運行它們。

DPDK 最初是由 Intel 於 2010 年發起的,Intel 的 Venky Venkatesan 被稱爲 “DPDK 之父”。2017 年 4 月,DPDK 成爲 Linux 基金會下的一個項目。目前,許多開源項目已經採用了 DPDK,包括 MoonGen、mTCP、Ostinato、Lagopus、Fast Data (FD.io)、Open vSwitch、OPNFV 和 OpenStack。

| DPDK 框架

當然,DPDK 也面臨着一些挑戰,包括無法支持某些網卡;對 Windows 的支持有限;調試比較困難;版本兼容性問題等。

**01、**DPDK 如何改進數據包處理?

傳統的數據包處理方式是數據包先到內核最後再到用戶層進行處理。這種方式會增加額外的延遲和 CPU 開銷,嚴重影響數據包處理的性能。

DPDK 繞過內核,在用戶空間中實現快速數據包處理。它本質上是一組網絡驅動程序和庫。環境抽象層 (EAL) 從應用程序中抽象出特定於硬件的操作。下圖顯示了在數據包到達應用程序之前,POSIX 調用的傳統處理是如何通過內核空間的。DPDK 縮短了這條路徑,並直接在 NIC 和用戶空間應用程序之間移動數據包。

傳統的處理是中斷驅動的,當數據包到達時,NIC 會中斷內核。DPDK 轉而使用輪詢,避免了與中斷相關的開銷。這是由輪詢模式驅動程序 (PMD) 執行的。另一個重要的優化是零拷貝。在傳統網絡中,數據包從內核空間的套接字緩衝區複製到用戶空間。DPDK 避免了這種情況。

DPDK 的用戶空間對開發人員很有吸引力,因爲不需要修改內核。任何基於 DPDK 的網絡堆棧都可以針對特定應用進行優化。

**02、**DPDK 採用的數據包處理模型是什麼?

大致有兩種處理模型: 

# Run-to-Completion

CPU 內核處理數據包的接收、處理和傳輸。可以使用多個內核,每個內核與專用端口關聯。通過接收端擴展 (RSS),到達單個端口的流量可以分配到多個內核。

# Pipeline

每個內核專用於特定的工作負載。例如,一個內核可能處理數據包的接收 / 傳輸,而其他內核則負責應用程序處理。數據包通過 memory rings 在內核之間傳遞。

對於單核多 CPU 部署,一個 CPU 分配給操作系統,另一個分配給基於 DPDK 的應用程序。對於多核部署,無論是否使用超線程,都可以爲每個端口分配多個內核。

決定使用哪種模型取決於處理每個數據包所需的週期、跨軟件模塊的數據交換範圍、某些內核的特定優化、代碼可維護性等。

**03、**DPDK 是否需要 TCP / IP 堆棧才能工作?

DPDK 不包括 TCP / IP 堆棧。如果應用程序需要用戶空間網絡堆棧,可以使用 F-Stack、mTCP、TLDK、Seastar 和 ANS 。它們通常提供阻塞和非阻塞套接字 API,其中一些是基於 FreeBSD 實現的。

由於省略了網絡堆棧,DPDK 不會出現通用實現的低效率問題。應用程序可以包括針對其用例進行優化的網絡模塊,也可能存在一些不需要更高層(L2 以上)處理的用例。

**04、**在 DPDK 之前,廠商如何實現高效的數據包處理?

在 DPDK 之前,有專門的硬件可以進行高效的數據包處理。此類硬件可能使用定製的 ASIC、可編程 FPGA 或網絡處理單元 (NPU),這些專用硬件以優化的方式完成數據包分類、流量控制、TCP / IP 處理、加 / 解密、VLAN 標記等任務。

然而,此類硬件的購買和維護成本昂貴。升級和安全補丁的應用非常耗時,並且需要全職的網絡管理員。一種解決方案是從專用硬件轉向商用現成 (COTS) 硬件。雖然這更具成本效益且更易於維護,但性能卻受到了影響。數據包從網卡 ( NIC ) 移動到操作系統 ( OS ),並通過操作系統內核堆棧進行處理。即使使用快速 NIC,內核堆棧也是一個瓶頸。系統調用、中斷、上下文切換、包複製和逐包處理都會降低性能。

DPDK 解決了 COTS 硬件上的性能問題,無需昂貴的定製硬件即可獲得高效的數據包處理。

**05、**業界誰在使用 DPDK?

負載均衡、流分類、路由、訪問控制(防火牆)和流量監管是 DPDK 的典型用途。DPDK 不僅適用於電信行業,也已在雲環境和企業中使用。流量生成器 (TRex) 和存儲應用 (SPDK) 使用 DPDK。下圖列出了 DPDK 支持的開源項目。

Open vSwitch (OVS) 移植到 DPDK 後表現出了 7 倍的性能提升。在物聯網應用中,數據包很小,DPDK 減少了延遲並允許每秒處理更多此類數據包。

在 5G 中,用戶平面功能 (UPF) 處理用戶數據包。延遲、抖動和帶寬是需要滿足的關鍵性能指標。一些研究人員已經提出將 DPDK 用於 5G UPF 的實現。在邊緣網絡部署 UPF 時, 可以使用 DPDK API 連接 UPF 應用 ( UPF -C) 和 SmartNIC ( UPF -U)。

**06、**DPDK 面臨哪些挑戰?

DPDK 需要一定的專業知識,開發人員需要學習 DPDK 的編程模型。他們需要知道如何管理內存、如何在不復制的情況下傳遞數據包,以及如何使用多核架構。

例如,PID 命名空間可能會導致管理 fbarray 出現問題;使用 mmap 而不指定地址的進程可能會導致問題;線程必須正確分配給 CPU 內核,才能獲得一致的性能;此外,DPDK 庫還給開發人員提供了多種實現選擇,選擇錯誤會影響性能。

由於繞過了內核,失去了 Linux 內核提供的所有保護、實用程序( ifconfig、tcpdump)和協議(ARP 、IPSec)。調試和確定網絡問題的根本原因也是一項挑戰。最後,由於使用輪詢而不是中斷,因此即使只處理幾個數據包,DPDK 也會導致 100% 的 CPU 使用率。

**07、**還有哪些替代選擇?

使用 Snabbswitch、Netmap 或 StackMap 可以通過內核旁路實現更快的數據包處理。與 DPDK 一樣,它們在用戶空間中處理數據包。數據包完全繞過內核堆棧。Snabbswitch 是用 Lua 編寫的,而 DPDK 是用 C 編寫的。PacketShader 對基於 GPU 的硬件進行內核旁路。

另一種方法是修改 Linux 內核。例如 eXpress Data Path  (XDP) 和基於遠程直接內存訪問 ( RDMA ) 的網絡堆棧。其他有效的工具還包括 packet_mmap (但不會繞過內核)和 PF_RING (帶有 ZC 驅動程序)。

原文鏈接:

https://devopedia.org/dpdk#qst-ans-1

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/9UM0LRMfUnXiFzt4DV2ygw