《高效入門eBPF》直播背後的有趣故事

2021-12-22 Linux內核之旅

大家好,我是這次eBPF入門直播的講解人,在陳老師的提議下,在這裡和大家分享一下準備直播內容背後的故事。所以今天的這篇文字不講解技術,是記錄和分享。

從開始準備到直播,差不多不到4天時間,這段時間裡我是屬於一邊學習eBPF一邊準備ppt的狀態,因為我自己也算是一個初學者。老師是星期三(2.3號)中午的時候,發消息問我是否可以準備一次關於eBPF的直播,並且要在3個平臺進行直播,當時我又驚又喜。驚得是我之前從來沒有做過直播,毫無經驗可言,還有eBPF這個技術,我對它的學習只有之前寫過代碼BPF C代碼和BCC腳本,沒有深入學習過它的內部原理,而且有些概念也是模糊的,理解並不深刻,這相當於要從頭開始認真的學習它。喜的是我認為這又是一次新的挑戰,可以在這個過程中把eBPF原理搞懂,也鍛鍊一下。隨後老師問我需要幾天時間準備,我在腦海中大概的規劃了一下,把時間拆成兩塊,學習eBPF原理和製作PPT,兩天學習原理一天做PPT(後來實際上是在並發的執行了),所以我給老師說了需要3天時間準備。

老師中午說完直播的事情後,當天下午的時間我還沒有正式開始準備。我去了解了一下高效率學習的一些方法,還有一些關於結構化思考的文章,這些對理解eBPF當然是沒什麼幫助的,但是我覺得高效率的學習工作應該是有一套方法論的,我也想借鑑其中的方法論來提高效率。事實上也證明,確實是有用的。

晚上時候我了解到一個日程管理軟體Notion,所以我下載了它並學習如何使用它,接下來我就準備用它來規劃學習。所以在晚上,我在上面寫了第一個計劃:了解Notion。了解也是為了後面高效的利用它。

對Notion使用熟悉了以後,後面準備的這幾天裡我都用Notion來做日程規劃,這是到今天(2.8)已經做過的規劃記錄。

從第二天(2.4號)開始,我開始使用Notion來規劃日程。今天做的事情不是很多,主要是自己的eBPF入門哈哈。

家裡有一本《BPF之巔》,正好是放假回來買的。如果不是這次直播要學習eBPF,我也不知道我何時會翻開它哈哈。這本書巨厚,厚度和Linux經典巨著《深入Linux內核架構》相差無幾。我想在這本書中找到入門eBPF的思路。這本書我是挑著看的,有時需要從前幾頁直接跳到最後的附錄看。第一遍讀後知道了一些BPF裡面的術語概念,比如BPF程序、BPF指令集、BPF指令格式、BPF字節碼、虛擬指令集規範、BPF虛擬機、BPF解釋器、BPF加載器、BPF驗證器等。理解了這些點,下一步就是要如何把這些點串起來,形成對BPF框架的理解。構建起框架後,再選擇框架中的某個點深入。下午沒有再看書,社區的公眾號要推送直播消息,所以撰寫了下文案,構思了下直播內容的大綱。

從三天(2.5號)開始差不多正式投入到學習eBPF。有了前面的一些eBPF技術術語後,我開始提出一些思考,我想從我最好奇的地方去理解eBPF的內部原理,比如eBPF這個詞究竟代表的含義是什麼,它在內核中怎麼存在的,又是如何在內核中工作的?所以當天的日程規劃也比較明確,就是把這3個問題搞清楚。

接著在搞清楚那兩個問題的過程中,我也嘗試把理解eBPF技術過程中的各個點梳理出來,穿成一條線,幫助新學習eBPF技術的同學可以清晰的了解學習路線。所以在隨著不斷查資料深入的過程中,eBPF技術原理路線也在不停的改,下面是中間不停變動的草稿。

第一版就是圍繞最初的那幾個問題,後面學到新的東西後不斷擴充進來。

因為覺得第一版的草稿內容比較簡單,所以第2版草稿中我去搜集了關於eBPF的面試題,想看看面試中有哪些問的深入的問題,跟著問題深入。但是關於eBPF的面試題很少,只找到了一個:BPF 和 eBPF 是什麼原理?有什麼好處?第一問正好已經包含了。然後我又把自己設想成面試官的身份,對自己提一些思考問題。

隨著繼續學習,我發現對於eBPF技術,有些是屬於技術本身的核心原理,另外一些其實不能算是核心原理,比如eBPF的優勢和局限性,起源和發展等等,如果揉在一起講很難區分出重點。所以我想到利用二維坐標系來把它們區分開。縱軸代表深度,就是對eBPF技術原理理解越深越好;橫軸代表廣度,就是對eBPF技術知道越多越好,根據這樣的思路,又重新製作了第3版草稿。

但是第3版在縱向排列上,只是把關於涉及eBPF技術的原理點羅列,更科學的邏輯應該是先有一個總體鋪墊的過程,然後再逐個點深入,就像前面先了解eBPF技術的一些術語,然後搭建eBPF框架,再深入某個點一樣。所以按照這個思路,重新設計了各個原理點的先後順序,最終在第4版確定了下來。

第4版,最終版。

確定好了基本的eBPF講解路線後,後面製作PPT就可以按照這個大綱來準備。

在第4天(2.6號),差不多算全力投入。在早上規劃了當天的日程。

今天進行了大量思考,所以也把思考的其中一個過程記錄下來。

學習eBPF的過程中,也在不斷的思考和梳理,不好理解的邏輯就觸類旁通,暫時模糊的地帶就靠合理的分析推理,後面時間再去求證。eBPF有些術語聽著很抽象,比如BPF字節碼,我去查資料字節碼是什麼,然後了解到java字節碼,java字節碼被java虛擬機執行,我又去了解java虛擬機,最後梳理了java源程序經過編譯器生成字節碼,然後被java虛擬機解釋執行的過程,我把BPF字節碼、BPF虛擬機和java字節碼、java虛擬機觸類旁通,我覺的它們的實現思想是一致的。通過理解java編譯到解釋執行的工作原理,我終於有一種恍然大悟的感覺,第一次理解了為什麼BPF指令要編譯成BPF字節碼,也清楚了BPF虛擬機存在的意義,不再僅僅是停留在知道有BPF字節碼和BPF虛擬機這兩個東西,而不清楚它倆的關係紐帶。從外部看,BPF程序要被編譯成字節碼,BPF字節碼是需要被BPF虛擬機解釋執行。因為BPF虛擬機做的就是解釋執行的工作,所以有些BPF文檔裡把虛擬機稱為解釋器也就可以理解了,比如不開啟JIT就使用內核解釋器來解釋執行BPF字節碼,這些內容可以串起來了。

這是站在虛擬機的角度來理解,如果進一步思考,我把它與處理器和機器碼來對比理解。為了與虛擬機概念符合,就把真實的處理器叫做物理機吧。物理機執行機器碼,那虛擬機也要執行自己的機器碼,這個「機器碼」就叫做字節碼,可能也是為了區別於機器碼的叫法,當然字節碼也有自己的特點。機器碼符合一定的CPU體系結構的指令集規範的,比如x86指令集和ARM指令集,那虛擬機順理成章也應該有指令集規範,這就是指令格式,現在理解了為什麼要定義那個bpf_insn結構體了,要用它來定義BPF指令格式。但是又會有新的思考,定義好這個有什麼用呢,何時會用到呢?查資料了解到java的編譯器可能就是按照java字節碼格式來編譯生成字節碼的,所以BPF指令格式是為了告訴編譯器按照什麼規則來編譯BPF指令以生成BPF字節碼?然後內核解釋器也按照這個格式規範來對BPF字節碼解碼執行?這些都是我不太肯定的點,但是如果從邏輯上分析一下,感覺也比較合理。然後因為時間比較緊,而且這些問題都是屬於BPF內部原理之外的一些東西,BPF內部原理比如BPF程序如何被加載進內核,怎麼被虛擬機執行的還沒有搞清楚,所以沒有花時間去求證。後面的學習就是深入eBPF的內部原理,閱讀了幾篇篇高質量的博客,其中一篇沒有全部讀完,只看了對於理解有幫助的部分,這裡面包括一些對BPF源碼分析的博客,加深了對eBPF內部實現的理解。也是在這些大牛的技術博客的幫助下,一點一點結合之前所有零碎的點進行整合理解,最後終於對整個eBPF的運作機制有了初步的全景圖式理解。學習eBPF期間也在穿插的準備直播PPT的草稿版。

最後一天(2.7號)。今天要把PPT做完

計劃預計上午做完,下午修改格式。本來想著修改好PPT的格式後自己預演一下,因為第一次直播還是有點緊張,所以想排練一下。結果直到下午七點半左右才把PPT做好,距離正式開講只剩半個小時了,所以時間依然是很緊的。


晚上直播完以後,我又回看了錄屏,思考裡面有問題的地方和可以改進的點。以上就是直播準備的過程,記錄在這裡和大家分享。

非常感謝老師提供的機會,非常感謝為這次直播做了大量準備工作的社區工作人員,同時非常感謝觀看這次直播的小夥伴們,謝謝大家!

相關焦點

  • 谷歌Doodle背後的創意故事:有趣且辛苦
    谷歌Doodle一直因著簡單、多彩和有趣風靡全球。而看似簡單又小而美的Doodle背後,則是一次次精心的修改和一行行複雜的代碼,凝結了設計師和工程師的心血。  谷歌Doodle首席設計師Ryan Germick今日訪華,在谷歌位於五道口的科建大廈首次接受採訪,介紹Doodle的選材和創作過程,以及背後的故事。
  • 我自製的漢字遊戲資源,有趣又高效!可列印!
    跟著公認最高效的識字讀物——《四五快讀》,玩最有趣的遊戲,輕輕鬆鬆地把識字的入門門檻跨過去!——蒸汽爸爸Dora最近進入了識字敏感期。在我們還能自由出門的時候,走在路上、地鐵站、公交車上,Dora不時指著某個字,追著我和她媽問:「這個字讀什麼?」。
  • 深入理解 tc ebpf 的 direct-action (da) 模式(2020)
    例如下面這個場景,attach 一個 u32 filter 到一個 qdisc,根據包中的某些欄位做(初步)過濾在這個 filter 後面再加一個 ebpf action(做進一步過濾)因為 ebpf action 中可以實現邏輯處理,因此可以在這裡做額外判斷,如果包滿足某些額外的條件,就返回 drop。
  • android平臺eBPF初探
    關於eBPF機制詳細的講解網上有很多,這裡就不展開了,這裡先上一張圖,這裡包括了使用或者編寫ebpf涉及到的所有東西,下面會對這個圖進行詳細的講解。參考資料eBPF 簡史 (下篇):https://cloud.tencent.com/developer/article/1006318goolge原生使用ebpf的兩篇文章:https://source.android.com/devices/architecture/kernel/bpfhttps://source.android.com
  • 20個有趣的耳機故事
    4/指示燈模擬貓睡眼惺忪,代表貓「懶洋洋」。設計講述了貓得生活習慣故事,帶有粘人體貼的情愫。感悟:一個元素作為識別外觀成為慣性,若作為功能實用,若作為象徵意義,則產生新意。在充電盒70X40mm的面積內175個橫條紋陣列,線直徑0.4毫米,模具雕刻凹凸並覆蓋亞克力面板。加工精密度和風格形象強化。感悟:改善體驗同時成為產品差異特點,設計出發點也是產品價值點。
  • eBPF Tracing 入門教程與實例
    eBPF 做的恰恰是讓這個工具變得實用,tcplife 是高效並且安全的。舉例來說,tcplife 並不會像其他內核技術特性一樣去追蹤每個網絡包(packet),那樣會帶來太多的性能開銷。相反地,tcplife 只追蹤 TCP session 事件,這類事件相對來說頻率較低。這使得tcplife的負載極低,以至於我們可以在生產環境中24小時持續運行這個工具。3.
  • (在線觀看)《高效有趣學Excel,輕鬆入門到高階》【完結】(百度網盤分享下載)
    《高效有趣學Excel,輕鬆入門到高階》【完結】,此課程可以在線觀看,百度網盤分享給你1080P高清完整版!
  • 使用 eBPF 在生產環境調試 Go 應用
    迭代次數越多,近似越精確,但代價是計算周期,我們不需要了解函數背後的數學知識點,這裡我們主要是了解如何跟蹤 computeE 的調用參數。為了了解 uprobes 是如何工作的,我們來看看二進位文件內部是如何跟蹤符號的。
  • Sushiswap 背後的故事
    Overview 概述本文從各渠道的官方公開資料入手,探索 SushiSwap 事件背後的邏輯
  • 入門到高手,XMind 高效使用完全指南
    高效學習如何用 XMind 有效提高記憶力?如何用 XMind 提高自學姿勢?如何用 XMind 構建知識體系?分享五種高效做筆記的方法如何用文字清晰表達觀點?如何更高效地學習?02思維乾貨集錦XMind 的軟體操作入門容易,難的是思維方式的養成。在這個如此浮躁的商業社會中,如何保持自己獨立、清晰、全面、深入的思考,我們和大家進行了一些探討。另外,我們也整理了一些不錯的拆書筆記。關於思維類乾貨,我們分享了以下內容。
  • 走近「直播」背後的故事
    這天上午,她剛給學員講完新學期開課第一周第3堂「工程製圖基礎」直播課。在這一周「實戰」過程中,為了讓學員看明白整個畫圖過程,她只好左手拿手機錄視頻,右手切換鉛筆、圓規等不同文具在紙上邊畫邊講,然後將視頻發到微信群,讓大家看著視頻動筆操作。不停抖動地製圖視頻和時不時紙張出畫的鏡頭,透露著一絲狼狽。「好在學員都理解。」
  • Instagram視頻終極指南:故事,直播、IGTV等!
    該平臺允許您以多種格式共享視頻,包括直播(Live),故事(Stories)和電視IGTV。讓我們看看Instagram上常用的視頻內容類型之間的區別。影片故事(Stories)由於許多原因,Instagram故事在品牌和營銷人員中非常受歡迎。他們很有趣並且有利可圖。
  • eBPF介紹
    其背後的思想其實就是:與其把數據包複製到用戶空間執行用戶態程序過濾,不如把過濾程序灌進內核去。這種新的框架,其實還是很容易理解的。大概的理解就是,當我們從網卡接收到一個數據包的時候,我們數據鏈路層,將數據包額外的拷貝一份。然後這個新的數據包就交給BPF程序進行處理,這個BPF根據用戶編寫的過濾規則對這個新的數據包進行匹配。
  • 「五一特刊」《星戰7:原力覺醒》創作背後的16個有趣小故事
    《星戰7:原力覺醒》創作背後的16個有趣小故事從凱洛·倫的原型設計,到導演J.J.艾布斯展現出的賈伯斯精神
  • 直播丨EE本碩,項目不足,怎樣迅速提升,斬獲矽谷工程師Offer?【北美offer背後的故事】
    他們和你有類似的背景,他們實現了自己的北美科技職場夢;《北美Offer背後的故事》,展現平凡人不平凡的求職路——人生沒有白走的路,每一步都算數。10月20日的BitTiger北美offer故事,我們講清楚一件事,一個本科和碩士都是EE的同學,如何在項目背景不強的情況下,迅速準備、提升,最終成功斬獲矽谷後端工程師的offer。聽別人的求職經驗,做自己的求職準備,10月20日晚,BitTiger直播間,等你!
  • 利用 eBPF redirection 提升 socket 性能
    sock_key { uint32_t sip4;    // 源 IP uint32_t dip4;    // 目的 IP uint8_t  family;  // 協議類型 uint8_t  pad1;    // this padding required for 64bit alignment uint16_t pad2;    // else ebpf
  • eBPF 環境搭建
    [11]編譯運行Linux內核源碼中的BPF示例代碼[12]https://me.csdn.net/qq_34258344本文首發於深入淺出 eBPF 技術博客 https://www.ebpf.top/post/ebpf_c_env/。
  • 簡短有趣的小故事大全
    一則則生動有趣的故事,可以闡釋一條條人生哲理,比空洞的大道理更令人樂於接受,下面這些是故事亭(gushiting.com)小編為大家推薦的
  • [官方直播預告] 第32期 | 在虛幻引擎內高效創建產品實時渲染與交互 Part 1
    2021年的第一場中文直播來啦!
  • 如何高效入門 PyTorch ?
    和《數據科學入門後,該做什麼?》兩篇文章裡,已經給你詳細闡釋過了。簡單來說,別人都用來溝通和協作的東西,你一竅不通,那就沒法愉快參與協作了。深度嵌入到系統的協作能力,才是你贏得競爭的秘密武器。許多標題裡帶著「入門」字樣的 PyTorch 教材或者課程,往往會直接假設你已經掌握了面向對象編程的基礎知識,一帶而過。或者乾脆告訴你,先去學習一下 OOP ,然後再回來繼續學。