日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VPP概述汇总

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VPP概述汇总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、背景介紹

【鵝廠網事】高性能網關設備及服務實踐

《高性能網關設備及服務實踐》這篇博文,介紹了傳統內核網絡協議棧技術的瓶頸及怎么突破,從而引入DPDK + VPP這種處理方式。

二、高性能

性能提升方法。

架構:DPDK使用巨頁、NUMA、D-cache優化,VPP?的I-cache優化;

算法:Bihash,查表lockless;

代碼:Vector?、宏構造函數、結構體cacheline對齊、線程綁核、指令預取、指令優化;

三、轉發流程圖譜

3.1 VPP轉發圖譜

Cisco VPP(5) node關系圖_趙占旭的博客-CSDN博客_vpp節點圖

層二轉發圖譜:

層三轉發圖譜:

?

?

3.2 Linux內核報文收發流程

https://zhaozhanxu.com/2016/07/14/Linux/2016-07-14-Linux-Kernel-Pkts_Processing3/

層二轉發:

層三轉發:

四、Node節點及初始化

VPP代碼分析——Node的數據結構和初始化_Illina的博客-CSDN博客_node數據結構

node的基礎數據結構如上圖所示,__bootstrap_vlib_main_vector是最頂級的全局變量,此變量下的vm是一個vec結構,每thread一個vlib_main_t,對于node結構來講,比較重要的是node_main,對應vlib_node_main_t結構體,在vlib_node_main_t中,nodes成員以vec數據結構組織,用來真正保存一個個注冊在VPP系統中的node,vlib_node_t結構中存儲了node節點的所有信息。

???為查找方便高效,vlib_node_main_t有成員node_by_name,以hash的方式組織,可按name快速hash到node的index;

?? node_registrations是提供給初始化函數使用的,是一個單鏈表的結構,VLIB_REGISTER_NODE宏注冊的node在初始化前就預先掛載在這個成員變量中。

?

函數流程如上圖,vlib_unix_main是初始化入口,函數默認會啟動一個線程,在thread0中完成node結構的注冊和node graph的創建,vlib_register_all_static_nodes函數用來將vlib_node_registration_t結構下node_registrations鏈表中的node真正放到vlib_node_main_t結構下的node池中。

?? vlib_node_main_init函數用來根據注冊node提供的next node信息,建立一個完整的node graph,在VPP運行正確后,通過命令show vlib graph可以查看所有注冊的node和node之間的關系。

五、Main過程

VPP源碼分析及流程圖 - ll_1997_ll - 博客園

5.1?vpp/vnet main.c

1.main?首先解析參數,再需要初始化堆,插件的初始化將由他提供。

2.vpe_main_init?初始化各種插件,通過宏函數VLIB_INIT_FUNCTION(X),可以通過遍歷單鏈表、動態鏈接的方式指定不同的初始化類型如早期的配置、功能等

3.調用?vilb_unix_main

5.2?vilb_unix_mian

vlib_plugin_early_init (vlib_load_one_plugins)?從配置文件中讀取插件的路徑而不用重新編譯.

vlib_thread_stack_init?創建主線程的線程棧,對于線程的管理,通過了數組的形式,所以每次使用地址可以直接通過偏移量來找到他

clib_call_jmp?這里執行了main線程(thread0)的回調函數。

5.3?vlib_main

cli_time_init?用于多線程時間輪調度

vlib_register_all_static nodes?同樣也是通過遍歷單鏈表的方式對所有的節點分配內存、初始化等等。

vlib_call_all_init_fountions?這里的初始化不同于最開始時的初始化,這里是建立節點圖,通過函數指針計算矢量,也就是在節點圖的下一跳(對于不同類型的數據包所形成的路徑也是不同的)。

vlib_buffer_get_or_create_free_list?創建默認的緩沖區,dpdk使用了特定的緩沖區的格式,vpp在其頭部添加信息使兩者相對隔離,給網絡棧和空間存儲提供了便利。

vlib_call_all_config_functions?進入主循環前最后一次進行配置

進入?vlib_main_loop

5.4?vlib_main_loop

dispatch_process

dispatch_node(PRE_INPUT)?目前只有一個epoll node,對socket相關邏輯提供服務,主要使用在控制業務上??梢蕴幚鞢LI命令以及可以在中斷模式和輪詢模式中切換。

dispatch_node(INPUT)?需要從其他容器中獲得input方法(dpdk_input),由之前構建好的節點圖進行矢量跳轉,

queue_signal_pending?用戶可以自行定義信號后會調用回調函數

中斷模式和時間輪計算

dispatch_pending_node?由于我們之前已經定義好了數據包的矢量,現在要做的就是跳轉到我收到包后現在要做的事情。(p.s.有對于trace版本的優化以及debug版本顯示更多信息,同時也可以在gdb中看出數據包的流

dispatch_node(INTERNAL)

node->function?調用節點指定的動作(對于dpdk來說這里就是發包)

總結

以上是生活随笔為你收集整理的VPP概述汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。