国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用eBPF寫TCP擁塞控制算法?

Linux閱碼場 ? 來源:csdn ? 作者:dog250 ? 2020-12-26 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

其實不想用這個題目的,只因為TCP相關的東西比較吸引人的眼球,這篇文章的主題還是eBPF,而不是TCP。

用eBPF寫TCP擁塞控制算法只是本文所講內容的一個再平凡不過的例子。

先看兩個問題,或者說是兩個痛點:

內核越來越策略化。

內核接口不穩定。

分別簡單說一下。

所謂內核策略化就是說越來越多的靈巧的算法,小tricks等靈活多變的代碼進入內核,舉例來講,包括但不限于以下這些:

TCP擁塞控制算法。

TC排隊規則,數據包調度算法。

各種查找的哈希算法。

這部分策略化的代碼幾乎都是用“回調函數”實現的,這在另一方面烘托了Linux內核也是模塊化設計的,且機制和策略分離,當需要一種新的算法時,只需要register一組新的回調函數即可。

然而,…

然而不夠完美,因為上述第2點,“內核接口不穩定”!即每一個內核版本的數據結構以及API都是不兼容的。

這意味著什么?

這意味著,即便是高度封裝好的算法模塊代碼,也需要為不同版本的Linux內核維護一套代碼,當涉及內核模塊由于版本問題不得不升級時,數據結構和api的適配工作往往是耗時且出力不討好的。

但其實,很多算法根本就是與內核數據結構,內核api這些無關的。

兩個內核版本,數據結構只是字段變化了位置,新增了字段,更新了字段名字,即便如此,不得不對算法模塊進行重新編譯…

如果能在模塊載入內核的時候,對函數和數據結構字段進行重定位就好了!

我們的目標是,一次編寫,多次運行。

又是Facebook走在了前面,來自Facebook的BPF CO-RE(Compile Once – Run Everywhere):
http://vger.kernel.org/bpfconf2019_talks/bpf-core.pdf
沒錯,eBPF,就是它!

我們看下其描述:

BPF CO-RE talk discussed issues that developers currently run into when developing, testing, deploying, and running BPF applications at scale, taking Facebook’s experience as an example. Today, most types of BPF programs access internal kernel structures, which necessitates the need to compile BPF program’s C code “on the fly” on every single production machine due to changing struct/union layouts and definitions inside kernel. This causes many problems and inconveniences, starting from the need to have kernel sources available everywhere and in sync with running kernel, which is a hassle to set up and maintain. Reliance on embedded LLVM/Clang for compilation means big application binary size, increased memory usage, and some rare, but impactful production issues due to increased resource usage due to compilation. With current approach testing BPF programs against multitude of production kernels is a stressful, time-consuming, and error-prone process. The goal of BPF CO-RE is to solve all of those issues and move BPF app development flow closer to typical experience, one would expect when developing applications: compile BPF code once and distribute it as a binary. Having a good way to validate that BPF application will run without issues on all active kernels is also a must.

The complexity hides in the need to adjust compiled BPF assembly code to every specific kernel in production, as memory layout of kernel data structures changes between kernel versions and even different kernel build configurations. BPF CO-RE solution relies on self-describing kernel providing BTF type information and layout (ability to produce it was recently committed upstream). With the help from Clang compiler emitting special relocations during BPF compilation and with libbpf as a dynamic loader, it’s possible to reconciliate correct field offsets just before loading BPF program into kernel. As BPF programs are often required to work without modification (i.e., re-compilation) on multiple kernel versions/configurations with incompatible internal changes, there is a way to specify conditional BPF logic based on actual kernel version and configuration, also using relocations emitted from Clang. Not having to rely on kernel headers significantly improves the testing story and makes it possible to have a good tooling support to do pre-validation before deploying to production.

There are still issues which will have to be worked around for now. There is currently no good way to extract #define macro from kernel, so this has to be dealt with by copy/pasting the necessary definitions manually. Code directly relying on size of structs/unions has to be avoided as well, as it isn’t relocatable in general case. While there are some raw ideas how to solve issues like that in the future, BPF CO-RE developers prioritize providing basic mechanisms to allow “Compile Once - Run Everywhere” approach and significantly improve testing and pre-validation experience through better tooling, enabled by BPF CO-RE. As existing applications are adapted to BPF CO-RE, there will be new learning and better understanding of additional facilities that need to be provided to provide best developer experience possible.

該機制可以:

用eBPF的一組字節碼實現內核模塊的一組回調函數。

對使用到的內核數據結構字段進行重定位,適配當前內核的對應偏移。

后果就是:

很多內核算法模塊可以用eBPF來編寫了。

Linux 5.6用TCP擁塞控制算法舉了一例,我們看一下:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=09903869f69f

可以看到,這個eBPF程序是與內核版本無關的,你可以看到它的tcp_sock結構體的定義:

struct tcp_sock { struct inet_connection_sock inet_conn; __u32 rcv_nxt; __u32 snd_nxt; __u32 snd_una; __u8 ecn_flags; __u32 delivered; __u32 delivered_ce; __u32 snd_cwnd; __u32 snd_cwnd_cnt; __u32 snd_cwnd_clamp; __u32 snd_ssthresh; __u8 syn_data:1, /* SYN includes data */ syn_fastopen:1, /* SYN includes Fast Open option */ syn_fastopen_exp:1,/* SYN includes Fast Open exp. option */ syn_fastopen_ch:1, /* Active TFO re-enabling probe */ syn_data_acked:1,/* data in SYN is acked by SYN-ACK */ save_syn:1, /* Save headers of SYN packet */ is_cwnd_limited:1,/* forward progress limited by snd_cwnd? */ syn_smc:1; /* SYN includes SMC */ __u32 max_packets_out; __u32 lsndtime; __u32 prior_cwnd;} __attribute__((preserve_access_index));

這里注意到兩點:

該結構體并非內核頭文件里的對應結構體,它只包含了內核對應結構體里TCP CC算法用到的字段,它是內核對應同名結構體的子集。

preserve_access_index屬性表示eBPF字節碼在載入的時候,會對這個結構體里的字段進行重定向,滿足當前內核版本的同名結構體字段的偏移。

我們在看下eBPF實現的TCP CC回調函數是個什么樣子:

BPF_TCP_OPS_3(tcp_reno_cong_avoid, void, struct sock *, sk, __u32, ack, __u32, acked){ struct tcp_sock *tp = tcp_sk(sk); if (!tcp_is_cwnd_limited(sk)) return; /* In "safe" area, increase. */ if (tcp_in_slow_start(tp)) { acked = tcp_slow_start(tp, acked); if (!acked) return; } /* In dangerous area, increase slowly. */ tcp_cong_avoid_ai(tp, tp->snd_cwnd, acked);}... SEC(".struct_ops")struct tcp_congestion_ops dctcp = { .init = (void *)dctcp_init, .in_ack_event = (void *)dctcp_update_alpha, .cwnd_event = (void *)dctcp_cwnd_event, .ssthresh = (void *)dctcp_ssthresh, .cong_avoid = (void *)tcp_reno_cong_avoid, .undo_cwnd = (void *)dctcp_cwnd_undo, .set_state = (void *)dctcp_state, .flags = TCP_CONG_NEEDS_ECN, .name = "bpf_dctcp",};

沒啥特殊的,幾乎和內核模塊的寫法一樣,唯一不同的是:

它和內核版本無關了。你用llvm/clang編譯出來.o字節碼將可以被載入到所有的內核。

它讓人感覺這是在用戶態編程

是的,這就是在用戶態寫的TCP CC算法,eBPF字節碼的對應verifier會對你的代碼進行校驗,它不允許可以crash內核的eBPF代碼載入,你的危險代碼幾乎無法通過verify。

如果你想搞明白這一切背后是怎么做到的,看兩個文件就夠了:

net/ipv4/bpf_tcp_ca.c

kernel/bpf/bpf_struct_ops.c

當然,經理不會知道這意味著什么。

浙江溫州皮鞋濕,下雨進水不會胖。

原文標題:用eBPF寫TCP擁塞控制算法

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    4

    文章

    1467

    瀏覽量

    42871
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1424

    瀏覽量

    83500

原文標題:用eBPF寫TCP擁塞控制算法

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    TCP/IP(Socket)協議深度剖析

    TCP/IP協議作為互聯網通信的基礎架構,其核心機制Socket編程承載著全球數據交換的使命。本文將深入剖析這一協議的七層架構、三次握手與四次揮手的精妙設計、流量控制擁塞控制的動態平
    的頭像 發表于 03-03 17:06 ?459次閱讀

    PID控制算法

    PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現過程,對于一般的研發人員來講,應該是足夠應對一般研發問題了,而難能可貴的是,在我所
    發表于 01-23 08:18

    看透微突發:利用 INT 技術實現交換機隊列級的實時擁塞告警

    星融元開發的 EasyRoCE-CMA 是基于 INT 技術的擁塞監控工具 。它利用納秒級精度的 HDC 與 BDC 捕獲信息 ,實現交換機端口級擁塞與丟包的一站式可視化 。該工具能精準定位故障根因,輔助 AI 智算網絡快速調優 。
    的頭像 發表于 01-16 15:29 ?1208次閱讀
    看透微突發:利用 INT 技術實現交換機隊列級的實時<b class='flag-5'>擁塞</b>告警

    何用FPGA控制ADV7513實現HDMI畫面顯示和音頻播放

    HDMI接口顯示使用DMT時序+TMDS編碼來實現。當用FPGA控制HDMI的數據傳輸時,通常可以采用純RTL實現TMDS算法或者使用專門的HDMI芯片(如ADV7513)這兩種方案來完成。本文主要是介紹如何用FPGA
    的頭像 發表于 12-02 11:05 ?6793次閱讀
    如<b class='flag-5'>何用</b>FPGA<b class='flag-5'>控制</b>ADV7513實現HDMI畫面顯示和音頻播放

    ECN如何在HPC和數據中心中應對網絡擁塞

    ECN(Explicit Congestion Notification)是一種改進后的擁塞控制方法,它不依賴于丟包來指示擁塞,而是在數據包的頭部標記擁塞發生的信號。ECN通過向數據包
    的頭像 發表于 09-26 14:53 ?2662次閱讀
    ECN如何在HPC和數據中心中應對網絡<b class='flag-5'>擁塞</b>

    解析DCQCN:RDMA在數據中心網絡的關鍵擁塞控制協議

    DCQCN ( Data Center Quantized Congestion Notification),數據中心量化擁塞通知。它是一種專門為數據中心網絡設計的端到端擁塞控制協議。其核心目的是在使用RDMA(RoCEv2)
    的頭像 發表于 09-15 11:45 ?1862次閱讀
    解析DCQCN:RDMA在數據中心網絡的關鍵<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b>協議

    PID控制算法學習筆記資料

    用于新手學習PID控制算法
    發表于 08-12 16:22 ?7次下載

    Modbus TCP 轉 Modbus RTU電腦端 TCP 與西門子 V20 變頻器的通信案例

    在工業自動化控制系統中,經常需要實現不同設備之間的通信與數據交互。本案例旨在展示如何通過 Modbus 協議,將電腦作為主站(Modbus TCP)與多臺西門子變頻器 V20(Modbus RTU
    的頭像 發表于 07-27 17:19 ?909次閱讀
    Modbus <b class='flag-5'>TCP</b> 轉 Modbus RTU電腦端 <b class='flag-5'>TCP</b> 與西門子 V20 變頻器的通信案例

    基于eBPF的Kubernetes網絡異常檢測系統

    作為一名在云原生領域深耕多年的運維工程師,我見過太多因為網絡問題導致的生產事故。傳統的監控手段往往是事后諸葛亮,當你發現問題時,用戶已經在抱怨了。今天,我將分享如何利用 eBPF 這一革命性技術,構建一套能夠實時檢測 Kubernetes 網絡異常的系統。
    的頭像 發表于 07-24 14:09 ?724次閱讀

    什么是Modbus TCP協議

    Modbus TCP是一種基于TCP/IP協議的Modbus通信協議,用于在客戶機和服務器之間進行數據通信。它常用于工業自動化控制、電力監控與管理、溫濕度監測等領域。Modbus TCP
    的頭像 發表于 07-23 17:18 ?4261次閱讀
    什么是Modbus <b class='flag-5'>TCP</b>協議

    何用AI負載為SONiC交換機調整ECN水線

    顯式擁塞通知(ECN)是計算機網絡中的一種機制,它允許發送設備明確地通知接收設備網絡擁塞,而不是依賴于傳統的“丟包”方法。在傳統的TCP/IP網絡中,當路由器或交換機出現擁塞時,它會丟
    的頭像 發表于 07-11 14:12 ?2594次閱讀
    如<b class='flag-5'>何用</b>AI負載為SONiC交換機調整ECN水線

    當CCLinkIE撞上Modbus TCP:照明控制系統的“方言戰爭”終結術

    在樓宇自動化系統中,新舊協議的兼容性問題常成為工程師的“隱形絆腳石”。CCLinkIE網絡的高速實時性與Modbus TCP照明控制器的通用性看似“天生對立”,但通過協議轉換方案,兩者可以實現“精準
    發表于 07-10 15:49

    CAN轉Modbus TCP網關賦能食品攪拌機智能協同控制

    在食品攪拌機的自動化控制系統中,設備通信協議的多樣性給系統集成帶來挑戰。JH-CAN-TCP疆鴻智能CAN主站轉Modbus TCP從站的網關,成為連接西門子PLC與伺服系統的關鍵橋梁。 西門子
    的頭像 發表于 07-02 20:09 ?381次閱讀

    RDMA簡介7之可靠傳輸

    網絡無損,需要進行嚴格的流量控制擁塞管理。流量控制指通過調整發送端的發送速率,確保接收端能夠處理并接收所有數據包。RoCE v2使用了IEEE 802.11Qbb中提出的基于優先級的流量控制
    發表于 06-13 10:01

    使用NXP 88W8801芯片組進行iPerf3測試期間TCP中的周期性丟包現象,怎么解決?

    OS: Linux Buildroot 內核版本: 4.9.0-1 Interface : USB 問題描述: 我在 TCP iPerf3 測試期間遇到周期性丟包。使用以下命令執行測試: bash
    發表于 04-02 06:53