FD.io項目介紹
FD.io(Fast data - Input/Output)是Linux基金會旗下的又一開源項目,其成立於2016年2月11日。該項目在通用硬件平台上提供了具有靈活性、可擴展、組件化等特點的高性能IO服務框架,用以迎接下一個網絡和存儲浪潮。該框架支持高吞吐量、低延遲、高資源利用率的user space IO服務,並可適用於多種硬件架構(x86, ARM, and PowerPC)和部署環境(bare metal, VM, container)。
圖 開放網絡生態系統概要
FD.io開源項目的關鍵組件是由Cisco捐贈的已商用的VPP(Vector Packet Processing )庫,VPP高度模塊化,用戶可以根據需求實現定制化的服務節點插件。
圖 FD.io項目架構
VPP和FD.io其他子項目如NSH_ SFC, Honeycomb, and ONE一起加速NFV的data plane。未來的代碼貢獻將來自開源社區,FD.io的成員期望在各個領域對FD.io進行拓展,例如防火牆、負載均衡、LISP、主機追蹤、IDS、硬件加速器集成等。
VPP簡介
VPP全稱Vector Packet Processing
,據說是Cisco 2002年開發的商用代碼。2016年2月11號,Linux基金會創建FD.io項目。Cisco將VPP代碼的開源版本加入該項目,目前已成為該項目的核心。VPP商用版看不到我們暫且不說,單看這個開源版本,個人覺得還是一個初級版本,因為自從關注之后代碼更新還是很多,包括bug修復和功能開發。VPP運行於用戶空間,支持多種收包方式,我個人關注的是DPDK。
VPP有兩個關鍵特性:
- 框架可擴展。(確實易擴展)
- 成熟的交換/路由功能。(不是我說的,官方說的)
VPP技術原理
(https://www.sohu.com/a/134745174_468741)
所謂VPP向量報文處理是與傳統的標量報文處理相對而言的。傳統報文處理方式,同時也是人類常用的邏輯思維方式,即:報文是按照到達先后順序來處理,第一個報文處理完,處理第二個,依次類推;A callsB calls C….return return return,函數會頻繁嵌套調用,並最終返回。
由此可見,傳統標量報文處理有如下缺陷:
1、I-cache 抖動(cache時間局限性和空間局限性特點)
2、I-cache misses
3、除了擴大cache外,沒有變更方案。
相比較而言,向量報文處理則是一次處理多個報文,也相當於一次處理一個報文數組packet[n]如下圖:
圖 向量報文
VPP把一批底層硬件隊列Rx ring收到的包,組成一個Packet Vector或者是一組包,借助於報文處理圖Packet Processing graph來實現處理流程,圖節點graph node把整個過程分解為一個個先后連接的服務node。這一組包(packet vector)被第一個graph node節點的任務處理,然后依次被第二個graph node節點的任務處理,依次類推,如下圖所示:
圖 報文處理圖
由於向量報文中的第一個報文packet-1為I-cache進行了熱身,向量報文中剩下報文的處理性能可以直接達到極限,I-cache 缺失的固定開銷平攤到了整個向量處理中,使單個報文的處理開銷顯著降低。
由此可見,向量報文處理解決了標量處理的主要性能缺陷,並有具有如下優點:
1、解決了I-cache抖動問題
2、向量報文進行預取緩解了讀時延問題,高性能並且更加穩定
擴展性
節點操作
VPP平台是通過graph node串聯起來形成一條datapath來處理報文,類似於freebsd的netgraph。通過插件的形式引入新的graph node或者重新排列報文的graph node。將插件添加到插件目錄中,運行程序的時候就會自動加載插件。另外插件也可以根據硬件情況通過某個node直接連接硬件進行加速。VPP平台可以用於構建任何類型的報文處理應用。比如負載均衡、防火牆、IDS、主機棧。也可以是一個組合,比如給負載均衡添加一個vSwitch。
通過創建插件,可以任意擴展如下功能:
- 自定義新的graph node。
- 重新排列graph node。
- 添加底層API。
可編程能力
VPP還提供了基於共享內存或者消息隊列的高性能內部API。目前VPP平台支持C和JAVA客戶端進行內部API綁定。
如下圖所以,我們可以實現一個外部應用來對VPP進行操作:
以上的編程能力是針對內部API的調用,另外還可以支持遠程可編程能力。遠程可編程能力可以通過Data Plane Management Agent來實現。這里所說的Data Plane Management Agent其實就是類似上面的外部應用,只不過他不參與直接控制,只是一個傀儡,用來傳話。通過外部API與Data Plane Management Agent進行通信。Data Plane Management Agent通過內部API與VPP應用(引擎)進行通信。這是一個非常靈活的方法,任何人可以添加,但是需要外部API和Data Plane Management Agent匹配,以實現特定需求的VPP應用。
下圖展示Agent對接VPP和外部程序:
案例Honeycomb Agent:
Honeycomb Agent通過netconf和restconf發布了yang模型的VPP功能。像OpenDaylight這樣支持netconf/yang的控制器可以掛載Honeycomb Management Agent來工作。而OpenDaylight支持OpenStack Neutron,所以如下圖所示OpenStack Neutron可以集成到vpp來:
網絡功能
(https://my-vpp-docs.readthedocs.io/en/latest/overview/index.html)
網絡特性
VPP擁有的網絡特性如下:
- 快速查找路由表、CAM表。
- 任意n元組分類。
- 商用級別的交換/路由功能。
VPP能提供的所有功能如下:
網絡性能
FD.io VPP的一個優點是在相對低功耗的計算上具有高性能,這種性能基於以下特性:
- 專為商用硬件設計的高性能用戶空間網絡堆棧:
- L2,L3和L4功能和封裝。
- 優化的數據包接口,支持多種用例:
- 用於高速VM到VM連接的集成vhost用戶后端
- 用於高速Container-to-Container連接的集成memif容器后端
- 基於vhost的集成vhost接口數據包到Linux內核
- 在主機上運行,在VM和Linux容器內運行,都是相同的代碼路徑
- 利用最佳的開源驅動程序技術:DPDK
- 大規模測試;線性核心擴展,使用數百萬個流和mac地址進行測試
這些功能旨在充分利用常見的微處理器優化技術,例如:
- 通過處理向量中的數據包減少緩存和TLS未命中
- 使用向量指令實現IPC增益,例如:SSE,AVX和NEON
- 消除模式切換,上下文切換和阻塞,始終執行有用的工作
- 緩存內置的緩沖區用於緩存和記憶效率
OVS更適用於SDN,因為他的流表更加靈活,實現的功能更加強大,尤其是在IaaS的主機中做網絡轉發比較常見。
而VPP更適用於NFV,適合做特定功能的網絡模塊,而且性能占優。
多核基准性能例子 (UCS-C240 M3, 3.5gHz,所有內存通道轉發ipv4):
- 1 core: 9 MPPS in+out。
- 2 cores: 13.4 MPPS in+out。
- 4 cores: 20.0 MPPS in+out。
下面幾個圖展示的是和OVS+DPDK的性能對比:
下圖是在Haswell x86 架構的E5-2698v3 2x16C 2.3GHz上測試,圖中顯示了12口10GE,16核,ipv4轉發:
源碼架構
vpp數據平面分為四個不同的層:
- 基礎架構層:包括vppinfra,vlib,svm和二進制api庫。源碼:/src/{vppinfra, vlib, svm, vlibapi, vlibmemory}
- 通用網絡協議棧層:vnet。源碼:/src/vnet
- 應用程序shell:vpp。源碼:/src/vpp
日益豐富的數據平面插件。源碼:/src/plugins