FD.io/VPP — Overview

目錄

FD.io

官網:https://fd.io

FD.io(Fast data – Input/Output)是 Linux 基金會下屬的一個開源項目,成立於 2016 年 2 月 11 日。FD.io 基於 DPDK 並逐漸演化,是許多數據面(Data Plane)項目和庫的一個集合,在通用硬件平臺上提供了具有靈活性、可擴展、組件化等特點的高性能 I/O 服務框架,用以迎接下一個網絡和存儲浪潮。

簡而言之,FD.io 是一個軟件定義基礎設施的開發平臺,幫助開發者簡易的實現基於軟件的報文處理創新方案,包括設計、開發高吞吐量、低延時和有效利用資源的應用程序。併爲這些創新型應用程序屏蔽了 CPU 架構(x86、ARM 和 PowerPC)以及運行環境(裸機、虛擬機和容器)的差異。
在這裏插入圖片描述

FD.io 的一個關鍵項目是由 Cisco 捐贈的已商用的 VPP(Vector Packet Processing,矢量報文處理)庫,並充分利用 DPDK 特性孵化了多個項目和庫,包括:NSH_SFC、Honeycomb 和 ONE。此外,FD.io 還積極推進與其他關鍵的開源項目進行集成,以支持 NFV 和 SDN。目前已經集成的開源項目包括:K8s、OpenStack、ONAP 和 OpenDaylight。

FD.io 的網絡生態矩陣如下圖所示:
在這裏插入圖片描述

VPP

官網:https://wiki.fd.io/view/VPP

VPP(Vector Packet Processing,矢量報文處理)是一個高度模塊化和可擴展的軟件框架,新開發的功能模塊很容易被集成到 VPP,而不影響 VPP 底層的代碼框架。這就給了開發者很大的靈活性,用於創建網絡數據面應用程序。

VPP 平臺可用於構建任何類型的數據包處理應用程序。例如:負載均衡器,防火牆,IDS 或主機協議棧的基礎架構。此外,還可以創建應用程序的組合,例如:向 vSwitch 添加負載平衡功能。並且 VPP 在用戶空間運行,這意味着 VPP 的插件不需要更改 Linux Kernel 的代碼。

在 DPDK 的輪詢模式驅動程序(PMD)和環形緩衝區庫的支持下,VPP 把重點放在優化軟件和硬件接口上,旨在通過減少數據流/轉發表緩存的未命中數來增加轉發平面吞吐量,同時使用並行方式替換標準串行數據報文處理。

VPP 充分利用了通用處理器優化技術,包括矢量指令(e.g. Intel SSE, AVX)以及 I/O 和 CPU 緩存間的直接交互(e.g. Intel DDIO),以達到最好的報文處理性能。利用這些優化技術的好處是:使用最少的 CPU 核心指令和時鐘週期來處理每個報文。在最新的 Intel Xeon-SP 處理器上,可以達到 Tbps 的處理性能。

矢量處理和標量處理

所謂的 “矢量” 是與傳統的 “標量” 報文處理相對而言的,矢量是一個自然科學術語,是一種既有大小又有方向的量,又稱爲向量。在計算機科學中,矢量圖可以無限放大永不變形。

標量報文處理方式:是人類常用的邏輯思維方式,即:報文是按照到達先後順序來處理,第一個報文處理完,再處理第二個,依次類推。更爲傳統的方式還需要處理中斷,並遍歷調用棧(e.g. A calls B calls C….return return return…), 然後從中斷返回,函數會頻繁嵌套調用。最後,該過程執行以下三種操作之一:

  1. 不作處理
  2. 丟棄或重寫
  3. 轉發報文

由此可見,傳統的標量報文處理方式有如下缺陷:

  • I-cache(CPU 指令緩存)抖動,Cache 時間侷限性和空間侷限性特點。
  • I-cache misses,每個報文都會產生一組相同的 I-cache 未命中。
  • 除了提供更大的 Cache 空間之外,沒有解決方法。

在這裏插入圖片描述

矢量報文處理方式:則是一次處理多個報文,也相當於一次處理一個報文數組。把一批底層硬件隊列 Rx ring 收到的報文,組成一個報文數組,稱爲 Packet Vector(矢量報文),助於 Packet Processing Graph(報文處理圖)來組織處理流程。

在這裏插入圖片描述

Graph Node(圖節點)把整個處理流程分解爲一個個先後連接的 Service Node(服務節點)。Packet vector 首先被第一個 Graph Node 的任務處理,然後依次被第二個 Graph Node 的任務處理,依次類推,如下圖所示:

在這裏插入圖片描述

矢量報文處理利用了數據報文處理的時間局部性特點,將一批報文分爲一組,如果 I-cache 命中,則這一批報文都命中;否則這一批報文都未命中。而未命中時,則通過 Packet Vector 中的第一個報文 packet-1 爲 I-cache 進行預熱,然後可以針對矢量報文中後續數據包重複執行緩存中所得到的指令。如此的,Packet Vector 中剩下報文的處理性能可以直接達到極限,從而在整個報文分組中分攤一個報文的高速緩存未命中時間,使單個報文的處理開銷顯著降低。

由此可見,矢量報文處理解決了標量報文處理的主要性能缺陷,並有具有如下優點:

  1. 解決了 I-cache 抖動問題。
  2. 對 I-cache 進行預熱緩解了讀時延問題,高性能並且更加穩定。

在這裏插入圖片描述

I-cache 抖動

短時間存活的數據流或高熵數據報文字段(那些在數據包之間具有不同值的數據包)都會使 I-cache(CPU 指令緩存)失效。

當計算設備啓動時,I-cache 是空的,稱呼爲緩存是 “冷” 的,此時所有冷緩存查詢都會失敗。未命中的數據報文隨後用於填充緩存,稱呼該動作爲緩存 “預熱”,稱呼此時的 I-cache 爲緩存是 “熱” 的,此時熱緩存的查詢會有適當數量的 “命中”。緩存可以使用簡單的先進先出(FIFO),或者最近最少使用(LRU)或最不常用(LFU)算法決定是否用新的緩存替換舊的緩存。這個替換策略很重要,因爲高速緩存流失可能是由於不良的替換算法造成的。然而,更可能的原因是那些討厭的短時間存活的數據流,每次新添加短時間存活的數據流緩存都會導致後續查詢 miss,並且可能會替換緩存中的長期數據流緩存。I-cache 緩存中的有用的數據不斷被替換,這一現象稱之爲 “緩存抖動”。

顯然的,I-cache 緩存抖動會導致數據報文處理效率的顯著降低。同時,根據數據報文處理的時間局部性和空間局部性原理,我們知道在短時間內採樣的數據報文分組它們本質上相似,即使不相同,相似性也很強。具有此類屬性的數據報文將重用相同的資源,並將訪問相同(緩存)的內存位置。VPP 根據該特性,通過防止 I-cache 緩存抖動可以顯著提高數據報文的處理效率。

VPP 特色

插件化:VPP 平臺的 Graph Node 組織方式,使用戶可以根據需求,通過 Plugin 的方式插入新的圖節點或者重新排列圖節點,擴展非常方便,也不會影響原有核心處理流程。

在這裏插入圖片描述

豐富的基礎功能

  • IPv4/v6:

    • 14+ MPPS, single core
    • Multimillion entry FIBs
    • Input Checks: Source RPF, TTL expiration, header checksum, L2 length < IP length, ARP resolution/snooping, ARP proxy
    • Thousands of VRFs: controlled cross-VRF lookups
    • Multipath - ECMP and Unequal Cost
    • Multiple million Classifiers - Arbitrary N-tuple
    • VLAN support - Single/Double tag
  • IPv4:

    • GRE、MPLS-GRE、NSH-GRE
    • VXLAN
    • IPSEC
    • DHCP client/proxy。
  • IPV6:

    • Neighbor discovery
    • Router Advertisement
    • DHCPv6 Proxy
    • L2TPv3
    • Segment Routing
    • MAP/LW46 – IPv4aas
    • iOAM
  • MPLS:

    • MPLS-o-Ethernet – Deep label stacks supported
  • L2:

    • VLAN Support Single/Double tag
    • L2 forwarding with EFP/BridgeDomain concepts
    • VTR – push/pop/Translate (1:1,1:2, 2:1,2:2)
    • Mac Learning – default limit of 50k addresses
    • Bridging – Split-horizon group support/EFP Filtering
    • Proxy Arp
    • Arp termination
    • IRB – BVI Support with RouterMac assignment
    • Flooding
    • Input ACLs
    • Interface cross-connect

VPP 架構:Packet Processing Graph

通過上述內容我們可以體會到,VPP 包括一個軟件框架和一系列根據 Packet Processing Graph 組織的 Graph Node。其中,軟件框架包含了基本的數據結構、定時器、驅動程序、在 Graph Node 間分配 CPU 時間片的調度器、性能調優工具(e.g. 計數器、抓包工具)。

VPP 的軟件框架採用了 Plugin 架構,插件與 VPP 內建的模塊被同等對待,從而有利於快速靈活地開發新功能。因此,插件架構使開發者能夠充分利用現有模塊快速開發出新功能。實際上,插件的本質就是實現了某一特定功能的 Graph Node,但也可以是一個驅動程序或者 CLI。插件能被插入到 VPP 的 Packet Processing Graph 中的任意位置。

Packet Processing Graph 的處理流程

在這裏插入圖片描述

如上圖,VPP 首先從 Input Node(輸入節點)輪詢(或中斷)以太網接口的接收隊列,獲取批量報文。接着把這些報文按照下一個 Graph Node 的功能組成一個 Packet Vector 或者幀(Frame)。比如:Input Node 收集所有 IPv6 的報文並把它們傳遞給 ip6-input Node。

當 ip6-input Node 被調度時,它取出第一個報文 packet-1,利用雙循環(Dual-Loop)或四循環(Quad-Loop)以及通過預取報文到 CPU 緩存技術來處理報文,可以有效減少緩存未命中數,以達到最優性能。當 ip6-input 節點處理完當前幀的所有報文後,把報文傳遞到後續不同的節點。比如:如果某報文校驗失敗,就被傳送到 error-drop 節點。而正常報文被傳送到 ip6-lookup 節點。packet-1 依次通過不同的圖形節點,直到它們被 interface-output 節點發送出去。

在這裏插入圖片描述

每一個 Graph Node 利用一幀報文作爲輸入和輸出的最小處理單位進行處理,有幾個好處:

  1. 從軟件工程的角度看,每一個圖形節點是獨立和自治的。

  2. 從性能的角度看,主要的好處是可以優化 CPU 指令緩存(I-cache)的使用。當前幀的第一個報文加載當前節點的指令到指令緩存,當前幀的後續報文就可以 “免費” 使用指令緩存。這裏,VPP 充分利用了 CPU 的矢量結構,使報文內存加載和報文處理交織進行,達到更有效地利用 CPU 處理流水線。

  3. VPP 也充分利用了 CPU 的預測執行功能來達到更好的性能。從預測重用報文間的轉發對象(比如鄰接表和路由查找表),以及預先加載報文內容到 CPU 的本地數據緩存(d-cache)供下一次循環使用,這些有效使用計算硬件的技術,使得 VPP 可以利用更細粒度的並行性。

VPP 的矢量圖報文處理的特性,使它成爲一個松耦合、高度一致的軟件架構。每一個 Graph Node 利用一幀報文作爲輸入和輸出的最小處理單位,這就提供了松耦合的特性。通用功能被組合到每個 Graph Node 中,這就提供了高度一致的架構。

在矢量圖中的節點是可替代的,這個特性和 VPP 支持動態加載插件節點相結合時,新功能能被快速開發,而不需要新建和編譯一個定製的代碼版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章