高性能轉(zhuǎn)發(fā)領域的重要功臣——VPP開源代碼
Labs 導讀
眾所周知,在數(shù)據(jù)通信領域,傳統(tǒng)廠商如華為、中興、思科等均是用自己的網(wǎng)絡轉(zhuǎn)發(fā)平臺配合硬件板卡轉(zhuǎn)發(fā),也就是我們俗稱的硬轉(zhuǎn)發(fā)。近些年,隨著SDN/NFV等新型網(wǎng)絡技術(shù)興起,使用x86平臺CPU轉(zhuǎn)發(fā)的需求不斷的被提及,發(fā)展迅速,也相應的出現(xiàn)了一些開源的網(wǎng)絡操作系統(tǒng),比如Linux內(nèi)核轉(zhuǎn)發(fā),Linux內(nèi)核中有豐富的網(wǎng)絡協(xié)議棧,能處理基本的網(wǎng)絡二三層轉(zhuǎn)發(fā)、NAT、ACL等功能,但是Linux內(nèi)核最大的問題是性能不夠高,難以適應海量級用戶轉(zhuǎn)發(fā)。
Part 01、VPP簡介
VPP全稱Vector Packet Processing,據(jù)說是Cisco 2002年開發(fā)的商用代碼。2016年2月11號,Linux基金會創(chuàng)建FD.io項目。Cisco將VPP代碼的開源版本加入該項目,目前已成為該項目的核心。VPP運行于用戶空間,支持多種收包方式,最常用的就是DPDK收發(fā)包。VPP有兩個關(guān)鍵特性:
- 框架可擴展
- 成熟的交換/路由功能
VPP是一個模塊化和可擴展的軟件框架,用于創(chuàng)建網(wǎng)絡數(shù)據(jù)面應用程序。更重要的是,VPP代碼為現(xiàn)代通用處理器平臺(x86、ARM、PowerPC等)而生,并把重點放在優(yōu)化軟件和硬件接口上,以便用于實時的網(wǎng)絡輸入輸出操作和報文處理。
為了提高性能,VPP數(shù)據(jù)平面是由轉(zhuǎn)發(fā)節(jié)點的有向圖組成,這些節(jié)點在每次調(diào)用時處理多個數(shù)據(jù)包。階段模塊化設計框架允許任何人“插入”新的圖形節(jié)點,而不需要更改核心/內(nèi)核代碼。
Part 02 VPP的技術(shù)原理
所謂VPP向量報文處理是與傳統(tǒng)的標量報文處理相對而言的。傳統(tǒng)報文處理方式,同時也是人類常用的邏輯思維方式,即:報文是按照到達先后順序來處理,第一個報文處理完,處理第二個,依次類推;A callsB calls C….return return return,函數(shù)會頻繁嵌套調(diào)用,并最終返回。Linux內(nèi)核轉(zhuǎn)發(fā)、OpenVswitch的報文處理都是標量報文處理。
由此可見,傳統(tǒng)標量報文處理有如下缺陷:
1、I-cache 抖動(cache時間局限性和空間局限性特點)
2、I-cache misses
3、除了擴大cache外,沒有變更方案。
相比較而言,向量報文處理則是一次處理多個報文,也相當于一次處理一個報文數(shù)組packet[n]如下圖:
直白來說,標量報文處理,也就是傳統(tǒng)的報文處理,一次是一個包走完整個轉(zhuǎn)發(fā)流水線,因為轉(zhuǎn)發(fā)流水線上包含各類的功能,比如以太處理、IP處理、ARP處理、策略處理、NAT處理等等,每個處理模塊在CPU中是不同的指令去完成,所以一個包順序的走完這些流程,導致CPU cache中緩存的指令不能復用,所以會產(chǎn)生抖動,勢必影響轉(zhuǎn)發(fā)效率。而向量報文處理,一次性處理一組向量的報文,一個處理模塊一次性處理多個報文,CPU cache中緩存的指令能夠最大程度得到復用,效率自然會高。
VPP把一批底層硬件隊列Rx ring收到的包,組成一個Packet Vector或者是一組包,借助于報文處理圖Packet Processing graph來實現(xiàn)處理流程,圖節(jié)點graph node把整個過程分解為一個個先后連接的服務node。這一組包(packet vector)被第一個graph node節(jié)點的任務處理,然后依次被第二個graph node節(jié)點的任務處理,依次類推,如下圖所示:
Part 03、 VPP的擴展性
上圖中提到了新功能的插入??v觀其他軟轉(zhuǎn)軟件比如Linux kernel協(xié)議棧、open vswitch,整個轉(zhuǎn)發(fā)協(xié)議棧代碼基本上是分層的,一個總的入口函數(shù),然后根據(jù)不同的處理模塊,進入不同層次的處理函數(shù),如果在某部分新增處理模塊,需要修改主框架的函數(shù)邏輯,業(yè)務和主框架未解耦,擴展起來不夠靈活。
而VPP則不是,VPP采用一種新的思路來實現(xiàn)業(yè)務功能處理,VPP是通過graph node串聯(lián)起來形成一條數(shù)據(jù)路徑來處理報文,每一個功能模塊是一個獨立的node實現(xiàn),VPP的總體調(diào)度框架把這些node串聯(lián)起來,node之間可以指定優(yōu)先級和前后關(guān)系,相互獨立,調(diào)整起來只需要改變優(yōu)先級和先后關(guān)系。另外,如果新增功能,只需新增一個node,在node中實現(xiàn)新增功能邏輯,然后插入到相應node前后,不用的時候可以disable掉,非常方便,而且新增node可以以插件形式編譯,做到即插即用。
舉個例子,正常的處理順序:DPDK收包node ---> 以太處理node --> IP輸入node --> IP路由查找node --> 輸出node。新增一個需求,需要DPI匹配指導轉(zhuǎn)發(fā),那么DPI功能單獨寫成一個node,插入到IP輸入node和IP路由查找node之間,就ok了。
Part 04、VPP的應用
前面提到過,VPP是個高性能轉(zhuǎn)發(fā)的開源軟件,在如今SDN、NFV、云化、算力網(wǎng)絡的時代,他會發(fā)揮更大的價值。VPP可以在云化場景中作為軟路由器/交換機來使用,比如SD-WAN場景中,云端POP點需要具備接入、策略轉(zhuǎn)發(fā)、路由、NAT、隧道等能力,VPP因其豐富的網(wǎng)絡協(xié)議棧功能以及高性能處理能力,能夠勝任。比如安全場景中,VPP可以應用于企業(yè)出口,做安全網(wǎng)關(guān)來使用,再比如,5G核心網(wǎng)中的UPF,也可以使用VPP來實現(xiàn)??傊?,需要軟轉(zhuǎn)發(fā)的地方,總會出現(xiàn)VPP的身影。
Part 05、 后記
前面提到VPP有諸多變革性的優(yōu)點,比如豐富的二三層網(wǎng)絡協(xié)議棧、新增業(yè)務開發(fā)靈活可擴展、高性能轉(zhuǎn)發(fā)等等,但它也不是萬能的,VPP的代碼上手難度比OVS和Linux內(nèi)核要高,另外和其他控制面軟件在交互的時候,還略有不足,比如對接路由開源軟件frrouting,需要通過自身的router插件來實現(xiàn)對接,但是router插件很早之前便沒有更新了,功能有所欠缺。同時,VPP本身的穩(wěn)定性并未達到商用標準,需要使用者在使用的過程中不斷的修復和完善,當然,VPP社區(qū)也在不斷的更新,補充更加豐富的功能以及BUG修復,但要想把開源VPP改造成一個成熟的可商用的穩(wěn)定產(chǎn)品,還有很多工作要做,同時也相信VPP會越來越好。