www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > CPP開(kāi)發(fā)者
[導(dǎo)讀]↓推薦關(guān)注↓從Linux內(nèi)核3.15開(kāi)始,您可能一直在關(guān)注內(nèi)核社區(qū)中擴(kuò)展的BerkeleyPacketFilter(eBPF)的開(kāi)發(fā),或者您可能仍然將BerkeleyPacketFilter與VanJacobson在1992年所做的工作聯(lián)系起來(lái)。您可能已經(jīng)使用BPF和tcpdum...

推薦關(guān)注↓



從 Linux 內(nèi)核3.15 開(kāi)始,您可能一直在關(guān)注內(nèi)核社區(qū)中擴(kuò)展的 Berkeley Packet Filter (eBPF) 的開(kāi)發(fā),或者您可能仍然將 Berkeley Packet Filter 與 Van Jacobson 在 1992 年所做的工作聯(lián)系起來(lái)。您可能已經(jīng)使用 BPF 和 tcpdump 多年,或者您可能已經(jīng)開(kāi)始在您的數(shù)據(jù)平面中探測(cè)它!本博客旨在從高性能網(wǎng)絡(luò)的角度在高層次上描述BPF的關(guān)鍵發(fā)展,以及為什么它對(duì)網(wǎng)絡(luò)運(yùn)營(yíng)商、系統(tǒng)管理員和企業(yè)解決方案提供商變得越來(lái)越重要。


BPF 或 eBPF——有什么區(qū)別?

虛擬機(jī)
從根本上說(shuō),eBPF 仍然是 BPF:它是一個(gè)小型虛擬機(jī),它從用戶(hù)空間注入并附加到內(nèi)核中特定鉤子的程序。它可以對(duì)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行分類(lèi)和操作。多年來(lái),它一直在 Linux 上用于過(guò)濾數(shù)據(jù)包并避免將昂貴的副本復(fù)制到用戶(hù)空間,例如使用 tcpdump。但是,在過(guò)去幾年中,虛擬機(jī)的范圍已經(jīng)變得面目全非。


圖 1. cBPF 與 eBPF 機(jī)器的比較

經(jīng)典 BPF (cBPF),舊版本,由一個(gè) 32 位寬累加器、一個(gè) 32 位寬“X”寄存器(也可以在指令中使用)和 16 個(gè) 32 位寄存器(用作暫存存儲(chǔ)器)組成. 這顯然導(dǎo)致了一些關(guān)鍵的限制。顧名思義,經(jīng)典的伯克利數(shù)據(jù)包過(guò)濾器主要限于(無(wú)狀態(tài))數(shù)據(jù)包過(guò)濾。任何更復(fù)雜的事情都將在其他子系統(tǒng)中完成。


eBPF 通過(guò)使用一組擴(kuò)展的寄存器和指令、添加映射(沒(méi)有大小限制的鍵/值存儲(chǔ))、512 字節(jié)堆棧、更復(fù)雜的查找、幫助程序,顯著拓寬了 BPF 的用例集可從程序內(nèi)部調(diào)用的函數(shù),以及鏈接多個(gè)程序的可能性?,F(xiàn)在可以進(jìn)行狀態(tài)處理,也可以與用戶(hù)空間程序進(jìn)行動(dòng)態(tài)交互。由于這種靈活性的提高,eBPF 處理的數(shù)據(jù)包的分類(lèi)級(jí)別和可能的交互范圍得到了極大的擴(kuò)展。


但新功能不能以犧牲安全為代價(jià)。為確保正確行使 VM 增加的責(zé)任,內(nèi)核中實(shí)施的驗(yàn)證程序已被修訂和整合。這個(gè)驗(yàn)證器檢查代碼中的任何循環(huán)(這可能導(dǎo)致可能的無(wú)限循環(huán),從而掛起內(nèi)核)和任何不安全的內(nèi)存訪(fǎng)問(wèn)。它拒絕任何不符合安全標(biāo)準(zhǔn)的程序。每次用戶(hù)嘗試注入程序時(shí),都會(huì)在實(shí)時(shí)系統(tǒng)上執(zhí)行此步驟,然后將 BPF 字節(jié)碼 JIT 轉(zhuǎn)換為所選平臺(tái)的本機(jī)匯編指令。


圖 2. 主機(jī)上 eBPF 程序的編譯流程。一些CPU架構(gòu)沒(méi)有顯示。

為了允許在 eBPF 的限制內(nèi)難以執(zhí)行或優(yōu)化的任何關(guān)鍵功能,有許多幫助程序旨在協(xié)助執(zhí)行過(guò)程,例如地圖查找或隨機(jī)數(shù)的生成。我的同事 Quentin Monnet 目前正在完成記錄所有內(nèi)核助手的過(guò)程,并準(zhǔn)備了一個(gè)補(bǔ)丁供審查。


鉤子 - 數(shù)據(jù)包在哪里分類(lèi)?
由于其靈活性和實(shí)用性,eBPF 的鉤子數(shù)量正在激增。但是,我們將重點(diǎn)關(guān)注數(shù)據(jù)路徑低端的那些。這里的關(guān)鍵區(qū)別在于 eBPF 在驅(qū)動(dòng)程序空間中添加了一個(gè)額外的鉤子。此掛鉤稱(chēng)為 eXpress DataPath,或 XDP。這允許用戶(hù)在將 skb(套接字緩沖區(qū))元數(shù)據(jù)結(jié)構(gòu)添加到數(shù)據(jù)包之前丟棄、反射或重定向數(shù)據(jù)包。這導(dǎo)致性能提高約 4-5 倍。



圖 3. 高性能網(wǎng)絡(luò)相關(guān) eBPF 鉤子性能比較

將 eBPF 卸載到 NFP

回到 4.9,我的同事和我們的內(nèi)核驅(qū)動(dòng)程序維護(hù)者 Jakub Kicinski 將網(wǎng)絡(luò)流處理器 (NFP) BPF JIT 編譯器添加到內(nèi)核中,最初用于 cls_bpf ( https://www.spinics.net/lists/netdev/msg379464 .html)。從那時(shí)起,Netronome 一直致力于改進(jìn)內(nèi)核和 LLVM 中的 BPF 基礎(chǔ)設(shè)施,它生成字節(jié)碼(感謝 Jiong Wang 的工作)。通過(guò) NFP JIT,我們?cè)O(shè)法有效地修改了程序流程,如下圖所示:


4. 包含 NFP JIT 的編譯流程(未顯示某些支持的 CPU 架構(gòu))

這是可能的關(guān)鍵原因是因?yàn)?BPF 機(jī)器映射到我們 NFP 上的流處理核心的程度,這意味著運(yùn)行在 15-25W 之間的基于 NFP 的 Agilio CX SmartNIC 可以從主機(jī)卸載大量處理. 在下面的負(fù)載平衡示例中,NFP 處理的數(shù)據(jù)包數(shù)量與來(lái)自主機(jī)的近 12 個(gè) x86 內(nèi)核的總和相同,由于 PCIe 帶寬限制(使用的內(nèi)核:Intel Xeon CPU E5-2630 v4 @ 2.20GHz)。


圖 5. NFP 和 x86 CPU (E5-2630 v4) 上的示例負(fù)載平衡器的比較性能

性能是使用 BPF 硬件卸載是對(duì) SmartNIC 進(jìn)行編程的正確技術(shù)的主要原因之一。但它不是唯一的:讓我們回顧一些其他的激勵(lì)措施。

  1. 靈活性:BPF 在主機(jī)上提供的主要優(yōu)勢(shì)之一是能夠即時(shí)重新加載程序。這使得在運(yùn)行的數(shù)據(jù)中心中動(dòng)態(tài)替換程序成為可能??赡苁菢?shù)外內(nèi)核代碼或插入其他一些不太靈活的子系統(tǒng)的代碼現(xiàn)在可以輕松加載或卸載。由于不需要系統(tǒng)重新啟動(dòng)的錯(cuò)誤,這為數(shù)據(jù)中心提供了顯著的優(yōu)勢(shì):相反,只需重新加載調(diào)整后的程序即可。


    這個(gè)模型現(xiàn)在也可以擴(kuò)展到卸載。用戶(hù)可以在流量運(yùn)行時(shí)動(dòng)態(tài)加載、卸載、重新加載 NFP 上的程序。這種在運(yùn)行時(shí)動(dòng)態(tài)重寫(xiě)固件提供了一個(gè)強(qiáng)大的工具來(lái)被動(dòng)地使用 NFP 的靈活性和性能。


  2. 延遲:通過(guò)卸載 eBPF,由于數(shù)據(jù)包不必跨越 PCIe 邊界,延遲顯著減少。這可以改善負(fù)載平衡或 NAT 用例的網(wǎng)絡(luò)衛(wèi)生。請(qǐng)注意,通過(guò)避免 PCIe 邊界,在 DDoS 預(yù)防案例中也有顯著的好處,因?yàn)閿?shù)據(jù)包不再跨越邊界,否則可能會(huì)在構(gòu)造良好的 DDoS 攻擊下形成瓶頸。



    ?

    圖 6. 驅(qū)動(dòng)程序中卸載的 XDP 與 XDP 的延遲,注意使用卸載時(shí)延遲的一致性
  3. 用于對(duì) SmartNIC 數(shù)據(jù)路徑進(jìn)行編程的接口:通過(guò)能夠使用 eBPF 對(duì) SmartNIC 進(jìn)行編程,這意味著可以非常輕松地實(shí)現(xiàn)諸如速率限制、數(shù)據(jù)包過(guò)濾、不良行為者緩解或其他傳統(tǒng) NIC 必須在硅片中實(shí)現(xiàn)的功能. 這可以針對(duì)最終用戶(hù)的特定用例進(jìn)行定制。


我如何實(shí)際使用它?
首先要做的是將內(nèi)核更新到 4.16 或更高版本。我建議使用 4.17(撰寫(xiě)本文時(shí)的開(kāi)發(fā)版本)或更高版本以利用盡可能多的功能。請(qǐng)參閱用戶(hù)指南以獲取最新版本的功能以及如何使用它們的示例


在此不贅述,還可以注意到與 eBPF 工作流相關(guān)的工具正在開(kāi)發(fā)中,并且相對(duì)于舊的 cBPF 版本已經(jīng)有了很大的改進(jìn)。用戶(hù)現(xiàn)在通常會(huì)用 C 編寫(xiě)程序,然后使用 clang-LLVM 提供的后端將它們編譯成 eBPF 字節(jié)碼。也可以使用其他語(yǔ)言,包括 Go、Rust 或 Lua。傳統(tǒng)工具中添加了對(duì) eBPF 架構(gòu)的支持:llvm-objdump 可以以人類(lèi)可讀的格式轉(zhuǎn)儲(chǔ) eBPF 字節(jié)碼,llvm-mc 可以用作 eBPF 匯編器,strace 可以跟蹤對(duì) bpf() 系統(tǒng)調(diào)用的調(diào)用。其他工具的一些工作仍在進(jìn)行中:binutils 反匯編器應(yīng)該很快就會(huì)支持 NFP 微碼,而 valgrind 即將獲得對(duì)系統(tǒng)調(diào)用的支持。還創(chuàng)建了新工具:特別是 bpftool,


過(guò)濾器
對(duì)于企業(yè)系統(tǒng)管理員或 IT 架構(gòu)師而言,此時(shí)仍然懸而未決的一個(gè)關(guān)鍵問(wèn)題是,這如何適用于擁有已完善和維護(hù)多年且基于 iptables 的設(shè)置的最終用戶(hù)。更改此設(shè)置的風(fēng)險(xiǎn)在于,顯然,某些事情可能令人難以接受,必須修改編排層,應(yīng)該構(gòu)建新的 API,等等。要解決此問(wèn)題,請(qǐng)輸入建議的 bpfilter 項(xiàng)目。正如昆汀今年早些時(shí)候所寫(xiě):


“這項(xiàng)技術(shù)是針對(duì) Linux 中 iptables 防火墻的新的基于 eBPF 的后端的提議。在撰寫(xiě)本文時(shí),它還處于非常早期的階段:它在 2018 年 2 月中旬左右由 David Miller(網(wǎng)絡(luò)系統(tǒng)維護(hù)者)、Alexei Starovoitov 和 Daniel 在 Linux netdev 郵件列表上作為 RFC(征求意見(jiàn))提交Borkmann(內(nèi)核中 BPF 部分的維護(hù)者)。因此,請(qǐng)記住,隨后的所有細(xì)節(jié)都可能發(fā)生變化,或者根本無(wú)法到達(dá)內(nèi)核!?



從技術(shù)上講,用于配置防火墻的 iptables 二進(jìn)制文件將保持不變,而內(nèi)核中的 xtables 部分可以透明地替換為一組新命令,這些命令需要 BPF 子系統(tǒng)將防火墻規(guī)則轉(zhuǎn)換為 eBPF 程序。然后可以將此程序附加到與網(wǎng)絡(luò)相關(guān)的內(nèi)核掛鉤之一,例如在流量控制接口 (TC) 或驅(qū)動(dòng)程序級(jí)別 (XDP) 上。規(guī)則轉(zhuǎn)換將發(fā)生在一種新的內(nèi)核模塊中,它介于傳統(tǒng)模塊和普通 ELF 用戶(hù)空間二進(jìn)制文件之間。運(yùn)行在具有完全權(quán)限但不能直接訪(fǎng)問(wèn)內(nèi)核的特殊線(xiàn)程中,從而提供較少的攻擊面,這種特殊類(lèi)型的模塊將能夠直接與 BPF 子系統(tǒng)通信(主要通過(guò)系統(tǒng)調(diào)用)。而與此同時(shí),使用標(biāo)準(zhǔn)的用戶(hù)空間工具來(lái)開(kāi)發(fā)、調(diào)試甚至模糊它仍然非常容易!除了這個(gè)新的模塊對(duì)象之外,bpfilter 方法的好處可能很多。由于 eBPF 驗(yàn)證器,預(yù)計(jì)會(huì)提高安全性。重用 BPF 子系統(tǒng)可能會(huì)使這個(gè)組件的維護(hù)比遺留 xtables 更容易,并且可能提供與內(nèi)核的其他組件的后續(xù)集成,這些組件也依賴(lài)于 BPF。當(dāng)然,利用即時(shí) (JIT) 編譯或可能的程序硬件卸載可以顯著提高性能!”?


bpfilter 正在被開(kāi)發(fā)作為該問(wèn)題的解決方案。它允許最終用戶(hù)無(wú)縫地遷移到這種新的高性能范例。將 CPU 的 8 個(gè)內(nèi)核和卸載與一系列簡(jiǎn)單的 iptables 規(guī)則的 NFP 與 iptables (netfilter) 傳統(tǒng)后端、較新的 nftables、主機(jī)上的 bpfilter 和卸載到 SmartNIC 進(jìn)行比較,清楚地顯示了性能所在.



圖 7. bpfilter 與舊 iptables 實(shí)現(xiàn)的性能比較


概括

因此有它后,內(nèi)核社區(qū)網(wǎng)絡(luò)方面產(chǎn)生了巨大轉(zhuǎn)變。eBPF 是一個(gè)強(qiáng)大的工具,它為內(nèi)核帶來(lái)了可編程性,它可以處理?yè)砣刂疲═CP-BPF)、跟蹤(kprobes、tracepoints)和高性能網(wǎng)絡(luò)(XDP、cls_bpf)。由于其在社區(qū)中的成功,其他用例可能也會(huì)出現(xiàn)。除此之外,也會(huì)一直持續(xù)到最終用戶(hù),他們能夠很快平滑地從舊的 iptables 后端,轉(zhuǎn)而使用更新的、更高效的基于 XDP 的后端——使用與今天相同的工具。特別是,這將允許直接的硬件卸載,并在用戶(hù)遷移到 10G 及以上網(wǎng)絡(luò)時(shí)提供必要的靈活性。

轉(zhuǎn)自:極客重生

https://www.netronome.com/blog/bpf-ebpf-xdp-and-bpfilter-what-are-these-things-and-what-do-they-mean-enterprise/


- EOF -

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉