<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          XDP技術(shù)——Linux網(wǎng)絡(luò)處理的高速公路

          共 3104字,需瀏覽 7分鐘

           ·

          2022-01-10 10:56


          XDP及相關(guān)技術(shù)簡(jiǎn)介


          傳統(tǒng)的Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧由于更加注重通用性,其網(wǎng)絡(luò)處理存在著固有的性能瓶頸,隨著10G、25G、40G、100G甚至更高速率的網(wǎng)卡出現(xiàn),這種性能瓶頸變得更加突出,傳統(tǒng)內(nèi)核網(wǎng)絡(luò)協(xié)議棧已經(jīng)難以滿足高性能網(wǎng)絡(luò)處理的要求。

          在人們想辦法提升處理性能的同時(shí),一批人抱著它不行就繞開(kāi)它的思路,在2010年,開(kāi)發(fā)出了DPDK內(nèi)核旁路(Kernel Bypass)技術(shù),并逐漸成為網(wǎng)絡(luò)處理加速的一種成熟方案。然而這種方案也有自己的一些固有缺陷,且始終是獨(dú)立于linux內(nèi)核的,在2016年的Linux Netdev會(huì)議上,David S. Miller更是帶領(lǐng)聽(tīng)眾一起高呼“DPDK is not Linux”。同年,伴隨著eBPF技術(shù)的成熟,Linux也終于合入了屬于自己的網(wǎng)絡(luò)處理高速公路——XDP。


          XDP全稱(chēng)eXpress Data Path,即快速數(shù)據(jù)路徑,XDP是Linux網(wǎng)絡(luò)處理流程中的一個(gè)eBPF鉤子,能夠掛載eBPF程序,它能夠在網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)網(wǎng)卡驅(qū)動(dòng)層時(shí)對(duì)其進(jìn)行處理,具有非常優(yōu)秀的數(shù)據(jù)面處理性能,打通了Linux網(wǎng)絡(luò)處理的高速公路。

          運(yùn)行的XDP程序可以通過(guò)XDP動(dòng)作碼來(lái)指定驅(qū)動(dòng)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的后續(xù)動(dòng)作:


          ? XDP_ABORTED意味著程序錯(cuò)誤,會(huì)將數(shù)據(jù)包丟掉,與XDP_DROP不同之處在于XDP_ABORTED會(huì)用trace_xdp_exception記錄錯(cuò)誤行為。


          ? XDP_DROP會(huì)在網(wǎng)卡驅(qū)動(dòng)層直接將該數(shù)據(jù)包丟掉,無(wú)需再進(jìn)一步處理,也就是無(wú)需再耗費(fèi)任何額外的資源。在收到DDoS攻擊時(shí),這種特性可以瓦解DDoS的根本目標(biāo)——占滿被攻擊主機(jī)的CPU資源使得其他正常流量無(wú)法被處理,因?yàn)閄DP丟包不會(huì)再動(dòng)用額外的CPU資源。


          ? XDP_PASS會(huì)將該數(shù)據(jù)包繼續(xù)送往內(nèi)核的網(wǎng)絡(luò)協(xié)議棧,和傳統(tǒng)的處理方式一致。這也使得XDP可以在有需要的時(shí)候方便地使用傳統(tǒng)的內(nèi)核協(xié)議棧進(jìn)行處理。


          ? XDP_TX會(huì)將該數(shù)據(jù)包從同一塊網(wǎng)卡返回。


          ? XDP_REDIRECT則是將數(shù)據(jù)包重定向到其他的網(wǎng)卡或CPU,結(jié)合AF_XDP可以將數(shù)據(jù)包直接送往用戶空間。


          以上幾種XDP動(dòng)作碼的組合,帶來(lái)了多種應(yīng)用可能。

          XDP具有三種運(yùn)行模式:


          ??原生模式:
          即驅(qū)動(dòng)模式,在該模式下的XDP程序運(yùn)行在網(wǎng)絡(luò)驅(qū)動(dòng)程序的早期路徑,需要網(wǎng)卡驅(qū)動(dòng)程序的支持,而10G及以上速率的大多數(shù)網(wǎng)卡基本都是支持的;


          ??卸載模式:
          該模式會(huì)直接將XDP程序卸載到網(wǎng)卡上,從而徹底釋放主機(jī)CPU資源,相較于原生模式,具有更高的性能。目前支持的網(wǎng)卡似乎只有Netronome智能網(wǎng)卡。


          ??通用模式:
          該模式下的XDP程序運(yùn)行于驅(qū)動(dòng)之后的位置,無(wú)需驅(qū)動(dòng)支持,但性能較差,一般用于測(cè)試。


          上述提到的eBPF則是起源更早的一種技術(shù):

          1992年,BPF第一次在Berkeley實(shí)驗(yàn)室被提出,從名字可以看出來(lái),最初BPF的功能就是用于包過(guò)濾的,我們平時(shí)所用的tcpdump就是基于eBPF實(shí)現(xiàn)的。2013年,BPF被加強(qiáng),得到了eBPF,并在2014年正式并入Linux內(nèi)核。通俗的來(lái)講,eBPF提供了一種在各種內(nèi)核和應(yīng)用事件發(fā)生時(shí)運(yùn)行一小段程序的機(jī)制。除去在XDP、TC等網(wǎng)絡(luò)方面的應(yīng)用,eBPF也用于性能監(jiān)控、跟蹤等多種場(chǎng)景。

          到了2018年,Linux在4.18版本中也開(kāi)通了屬于自己的直達(dá)用戶空間的高速公路——AF_XDP,合入了Linux內(nèi)核,后續(xù)將持續(xù)對(duì)這條高速公路進(jìn)行支持。AF_XDP是一種協(xié)議族(Address family),指定socket通訊類(lèi)型。通過(guò)XDP程序的redirect,我們可以將報(bào)文重定向到一塊指定的用戶態(tài)可讀寫(xiě)的內(nèi)存隊(duì)列(UMEM)中,用戶態(tài)的應(yīng)用程序可以直接使用AF_XDP socket即XSK去接收數(shù)據(jù),直接訪問(wèn)這塊內(nèi)存的數(shù)據(jù)包。

          使用XDP技術(shù)進(jìn)行快速的包處理具有如下優(yōu)勢(shì):


          ??是Linux內(nèi)核的一部分。這是一個(gè)長(zhǎng)期的解決架構(gòu)方案,由Linux內(nèi)核社區(qū)維護(hù),如同內(nèi)核的其他部分,具有穩(wěn)定的API,無(wú)需修改內(nèi)核,無(wú)需增加額外的軟件框架。


          ??使用與內(nèi)核協(xié)同,而非完全內(nèi)核旁路的方式。XDP可重用所有Linux上游的網(wǎng)絡(luò)工具和驅(qū)動(dòng),能夠復(fù)用內(nèi)核訪問(wèn)硬件的安全模型。而DPDK等技術(shù)則需要使用其專(zhuān)屬的網(wǎng)絡(luò)和安全工具。


          ??安全性。由于eBPF驗(yàn)證器(verifier)的存在,一些不安全的指令會(huì)被內(nèi)核拒絕加載。


          ??無(wú)需獨(dú)占CPU資源。即便是在空負(fù)載的情況下,DPDK也需要使用忙輪詢(xún)來(lái)進(jìn)行收包檢查,分配的CPU核永遠(yuǎn)是打滿的。而XDP可以始終運(yùn)行,只有在負(fù)載升高時(shí)才會(huì)開(kāi)始占用CPU。同時(shí)XDP程序也是可以運(yùn)行在多個(gè)CPU之上的,這進(jìn)一步提高了其性能。


          ??動(dòng)態(tài)注入。eBPF程序可以隨時(shí)重新掛載和更新。


          ??無(wú)需分配巨頁(yè)。


          ??適用性強(qiáng)。高于4.8版本的內(nèi)核和絕大多數(shù)高速網(wǎng)卡都是支持XDP的,無(wú)需專(zhuān)有硬件的支持。


          ??……


          XDP技術(shù)的使用


          當(dāng)前,XDP技術(shù)被OVS、Cilium、Polycube等用于網(wǎng)絡(luò)快速路徑的新選擇,DPDK也做了AF_XDP PMD。

          XDP程序在CPU可用來(lái)處理的最早時(shí)間點(diǎn)被執(zhí)行,尤其適合DDoS防御、防火墻。

          Cloudflare在他們的DDoS防御L4Drop中便利用了XDP,丟包規(guī)則將被轉(zhuǎn)化為eBPF程序,并掛載到XDP鉤子上,相比其他方案,無(wú)需用輪詢(xún)獨(dú)占CPU核,使用更低CPU資源的同時(shí)也能提供更加優(yōu)秀的丟包性能,在云環(huán)境下,這種節(jié)省寶貴CPU資源的特性是非常吸引人的。

          這種Linux的原生技術(shù)還在不斷為網(wǎng)絡(luò)處理帶來(lái)新的思路。2019年,Sebastiano Miano等人使用XDP和TC鉤子掛載eBPF程序?qū)崿F(xiàn)了Linux的防火墻iptable,在規(guī)則數(shù)量提高的情況下提供相比原始iptable高數(shù)倍甚至數(shù)十倍的性能。2021年,Yoann Ghigoff等人更是基于eBPF和XDP、TC在內(nèi)核中實(shí)現(xiàn)了一層Memcached的緩存,達(dá)到了比DPDK內(nèi)核旁路方案還要高的性能。智能網(wǎng)卡也開(kāi)始對(duì)eBPF卸載進(jìn)行了支持,將包處理進(jìn)一步從網(wǎng)卡驅(qū)動(dòng)層卸載到了網(wǎng)卡,釋放了更多的主機(jī)CPU資源,實(shí)現(xiàn)更高的性能。我們常用的虛擬交換機(jī)OVS的團(tuán)隊(duì)也在2.12.0版本就開(kāi)始對(duì)AF_XDP進(jìn)行探索,在2021年SIGCOMM會(huì)議上,發(fā)表了這些年他們對(duì)于數(shù)據(jù)面的探索,將AF_XDP選型用于其數(shù)據(jù)面,解決了很多DPDK解決不了的問(wèn)題。其他的應(yīng)用場(chǎng)景如負(fù)載均衡、流采樣和監(jiān)控……更多的可能正在被學(xué)術(shù)和工業(yè)界探索。

          結(jié)? 語(yǔ)


          作為另一個(gè)操作系統(tǒng)巨頭,微軟從原先“開(kāi)源公敵”變?yōu)閾肀ч_(kāi)源、擁抱linux,也在開(kāi)始擁抱eBPF,ebpf-for-windows是微軟的開(kāi)源項(xiàng)目,用于在Windows 10和Windows Server 2016及以后的版本上運(yùn)行eBPF,使得開(kāi)發(fā)者可以用熟悉的eBPF工具鏈和API進(jìn)行開(kāi)發(fā)。可能不久的將來(lái),Windows也會(huì)對(duì)eBPF、XDP技術(shù)作出更多支持。

          XDP技術(shù)的發(fā)展只過(guò)了幾年,AF_XDP正式合入內(nèi)核更是不過(guò)三年的時(shí)間,但它是Linux內(nèi)核社區(qū)長(zhǎng)期維護(hù)的技術(shù),具有足以媲美DPDK的性能,具備多種獨(dú)有的優(yōu)勢(shì)。待未來(lái)更多優(yōu)化被合入以后,必然是一種網(wǎng)絡(luò)處理加速的重要技術(shù)。

          來(lái)源于:SDNLAB

          Linux學(xué)習(xí)指南

          有收獲,點(diǎn)個(gè)在看?

          瀏覽 122
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩免费观看一级 | 一区二区三区四区精品在线 | 亚洲爆乳无码一区二区三区 | 亚洲精品一区中文字幕乱码 | 欧美成人精品三级在线网站 |