發表文章

目前顯示的是 九月, 2021的文章

Rootless Router(Part: 5): 完結

RootlessRouter系列: Rootless Router(Part: 0): 用戶態DN42節點 Rootless Router(Part: 1): wggo-vpp Rootless Router(Re: 0): VPP Host stack Rootless Router(Part: 2): BIRD-vpp Rootless Router(Part: 3): EtherGuard Rootless Router(Extra):蒐集的Userspace 網路棧 Rootless Router(Part: 4): 被VPP Host Stack衝康 Rootless Router(Part: 5): 完結 Rootless Router(Fin): UML版本上線啦! 先說結論: 失敗了 唉,忙了5個月,結果一場空。真的是很難過 本地最終測試 大部分的拼圖都造好了,我又花了一個月把這些拼圖拼再一起 總時間花了5個月的RootlessRouter總算能運作上線了 在本地測試,BGP session起來了,路由有廣播出去,也有收到外面的路由 上線後遇到第一個麻煩,赫然發現CPU占用率居然是100% ! 才想起來,VPP為了性能,採用的是輪詢模式,而不是中斷模式。所以會直接佔用一顆CPU 100%。因為本地是多核心,所以沒發現。但是雲端上是一核心,直接卡死 首先我想到的是cpulimit。我限制成1%,用了以後CPU降到剩下10%。但是有很大的問題,就是ping超級不穩定。因為她的細粒度太低了,跑0.1秒,卡0.9秒。所以部分ping值直接跳上900 後來找到 這篇 ,解決了VPP CPU 100%的問題。 但是又發現,怎麼換成BIRD的cpu 卡100%了? 然後又找 上海交大的這篇 ,經過一番修改,總算是壓住CPU使用率了 在他的輪巡迴圈裡面加上sleep,解決100%的問題。 我是usleep(1000),延遲還算勉強可用,idle狀態壓在3%左右 我做的修改:  https://github.com/KusakabeSi/vpp/commit/73ee9164f8a7c4c65ced4aa61ab865878b2e5d3a 部屬上線 之後我就開始部屬到azure app service的免費容器裡面 一開始的確正常運作,session建立,路由正確 但

(轉載) VPP-Based-Optimization-for-NGINX

圖片
本文轉載自:  https://sdic.sjtu.edu.cn/wp-content/uploads/2019/10/VPP-Based-Optimization-for-NGINX.pdf Background 1. Session lock and session lock table in VPP 在VPP里,一个VPP session可以是一个网络流,可以将这个session理解为原来Linux内核的一个socket。为了处理多线程应用场景中多线程应用竞争socket的情况,Linux内核为socket引入了socket lock来解决socket竞争问题。而VPP将自己的网络协议栈实现在用户态的同时,也将原来Linux内核中的socket lock拿到了用户态去实现。VPP在用户态实现的这个lock就是VPP session lock。 在多线程应用的每个线程使用一个VPP session之前,线程需要首先获得相应的session lock。因此为了让所有线程都能访问到session lock,VPP就将所有的session lock放到线程均能访问到的共享内存中进行管理。而在共享内存中存储VPP session lock的数据结构,就是VPP session lock table。  如下图。应用线程使用的FD(文件描述符)整数,实际上代表的是session lock table中一个表项的索引值。session lock table中的一个表项供一个VPP session使用,存放了该session的session index和session lock。Session lock table的访问通过lock table read/write lock(读写锁)进行管理。  当一个线程使用listen session时,它会首先去获取lock table的read lock。然后根据listenFD从lock table中获取listen session的表项,从表项中拿到listen session lock并加锁。加锁后就可以从表项中读出listen session index,并释放lock table的read lock。线程根据获取的listen session index从唯一的一个accept event FIFO中accept一个新的连

Rootless Router(Part: 4): 被VPP衝康

RootlessRouter系列: Rootless Router(Part: 0): 用戶態DN42節點 Rootless Router(Part: 1): wggo-vpp Rootless Router(Re: 0): VPP Host stack Rootless Router(Part: 2): BIRD-vpp Rootless Router(Part: 3): EtherGuard Rootless Router(Extra):蒐集的Userspace 網路棧 Rootless Router(Part: 4): 被VPP Host Stack衝康 Rootless Router(Part: 5): 完結 Rootless Router(Fin): UML版本上線啦! 當你以為快要搞定,卻突然被衝康,真的不是普通的難受 被vpp host stack衝康了。之前BIRD運作正常,我就接著弄這些 wggo-vpp搞定 eggo-vpp搞定 bird-vpp搞定 bird-vpp-route-sync搞定 結果發現session又不能建立了 測試一番,發現VPP host stack底下,當server沒問題,但是當client大有問題 vpp side: nc -l 8888 linux side: nc 10.127.111.1 8888 連線完全正常 linux side: nc -l 8888 vpp side: nc 172.22.77.33 8888 連線失敗! 之前BIRD正常運作,因為他可以listen 當server,另一邊(linux)連過來,session建立 所以我一直以為它的功能是好的,就接著弄了。 但是當兩邊都是vpp,一定要有一邊當client,就出問題了! 現在終於快搞定的時候,發現這個大問題 如果這個不能解決,真就只能換一個network stack了 記得從6月開始弄這個。在我以為快弄完的時候,發現以前的功夫可能白費,真的...難過... 下一個network stack群友有什麼推薦嗎?我有看到這些候選 1. 用gVisor (基於ptrace) 2. 用gVisor (以socks proxy方式提供,BIRD透過L4 proxy連線wg加入DN42網路) 3. User mode linux (基於ptrace,聽說

Rootless Router(Extra):Userspace 網路棧

RootlessRouter系列: Rootless Router(Part: 0): 用戶態DN42節點 Rootless Router(Part: 1): wggo-vpp Rootless Router(Re: 0): VPP Host stack Rootless Router(Part: 2): BIRD-vpp Rootless Router(Part: 3): EtherGuard Rootless Router(Extra):蒐集的Userspace 網路棧 Rootless Router(Part: 4): 被VPP Host Stack衝康 Rootless Router(Part: 5): 完結 Rootless Router(Fin): UML版本上線啦! 之前在 這篇 提到我蒐集到的Userspace network stack,想說獨立一篇出來好了。之後有查到新東西直接加進來 用戶態的網路堆疊方案 這些是目前我找到的用戶態的網路堆疊方案,以及他們kernel bypass所用的技術 基於LD_PRELOAD VPP (我用起來相容性不好。後來發現BIRD能用) NUSE (聽說bug很多) The shadow simulator (很新的專案,資料蠻少的) 基於ptrace gVisor UML(User Mode Linux) (就是linux的網路棧) The shadow simulator (好像兩個一起用,增加穩定度) 重新編譯原始碼 LKL(Linux Kernel Library) (C/C++版本,也是linux的網路棧) LKL.js (javascript版本的LKL,可以在瀏覽器上執行!) F-Stack 基於network namespace (只是用了linux的ns隔離,本質上還是跑在kernel) mininet 沒有kernel bypass功能,依賴tun/tap RARE/freertr ns3 什麼是kernel bypass? 和網路隔離有什麼關係? 首先我們要知道,unix底下,程式如何連上網路的 首先,linux可執行檔使用  socket ( domain , type , protocol )   系統呼叫 os就會在背景創建一個socket,同時返回一個file descriptor,是