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