【前言】
2015年,David是Docker公司(一家讓容器技術(shù)變得流行的公司)的一名核心開發(fā)工程師。他的日常工作包括兩部分:維護Docker社區(qū)和促進Docker項目發(fā)展。他既需要審查貢獻者提交的PR,也需要確保Docker可以在各種場景下穩(wěn)定高效地工作,特別是在成千上萬容器運行的高負載場景下。
當時,我們采用火焰圖來分析Docker相關(guān)的性能問題;鹧鎴D提供的高級可視化功能,可以讓我們非常方便地瀏覽分析的數(shù)據(jù)。Go語言通過內(nèi)嵌的HTTP服務(wù)可以非常容易地提取到應(yīng)用的性能數(shù)據(jù),并能夠基于性能數(shù)據(jù)產(chǎn)生數(shù)據(jù)圖表。David曾寫過一篇文章,講述Go語言的性能分析器,并描述如何基于數(shù)據(jù)生成火焰圖。但是,使用Go語言性能分析器來收集Docker的性能數(shù)據(jù)也存在著一些問題,因為性能分析器的功能默認是關(guān)閉的。所以,如果要開啟性能調(diào)試,我們必須要重啟Docker服務(wù),這可能導(dǎo)致失去運行時的性能數(shù)據(jù),迫使我們花費時間等待問題再次重現(xiàn)。David的文章中提到了重啟Docker是診斷Docker性能問題的必要步驟。但是,最好的方式應(yīng)該是不重啟服務(wù)就能達到分析性能問題的目的。這驅(qū)使David開始研究收集和分析程序性能指標的各種技術(shù),不久他就發(fā)現(xiàn)了BPF。
與此同時,與David相距甚遠的Lorenzo,也在尋求一種更好地研究Linux內(nèi)核內(nèi)部機制的方式,他發(fā)現(xiàn)學(xué)習BPF可以更容易地了解更多的內(nèi)核子系統(tǒng)。幾年后,他已經(jīng)在InfluxData的工作中應(yīng)用了BPF技術(shù),以更快地在InfluxCloud中提取數(shù)據(jù)。如今Lorenzo不僅活躍于BPF社區(qū),他還就職于Sysdig公司,從事Falco項目中IOVisor工具的開發(fā)—IOVisor使用BPF來保證容器和Linux系統(tǒng)的運行時安全。
在過去的幾年時間內(nèi),我們已經(jīng)嘗試在更多的場景中使用BPF,包括收集Kubernetes集群數(shù)據(jù)、管理網(wǎng)絡(luò)流量策略。通過閱讀BPF領(lǐng)導(dǎo)者Brendan Gregg、Alexei Starovoitov,以及Clilium和Facebook公司的諸多技術(shù)博客,我們學(xué)習了BPF技術(shù)的底層原理。他們的博客和文章給予了我們極大的幫助,同時也是本書諸多引用的來源。
每次學(xué)習BPF技術(shù)時,我們都需要翻閱博客文章、手冊以及Internet上的各種資料。本書的目的就是將分散在各處的知識匯總在一起,以便于BPF愛好者能更好地學(xué)習這一神奇技術(shù)。
本書分為9章演示如何使用BPF完成相關(guān)任務(wù)。你可以單獨閱讀一些章節(jié)作為參考指南,但是如果你是BPF的新手,我們建議你按順序閱讀。這樣你可以了解BPF的核心概念,并逐步了解BPF在未來可能發(fā)揮的作用。
無論你是可觀測性和性能分析方面的專家,還是正嘗試開始研究新技術(shù)來解決生產(chǎn)系統(tǒng)問題的新手,我們都希望你能從本書中受益。
【提供示例代碼下載】
可以從https://oreil.ly/lbpf-repo下載補充材料(示例代碼、練習等)。
【譯者序】
學(xué)習的心與勇氣的贊歌
2019年10月,當我聽到這本書的英文版即將面世時,第一時間就意識到這將是BPF方面的第一本書。我從事容器和Kubernetes領(lǐng)域的工作與研究多年,看到這本書中介紹的BPF理論知識和技術(shù)時非常興奮,我意識到終于有機會可以全面地了解和學(xué)習BPF專業(yè)知識了。我立刻開始著手翻譯這本書,并找到狄衛(wèi)華老師,邀請他一起翻譯,以此跟大家分享BPF專業(yè)知識和技術(shù)。
天才計算機大師Alan Kay曾說過:“在計算機世界中,每一次突飛猛進都是因為軟件產(chǎn)品允許用戶進行各種編程!庇械娜苏f:“軟件正在占據(jù)世界!弊鳛長inux內(nèi)核可觀測性技術(shù),BPF有一種神奇的能力,可以幫助我們在不了解軟件內(nèi)部邏輯的情況下快速定位程序的問題。BPF正在占據(jù)軟件世界。
提到BPF,你可能比較生疏,但是說起tcpdump、wireshark這些流行的網(wǎng)絡(luò)抓包和分析工具,你一定聽說過并且很可能使用過,這些技術(shù)的底層的數(shù)據(jù)包過濾用的就是BPF。最初BPF程序等同于數(shù)據(jù)包過濾。之后,BPF以瘋狂的速度發(fā)展。近年來已經(jīng)成長為一個高度靈活且功能豐富的框架,它能夠在不犧牲系統(tǒng)性能和安全性的前提下,允許用戶編寫B(tài)PF程序?qū)?nèi)核事件進行觀測。BPF比重新編譯內(nèi)核模塊更容易、更安全。從網(wǎng)絡(luò)方面而言,基于eBPF技術(shù)實現(xiàn)的XDP技術(shù),在網(wǎng)絡(luò)包還未進入網(wǎng)絡(luò)協(xié)議棧之前就對其進行處理,提供了高性能、可編程的網(wǎng)絡(luò)數(shù)據(jù)路徑,給Linux網(wǎng)絡(luò)帶來了巨大的性能提升。BPF強大的靈活性、穩(wěn)定性和豐富的功能,使得谷歌、Facebook和Netflix等前瞻性大企業(yè)紛紛對它伸出橄欖枝,它們紛紛利用BPF來實現(xiàn)網(wǎng)絡(luò)安全、負載均衡、性能監(jiān)控、故障排查等大量應(yīng)用。同時,基于BPF的Cilium在容器領(lǐng)域也鋒芒初現(xiàn),提供了強大而高效的網(wǎng)絡(luò)、穩(wěn)定的安全性,以及3~7層的負載均衡。
本書涵蓋BPF技術(shù)的各個方面,包括BPF架構(gòu)、BPF映射,使用BCC編寫B(tài)PF程序?qū)崿F(xiàn)Linux可觀測性,以及XDP、網(wǎng)絡(luò)、安全等方面的體系化與結(jié)構(gòu)化的介紹。作為BPF技術(shù)的愛好者, 我們希望通過翻譯本書,能將這種體系和理念分享給更多的人,期待與大家更深入地探討與交流。
很榮幸這次能跟狄衛(wèi)華老師合作完成本書的翻譯,感謝在翻譯過程中他對我的各種幫助。同時,感謝倪朋飛老師耐心地幫我們進行技術(shù)審查和指導(dǎo),感謝KS2微信群和Kubernetes社區(qū)的朋友對我們的各種幫助。最后,感謝我的家人,是他們的支持和耐心陪伴讓我踏踏實實地利用業(yè)余時間完成了這件事。對我而言,這是我人生中做得最有意義的事情之一。
(范彬)
【序言】
作為一名程序員,我喜歡緊跟內(nèi)核和計算研究方面的各種最新技術(shù)。當?shù)谝淮谓佑|到BPF和XDP(eXpress Data Path)技術(shù)時,我就被深深地吸引了。我非常高興本書聚焦于BPF和XDP技術(shù),讓更多的人在項目中使用如此優(yōu)秀的技術(shù)。
首先聊聊我的背景以及我為什么如此喜歡研究內(nèi)核。我曾與David一起擔任Docker核心維護人員,主要負責使用iptables為容器提供過濾和路由邏輯。我提交的第一個PR就是修復(fù)CentOS上不同版本iptables命令行參數(shù)不兼容而執(zhí)行失敗的問題。如果你和我一樣,經(jīng)常開發(fā)和使用命令行工具,那么你也一定會遇到過很多諸如此類的問題。除此之外,在主機上構(gòu)建成千上萬的規(guī)則也會讓iptables不堪重負,我需要解決由此導(dǎo)致的系統(tǒng)性能問題。
當我接觸BPF和XDP工具后,簡直如獲珍寶。我不再苦惱于使用iptables遇到的類似問題。另外,我非常高興地獲悉內(nèi)核社區(qū)甚至計劃使用BPF(https://oreil.ly/cuqTy)替代iptables,同時,容器網(wǎng)絡(luò)工具Cilium(https://cilium.io)也正在采用BPF和XDP進行構(gòu)建。
除了可以實現(xiàn)更加優(yōu)秀的iptables的功能外,BPF還可以實現(xiàn)更多的功能,比如,幫助我們跟蹤系統(tǒng)調(diào)用、內(nèi)核函數(shù)和用戶態(tài)的程序。Linux系統(tǒng)上的bpftrace(https://github.com/iovisor/bpftrace)命令行工具實現(xiàn)了類似于DTrace的強大的功能。bpftrace可以跟蹤所有正在打開的文件句柄、打開文件的進程,統(tǒng)計程序的系統(tǒng)調(diào)用,跟蹤OOM killer,等等,一切盡在掌握之中。BPF和XDP也被用在Cloudflare(https://oreil.ly/OZdmj)和Facebook的負載均衡器(https://oreil.ly/wrM5-)上,用于防御DDoS攻擊。XDP在網(wǎng)絡(luò)過濾數(shù)據(jù)包方面表現(xiàn)得相當出色,在本書的XDP和網(wǎng)絡(luò)部分可以了解到更多的信息。
我有幸在Kubernetes社區(qū)認識了Lorenzo,他開發(fā)的kubectl-trace(https://oreil.ly/Ot7kq)工具可以讓用戶在Kubernetes集群上輕松地運行定制化的跟蹤程序。
就個人而言,我也非常喜歡使用BPF編寫定制化的跟蹤器,向同事證明他們編寫的軟件需要進行性能優(yōu)化,或要求他們減少昂貴的系統(tǒng)調(diào)用次數(shù)以提升程序性能。不要低估通過數(shù)據(jù)協(xié)助別人進行系統(tǒng)調(diào)優(yōu)的威力。不要擔心,本書將會指導(dǎo)你編寫第一個跟蹤程序,并幫助你進行系統(tǒng)性能優(yōu)化。BPF之前的工具都是通過使用有損隊列,將樣本集發(fā)送到用戶空間進行聚合,而BPF則可以在內(nèi)核空間直接基于事件源構(gòu)建直方圖和過濾,這種機制非常適用于生產(chǎn)環(huán)境。
我職業(yè)生涯的一半時間都在從事工具開發(fā)。最好的工具是提供自治,開發(fā)者可以使用工具提供的接口進行自治,工具的使用場景甚至可能超出工具開發(fā)者的設(shè)計想法。引用Richard Feynman的話:“我很早就意識到知道事情名字和知道事情本身的區(qū)別!钡浆F(xiàn)在為止,我們應(yīng)該已經(jīng)知道了BPF的名字,并了解了BPF能給我們帶來幫助。
我喜歡這本書是因為它介紹了使用BPF創(chuàng)建新工具所需掌握的知識。閱讀本書并完成練習后,你將擁有使用BPF的超級能力。你可以將BPF放置在工具箱中,在最需要時讓其發(fā)揮作用。通過本書,你不僅能了解到BPF技術(shù),而且也能學(xué)習到BPF的工作原理。本書可以幫你打開思路來探索使用BPF進行各種實踐的途徑。
這個欣欣向榮的生態(tài)系統(tǒng)非常令人興奮!我希望越來越多的人開始使用BPF,并將BPF的力量變得更加強大。我很樂意了解本書的讀者最終會采用BPF構(gòu)建什么,無論是用來跟蹤軟件錯誤、自定義防火墻還是編寫紅外解碼(https://lwn.net/Articles/759188)的腳本。請讓我們知道你如何使用BPF進行構(gòu)建!
—Jessie Frazelle
【作者簡介】
★大衛(wèi)·卡拉維拉(David Calavera)
是Netlify的CTO,曾是Docker的維護者以及Runc、Go和BCC工具及其他開源項目的貢獻者。他構(gòu)建和促進了Docker插件生態(tài)系統(tǒng),因Docker項目的工作而聞名。David非常喜歡使用火焰圖和進行性能優(yōu)化。
★洛倫佐·豐塔納(Lorenzo Fontana)
是Sysdig開源團隊的成員,主要負責CNCF(云本地計算基礎(chǔ))的Falco項目,該項目通過內(nèi)核模塊和eBPF實現(xiàn)了容器運行時安全和異常檢測功能。他對分布式系統(tǒng)、軟件定義網(wǎng)絡(luò)、Linux內(nèi)核和性能分析充滿熱情。
【譯者簡介】
★范彬
在容器技術(shù)領(lǐng)域工作多年,潛心研究,對Docker、Kubernetes技術(shù)有豐富的實踐經(jīng)驗,一直保持熱情和努力去研究新的內(nèi)核和網(wǎng)絡(luò)等方面的技術(shù),F(xiàn)任中國電信天翼云容器組組長,帶領(lǐng)團隊研發(fā)了具有100%自主知識產(chǎn)權(quán)的天翼云容器引擎平臺,并在金融等多個行業(yè)得到成功應(yīng)用。
★狄衛(wèi)華
趣頭條資深架構(gòu)師,擁有近 15 年的軟件研發(fā)和架構(gòu)經(jīng)驗,專注于高并發(fā)、微服務(wù)架構(gòu)和云原生技術(shù),具有豐富的大型軟件架構(gòu)設(shè)計和實施落地經(jīng)驗;熟悉Linux內(nèi)核技術(shù)和網(wǎng)絡(luò)、擅長性能調(diào)優(yōu)和問題排查定位;熟悉 Kubernetes 和 Docker 技術(shù),有豐富的容器化實踐經(jīng)驗。