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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用户态TCP协议栈的调研

發(fā)布時(shí)間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用户态TCP协议栈的调研 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、各種用戶態(tài)socket的對(duì)比 1、MTCP 簡(jiǎn)單介紹: 韓國(guó)高校的一個(gè)科研項(xiàng)目,在DPDK的2016年的技術(shù)開(kāi)發(fā)者大會(huì)上有講,所以intel將這個(gè)也放到了官方上,所以一般搜索DPDK的用戶態(tài)的協(xié)議棧的時(shí)候就能夠搜索到了這個(gè); 特點(diǎn): 有準(zhǔn)確的測(cè)試數(shù)據(jù),我們本地也測(cè)試了其性能:在EP的單核上可以達(dá)到4W connect/sec 。然后因?yàn)閮?nèi)存限制,連接數(shù)當(dāng)時(shí)是60W連接占用了18G的內(nèi)存; 優(yōu)點(diǎn): 1。有準(zhǔn)確的性能測(cè)試數(shù)據(jù) 2。有一定的關(guān)注度,有開(kāi)源社區(qū); 3. 自己實(shí)現(xiàn)了一套epoll+socket。與內(nèi)核的epoll在同一個(gè)線程不能同時(shí)使用。 4.協(xié)議棧全面,包含了二三層的邏輯 5. 基本兼容傳統(tǒng)的socket操作。代碼改動(dòng)不算大; 缺點(diǎn): 1。穩(wěn)定性不高,中途出現(xiàn)了多次異常退出; 2。內(nèi)部代碼邏輯清晰度還有些欠缺; 3。內(nèi)存占用太大,例如接受的buff都是每一個(gè)連接一個(gè)、 4。內(nèi)部有大量的鎖操作~邏輯比較復(fù)雜; 5。只支持TCP協(xié)議 6.內(nèi)部有很多內(nèi)存copy操作。網(wǎng)卡數(shù)據(jù)到協(xié)議棧copy一次,協(xié)議棧緩存時(shí)copy一次,協(xié)議棧到用戶態(tài)又需要copy一次數(shù)據(jù);
目前如果要嵌入系統(tǒng)中需要做一下幾個(gè)方面的工作: 1。因?yàn)槲覀円呀?jīng)有自己的二三層邏輯,所以需要將MTCP原來(lái)的二三層給拆除,只保留TCP; 2。需要針對(duì)其穩(wěn)定性進(jìn)行優(yōu)化,解決各種異常退出的問(wèn)題; 3。需要針對(duì)其內(nèi)存占用進(jìn)行優(yōu)化; 4。如果需要支持系統(tǒng)epoll和mtcp epoll兼容需要進(jìn)行邏輯框架的改進(jìn)~ 5。如果需要支持其他socket的時(shí)候,需要重新設(shè)計(jì)并加入udp+raw一類的socket的支持; 6. 如果需要支持多個(gè)應(yīng)用同時(shí)使用MTCP的時(shí)候也需要改進(jìn)MTCP 總結(jié): MTCP不支持多進(jìn)程模型,而且在穩(wěn)定性差有一些問(wèn)題,然后對(duì)UDP與RAW不支持;需要進(jìn)行一系列的修改后才能進(jìn)入我們系統(tǒng); 2.libuinet BSD協(xié)議棧用戶態(tài)的庫(kù) libuinet是開(kāi)源社區(qū)維護(hù)的一個(gè)使用openbsd內(nèi)核協(xié)議棧編譯出來(lái)的一個(gè)協(xié)議棧的庫(kù),使用的bsd的原生協(xié)議棧。 優(yōu)點(diǎn): 1。來(lái)源于BSD協(xié)議棧,功能支持全面,所以socket,ipv4 ipv6都支持; 2。來(lái)源于BSD協(xié)議棧,穩(wěn)定性與社區(qū)活躍性都是不錯(cuò)的; 3。bsd協(xié)議棧提供接口與linux socket編程接口兼容性好; 缺點(diǎn): 1。代碼太復(fù)雜,因?yàn)槭菑腷sd代碼中porting過(guò)來(lái)的,所以有大量對(duì)我們來(lái)說(shuō)無(wú)用的代碼; 2。不支持DPDK。而且二三四層綁定比較緊密~想拆出來(lái)不太容易; 3。也是線程模型~與MTCP有同樣的缺點(diǎn); 4。除了協(xié)議棧還有大量中間代碼(例如協(xié)議棧創(chuàng)建了4個(gè)線程,而且這個(gè)線程不是用標(biāo)準(zhǔn)的pthread創(chuàng)建,也就是它自己還帶了一套線程庫(kù)) 5. 性能沒(méi)有測(cè)試數(shù)據(jù),以及內(nèi)存占用等都沒(méi)有對(duì)應(yīng)的數(shù)據(jù)~而且如果一旦出現(xiàn)性能問(wèn)題~因?yàn)榇a過(guò)與復(fù)雜,優(yōu)化上風(fēng)險(xiǎn)比較大; 總結(jié):bsd用戶態(tài)協(xié)議棧功能強(qiáng)大,社區(qū)活躍,但是復(fù)雜度太高,而且沒(méi)有現(xiàn)成的與dpdk對(duì)接的例子,移植成本比較高,性能上沒(méi)有準(zhǔn)確數(shù)據(jù)~如果有性能問(wèn)題,優(yōu)化難度較大; 3. 中國(guó)人寫(xiě)的tcp協(xié)議棧 通過(guò)不斷的搜索和對(duì)比代碼,找到了一個(gè)簡(jiǎn)潔版本的 TCP,是中國(guó)的一個(gè)熱愛(ài)開(kāi)源事業(yè)的人寫(xiě)的~ Xiaochen Wang <wangxiaochen0@gmail.com> 搜索過(guò)內(nèi)核提交PATCH 華人中排100+ 通過(guò)分析代碼與其實(shí)現(xiàn): 優(yōu)點(diǎn): 1。代碼簡(jiǎn)潔,代碼實(shí)現(xiàn)邏輯簡(jiǎn)單,沒(méi)有太多復(fù)雜的信息,實(shí)現(xiàn)原理與內(nèi)核一致; 2。代碼量較少,總共TCP的代碼連注釋就在4K行左右~公司私有維護(hù)可以hold住。 3。功能全,支持TCP SOCKET UDP SOCKET RAW socket; 4。兼容性好~設(shè)計(jì)的api接口基本與原來(lái)的socket接口一致,便于遷移; 5。通過(guò)代碼優(yōu)化可以做到網(wǎng)卡到用戶態(tài)0 copy,提升效率; 6。內(nèi)存占用小~測(cè)試過(guò)1W連接不足1M的內(nèi)存占用。 缺點(diǎn): 1。有些查找算法需要優(yōu)化~;例如查找流表; 2。也不支持DPDK(目前已經(jīng)修改好DPDK對(duì)接的demo) 3。不支持多線程的協(xié)議棧(數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)的時(shí)候沒(méi)有考慮線程安全) 4。只支持阻塞模型的socket。不支持epoll和非阻塞的socket調(diào)用(目前已經(jīng)有設(shè)計(jì)思路移植epoll) 5。作者已經(jīng)不維護(hù),性能還沒(méi)有測(cè)試過(guò)。 總結(jié): 代碼簡(jiǎn)單,便于自己維護(hù),優(yōu)化,開(kāi)發(fā)~但是因?yàn)闆](méi)有開(kāi)源社區(qū)的支持,需要自己熟悉代碼,測(cè)試過(guò)程中沒(méi)有出現(xiàn)異常掛掉的情況,但需要自己移植epoll上去,才可以實(shí)現(xiàn)多路IO復(fù)用; 4.其他用戶態(tài)socket 調(diào)研了其他用戶態(tài)的socket; https://software.intel.com/en-us/blogs/2015/06/12/user-space-networking-fuels-nfv-performance 主要有 1。mirage-tcpip 這種不是C/C++語(yǔ)言實(shí)現(xiàn); 2。net-next-nuse linux kernel stack的用戶態(tài)實(shí)現(xiàn);類似于bsd 的stack而且依賴于netmap; 3。LWIP UIP完全的嵌入式設(shè)計(jì)模式~沒(méi)有socket這層概念;而且代碼效率沒(méi)有考慮,查找全部都是鏈表比較。 4。picotcp 與上面的lwip與UIP類似,但代碼簡(jiǎn)潔~支持socket,但socket的使用風(fēng)格與linux socket的風(fēng)格差別很大; 總結(jié):其他用戶態(tài)的socket使用上差別與原來(lái)linux風(fēng)格的差別較大~不方便兼容原來(lái)的程序;而且都需要修改才能支持DPDK,其中picotcp還是比較活躍的開(kāi)源項(xiàng)目; 二、關(guān)于用戶態(tài)socket使用上的總結(jié) 目前所有的用戶態(tài)的socket程序,都一樣都是協(xié)議棧是通過(guò)一個(gè)線程來(lái)支持的。所以APP都需要運(yùn)行自己的tcp協(xié)議棧(四層協(xié)議棧),然后通過(guò)線程間通信方式將數(shù)據(jù)傳輸?shù)接脩舻臉I(yè)務(wù)線程中; 總結(jié)起來(lái)都有大致如下的問(wèn)題: 1。都是線程協(xié)議棧模型,而且這個(gè)協(xié)議棧線程包含了二三層; 2。目前對(duì)于多進(jìn)程模型都沒(méi)有較好的解決方案; 3。epoll與系統(tǒng)的epoll不能同時(shí)使用,有些多路復(fù)用沒(méi)有實(shí)現(xiàn); 三、關(guān)于用戶態(tài)socket模型的思考 其實(shí)我們二三層轉(zhuǎn)發(fā)(其中包含NAT)都有了自己的解決方案;所以我們不需要在用戶態(tài)socket這一層去再實(shí)現(xiàn)一次二三層~; 如果有多進(jìn)程模型更好的支持,應(yīng)用程序編寫(xiě)的時(shí)候就可以完全不用關(guān)心到底是用戶態(tài)的socket,還是kernel太的socket,使用成本將會(huì)更低~ 所以我提出這樣的模型:
1。用戶態(tài)socket是一個(gè)單獨(dú)的進(jìn)程,它通過(guò)ring與dpdk server進(jìn)行數(shù)據(jù)交互~ 2。app通過(guò)信號(hào)量與ring與用戶態(tài)socket進(jìn)行交互,通過(guò)dpdk的ring,可以做到數(shù)據(jù)共享,減少copy; 3。通過(guò)信號(hào)量實(shí)現(xiàn)數(shù)據(jù)通知機(jī)制~從而實(shí)現(xiàn)epoll。 優(yōu)勢(shì):應(yīng)用程序本身只啟動(dòng)應(yīng)用程序的業(yè)務(wù),而不需要啟動(dòng)自己的協(xié)議棧。編程模型與之前l(fā)inux kernel態(tài)的編程模型一直,應(yīng)用開(kāi)發(fā)者無(wú)需關(guān)心用戶態(tài)socket的實(shí)現(xiàn);而且通過(guò)動(dòng)態(tài)庫(kù)的方式可以實(shí)現(xiàn),一個(gè)bin加載不同的so~就可以實(shí)現(xiàn)用戶態(tài)socket與kerenl socket自由切換~; 層次分明,不用每個(gè)app一個(gè)協(xié)議棧,可以節(jié)省cpu的消耗; 缺點(diǎn):目沒(méi)有現(xiàn)有模型支持,需要大量的代碼修改開(kāi)發(fā)工作;開(kāi)發(fā)周期較長(zhǎng);
另一種思路,繼續(xù)繼承原來(lái)類似于MTCP這種模型。所有的進(jìn)程都有一個(gè)用戶態(tài)socket協(xié)議棧的線程,每個(gè)用戶態(tài)socket線程一個(gè)ring,與dpdk server進(jìn)行數(shù)據(jù)交互;
優(yōu)點(diǎn): 1。修改代碼量會(huì)比之前的方案少點(diǎn)兒~。就可以支持多進(jìn)程的模型; 2。代碼邏輯更加簡(jiǎn)單; 3。性能上可以保證,因?yàn)槊總€(gè)app一個(gè)協(xié)議棧,而這個(gè)協(xié)議棧線程會(huì)綁定cpu,所以性能上,不同APP他們的協(xié)議棧性能是不會(huì)互相干擾的; 缺點(diǎn): 1。因?yàn)槊總€(gè)app一個(gè)協(xié)議棧線程,app掛了,協(xié)議棧也要對(duì)應(yīng)重啟; 2。每個(gè)app一個(gè)協(xié)議棧線程,協(xié)議棧線程會(huì)綁定CPU,所以比較浪費(fèi)CPU的資源; 3。編程模型與之前的kernel socket編程模型有差別了,需要添加額外的啟動(dòng)socket線程的方法; 總結(jié): 兩種方法各有優(yōu)缺點(diǎn),主要看具體的應(yīng)用場(chǎng)景。而且通過(guò)修改代碼可以支持epoll多路I.O的機(jī)制。多個(gè)socket可以在一個(gè)線程中進(jìn)行處理~ 四、關(guān)于用戶態(tài)socket epoll與系統(tǒng)epoll兼容的思考 現(xiàn)在的用戶態(tài)的epoll與系統(tǒng)的epoll不能同時(shí)使用主要原因在與epoll_wait這個(gè)函數(shù)是一個(gè)阻塞的函數(shù),在同一個(gè)線程中不可能同時(shí)處理兩個(gè)阻塞的請(qǐng)求; 所以思路有兩種: 1。把用戶態(tài)socket epoll模擬成系統(tǒng)的epoll。 用戶態(tài)epoll實(shí)現(xiàn),是通過(guò)系統(tǒng)的信號(hào)量來(lái)實(shí)現(xiàn)的阻塞與喚醒,如果把這種信號(hào)量的通知機(jī)制改成fd實(shí)現(xiàn),例如用戶態(tài)socket事件通知是通過(guò)unix socket來(lái)實(shí)現(xiàn)的,就可以使用系統(tǒng)的epoll監(jiān)聽(tīng);從而把用戶態(tài)的epoll變成系統(tǒng)態(tài)的epoll。 2。把系統(tǒng)態(tài)的epoll變成用戶態(tài)的epoll; 系統(tǒng)態(tài)的epoll的阻塞。事件等待是通過(guò)系統(tǒng)的epoll_wait來(lái)實(shí)現(xiàn)的事件等待,如果我們啟動(dòng)一個(gè)線程來(lái)專門監(jiān)聽(tīng)epoll_wait的事件。等epoll_wait成功以后通過(guò)信號(hào)量通知到用戶態(tài)的epoll事件來(lái)實(shí)現(xiàn),系統(tǒng)態(tài)epoll轉(zhuǎn)換成用戶態(tài)的epoll; 五、關(guān)于流表查詢加速的優(yōu)化的思考 現(xiàn)在我們有的產(chǎn)品的server中其實(shí)已經(jīng)有了流表,可以在dpdk server 把報(bào)文送上來(lái)的時(shí)候,在mbuf的私有字段中就可以帶上來(lái)流表hash的結(jié)果(index)。可以減少用戶態(tài)socket查詢flow的時(shí)間,提高速度,目前只是一種思路;

總結(jié)

以上是生活随笔為你收集整理的用户态TCP协议栈的调研的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。