文章

顯示從 九月, 2021 起發佈的文章

RootlessRouter(Part:5) 完結

前篇:  RootlessRouter(Part: 4): 被VPP Host Stack衝康 先說結論: 失敗了 唉,忙了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建立,路由正確 但是時間一長,bgp session開始中斷。 ping測試,網路一切正常。可是BGP session就是開始出事 要嘛Hold time expired,要嘛Ceased 之前我在本地已經測試過無數次了,我在本地又重新測試。 但是這次不一樣的點是,我放著讓他長時間跑。果然,問題出現了 一開始都正常,能ping通外面,looking glass能查到路由。但是時間拉長以後,BGP session就沒了 之後我又用沒有patch的版本,也就是會占用100% CPU的全性能版本,問題依舊,所以不是我的patch出問題 網路品質一定沒問題,都在我內網測試,docker的區網裡面,應該不太會丟封包

(轉載) 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一个新的连

RootlessRouter(Part: 4): 被VPP Host Stack衝康

前篇:  Rootless Router(Part: 3) EtherGuard 當你以為快要搞定,卻突然被衝康,真的不是普通的難受 被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,聽說性能堪慮。因為他提供的API太全了,kernel bypass耗費太多性能。我只要bypass網路相關的就好) 4. LKL (重新編譯,覆寫掉網路相關system call,改走LKL的stack) 5. 其他,大家推薦下? 09/26/2021 Update 問題解決 問題解決了,不要用release分支,直接用最新的原始碼編譯就好了 由此確認,確實是VPP Host stack的問題 雖然偶爾會出現address boundary error ,至少BIRD session能建立了 下一篇: RootlessRouter(Part:5) 完結

蒐集的Userspace 網路棧

之前在 這篇 提到我蒐集到的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? 和網路隔離有什麼關係? 一般情況,我們程式想要監聽port,多半會呼叫bind()這個系統呼叫。 想要連線,就會呼叫socket()這個系統呼叫。 如果呼叫成功,就會拿到一個file descriptor,是一個整數 之後呼叫Read/Write function時,傳入fd,OS就會把資料弄去buffer了 這一切,OS會在背後幫我們處理。從網路堆疊複製東西/tcp狀態機的維護之類 當我們想要隔離的網路,有很多技術。像是 network namespace : 我們呼叫linux kernel的socket()這個系統呼叫。但是kernel維護不只一個網路堆疊。kernel會根據你的namespace,決定要和哪個堆疊作互動 LD_PRELOAD 和 ptrace : 則是劫持現有程式內部的系統呼叫。 以VPP為例,VCL負責劫持程式的bind()/socket()系統呼叫,並且轉交給VPP。和VPP維護的網路堆疊作互動 這個列表是被VPP劫持了的系統呼叫: https://github.com/KusakabeSi/RootlessRouter/blob/main/mis