深入理解eBPF與可觀測性 毛文安 鄭昱笙 程書意 廖肇燕
定 價:99 元
叢書名:Linux/Unix技術叢書
當前圖書已被 4 所學校薦購過!
查看明細
- 作者:毛文安 鄭昱笙 程書意 廖肇燕
- 出版時間:2025/3/1
- ISBN:9787111774808
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP316.85
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書由龍蜥社區(qū)操作系統(tǒng)及eBPF專家聯(lián)合撰寫,帶領讀者一次性學透eBPF原理與Linux可觀測性,讓性能與安全問題無所遁形,效果立竿見影。具體來說,本書系統(tǒng)介紹eBPF技術生態(tài)、特性、五大主流開發(fā)框架,并深度剖析應用、網(wǎng)絡、內(nèi)存、I/O、調(diào)度、安全六大關鍵Linux可觀測性實踐。本書共9章,從邏輯上分為兩部分。第一部分為eBPF基礎(第1~3章):第1章概述eBPF技術的發(fā)展歷程和應用場景;第2章深入解析eBPF的指令集、輔助函數(shù)及程序類型設計原理;第3章介紹如何使用libbpf、BCC、eunomia-bpf、Coolbpf等工具開發(fā)eBPF程序,尤其是BTF和CO-RE技術的應用。第二部分為eBPF可觀測性實踐(第4~9章),第4章探討eBPF在用戶態(tài)應用層面的可觀測實踐,如Java應用的GC觀測;第5章講解內(nèi)核網(wǎng)絡收發(fā)包流程及使用eBPF分析網(wǎng)絡抖動的方法;第6章介紹內(nèi)存性能瓶頸的優(yōu)化方法,包括使用eBPF檢測內(nèi)存分配延遲和內(nèi)存泄漏;第7章分析I/O子系統(tǒng)的原理和性能瓶頸點,并介紹使用eBPF監(jiān)測I/O延遲分布和I/O卡頓問題;第8章介紹eBPF在調(diào)度系統(tǒng)上的觀測實踐,包括長時間關中斷和持續(xù)性能追蹤等;第9章則聚焦于eBPF在系統(tǒng)安全上的實踐,如使用LSM進行安全防御、監(jiān)控進程的各種行為等。
1)多位領域大佬聯(lián)袂推薦,對內(nèi)容和作者予以充分肯定,強烈推薦閱讀本書。2)龍蜥社區(qū)操作系統(tǒng)及eBPF專家聯(lián)合撰寫,長期一線經(jīng)驗總結,讓你少走彎路。3)一次性學透eBPF原理與Linux可觀測性,讓性能與安全問題無所遁形。4)系統(tǒng)介紹eBPF的技術生態(tài)、底層原理以及五大主流開發(fā)框架,并深度剖析應用、網(wǎng)絡、內(nèi)存、I/O、調(diào)度、安全六大關鍵Linux可觀測性實踐,帶你解決實踐難題。
Preface 前 言
為什么要寫這本書
在當今快速發(fā)展的技術領域,Linux內(nèi)核作為開源操作系統(tǒng)的核心,面臨著越來越多的挑戰(zhàn)。而eBPF作為Linux內(nèi)核中的一項革命性技術,為我們提供了一種全新的方式來觀察和微調(diào)系統(tǒng)的狀態(tài)與行為。隨著大模型和人工智能(AI)的迅猛發(fā)展,理解和優(yōu)化操作系統(tǒng)的性能變得尤為重要,這不僅影響著應用程序的表現(xiàn),還決定著我們?nèi)绾卫么笠?guī)模計算資源。
與此同時,隨著云原生技術和微服務應用的不斷進步,可觀測性的技術基石—日志、鏈路追蹤和監(jiān)控指標,尤其是近年來備受推崇的持續(xù)性能優(yōu)化能力,幾乎都在利用eBPF來實現(xiàn)對應用和服務的觀測。行業(yè)中涌現(xiàn)出了如Pixie、OpenTelemetry等優(yōu)秀的開源項目。在網(wǎng)絡領域,著名的Cilium項目是基于eBPF 開發(fā)的,而在安全領域,eBPF的LSM技術正在被應用于開源的安全項目(如Falco)中。eBPF技術已成為云原生社區(qū)備受矚目的技術話題之一。
盡管eBPF技術備受關注,但人們對其底層原理,特別是它與內(nèi)核的關系,理解得并不充分。市場上關于這方面的書籍非常少,特別是專門討論eBPF技術在Linux內(nèi)核各子系統(tǒng)中應用的書籍更是鳳毛麟角。為此,我們編寫了本書,內(nèi)容涵蓋eBPF的指令架構、CO-RE編程原理,并結合Linux內(nèi)核層面的應用、網(wǎng)絡、內(nèi)存、I/O、調(diào)度、安全進行原理和代碼級別的深入探討,使讀者能夠知其所以然。
本書特色
本書具有以下特色。
1.為專業(yè)開發(fā)者量身定制
本書專為從事可觀測系統(tǒng)開發(fā)、云原生應用系統(tǒng)及操作系統(tǒng)開發(fā)、網(wǎng)絡及安全領域開發(fā)工作的eBPF用戶打造。本書將深入探討eBPF的底層工作原理,詳細介紹Linux各個子系統(tǒng)的關鍵技術和數(shù)據(jù)結構。結合eBPF技術,本書將幫助你解決系統(tǒng)運維中遇到的性能瓶頸和故障定位等問題,并提供豐富的實戰(zhàn)案例。
2.滿足現(xiàn)代開發(fā)需求
許多開發(fā)者使用Java、Go等高級語言構建上層應用,但往往忽略了底層系統(tǒng)的重要性,面對CPU性能瓶頸等問題時,常常感到無從下手。本書將幫助你在開發(fā)可觀測性系統(tǒng)時,更好地定位和解決內(nèi)核層面的問題。
3.深入Linux內(nèi)核,掌握核心技術
本書不僅深入探討eBPF的指令架構和開發(fā)方式,還將結合Linux的網(wǎng)絡、I/O、內(nèi)存和調(diào)度子系統(tǒng)進行實踐。你不僅能深入了解Linux內(nèi)核的數(shù)據(jù)結構,還能通過eBPF掌握解析Linux內(nèi)核狀態(tài)和行為的方法,特別是復雜的定位和性能分析技巧。
4.結合實際案例,提升系統(tǒng)效能
在探索eBPF時,我們將不局限于技術層面的介紹,還會結合實際案例展示如何利用eBPF監(jiān)測和優(yōu)化Linux內(nèi)核的性能,進而支持系統(tǒng)的高效運作。底層系統(tǒng)的良好運作是實現(xiàn)高效業(yè)務的基礎。
讀者對象
本書的目標讀者包括應用開發(fā)者、eBPF技術愛好者及可觀測領域、操作系統(tǒng)領域的從業(yè)人員。
如何閱讀本書
雖然在介紹每個Linux子系統(tǒng)可觀測實踐之前,本書盡量概述了該子系統(tǒng)的技術原理以及eBPF程序可能用到的數(shù)據(jù)結構,但還是建議讀者在閱讀之前,先行了解操作系統(tǒng)的一些基礎概念,比如進程創(chuàng)建、虛擬文件系統(tǒng)、內(nèi)存分配和釋放、socket通信等內(nèi)容。
本書從邏輯上分為兩大部分,共9章。
第一部分為eBPF基礎(第1~3章),介紹eBPF的應用場景和發(fā)展歷程、指令架構及eBPF的編程方法。
第1章概述了eBPF技術的發(fā)展歷程,介紹了它在網(wǎng)絡、安全、故障診斷和性能分析等領域的應用場景,并闡述了eBPF的基礎架構。本章旨在讓讀者全面了解eBPF是什么、能實現(xiàn)哪些功能,以及如何將其應用到各自的學習、研究和工作中。
第2章詳細介紹了eBPF關鍵特性解析,包括eBPF指令集、輔助函數(shù)和程序類型設計原理,幫助讀者更深刻地理解和認識eBPF底層原理,特別是在Linux內(nèi)核中的具體實現(xiàn)。
第3章介紹如何使用libbpf、BCC、eunomia-bpf、Coolbpf等開源項目開發(fā)eBPF程序,特別是詳細介紹了BTF和CO-RE技術,幫助讀者進一步掌握獨立開發(fā)eBPF程序的技能。
第二部分為eBPF可觀測性實踐(第4~9章),介紹eBPF在Linux的用戶態(tài)應用、內(nèi)核網(wǎng)絡、內(nèi)存、I/O、調(diào)度及安全方面的可觀測實踐案例。
第4章介紹如何使用eBPF在用戶應用層面進行可觀測實踐,如Java應用的GC觀測,幫助讀者掌握使用eBPF分析微服務應用的性能、延遲、報文數(shù)據(jù)的方法,進一步理解eBPF的能力。
第5章介紹內(nèi)核網(wǎng)絡的收發(fā)包流程、網(wǎng)絡抖動問題分析,以及內(nèi)核網(wǎng)絡的可觀測性實踐,幫助讀者掌握使用eBPF分析網(wǎng)絡抖動的方法。
第6章主要介紹內(nèi)存性能瓶頸的優(yōu)化方法,幫助讀者掌握使用eBPF對內(nèi)存分配延遲、內(nèi)存泄漏等常見問題進行觀測的方法。
第7章介紹I/O子系統(tǒng)的原理和性能瓶頸點,幫助讀者掌握使用eBPF對I/O延遲分布、I/O卡頓等問題進行觀測的方法。
第8章介紹eBPF在調(diào)度系統(tǒng)上的觀測實踐,如長時間關中斷、持續(xù)性能追蹤等,幫助讀者掌握使用eBPF對調(diào)度延遲進行分析的方法。
第9章介紹eBPF在系統(tǒng)安全上的實踐,如使用LSM進行安全防御以及監(jiān)控進程的各種行為等。
勘誤和支持
因筆者水平有限,書中難免存在一些不足,如果讀者在閱讀過程中發(fā)現(xiàn)疏漏,或者遇到難以理解的知識點,可以發(fā)電
毛文安:阿里云高級技術專家,龍蜥社區(qū)eBPF技術探索SIG(特別興趣小組)及“酷玩BPF”公眾號負責人,龍蜥社區(qū)“eBPF技術實踐白皮書”主要作者,也是系統(tǒng)智能運維平臺SysOM以及eBPF開發(fā)功能庫Coolbpf的架構師。具有十余年Linux操作系統(tǒng)開發(fā)、維護及性能調(diào)優(yōu)經(jīng)驗,目前專注內(nèi)核網(wǎng)絡、AI等新特性的研究與實踐。
鄭昱笙:開源維護者、UCSC博士生、eunomia-bpf開源社區(qū)共同創(chuàng)辦人。主導開發(fā)了bpftime(用戶態(tài)eBPF運行時)等項目,拓展了eBPF在用戶態(tài)的應用,目前積極探索eBPF在大模型(LLM)推理優(yōu)化等領域的潛在應用。長期活躍于開源社區(qū),并多次擔任KubeCon、Linux Plumber等知名會議的演講者。
程書意:阿里云開發(fā)工程師,龍蜥社區(qū)eBPF技術探索SIG核心成員,Coolbpf項目維護者,龍蜥社區(qū)“eBPF技術實踐白皮書”作者之一。專注于內(nèi)核網(wǎng)絡優(yōu)化與eBPF技術,擅長系統(tǒng)性能調(diào)優(yōu)和故障排查,熱衷技術分享與推廣。
廖肇燕:阿里云技術專家、龍蜥社區(qū)“eBPF技術實踐白皮書”作者之一。擁有十余年Linux開發(fā)運維經(jīng)驗,專注于內(nèi)核問題深度定位與eBPF技術創(chuàng)新性應用推廣,擅長系統(tǒng)穩(wěn)定性問題定位和性能優(yōu)化。
Contents 目 錄
前言
第1章 eBPF的發(fā)展與應用1
1.1 eBPF概述1
1.1.1 Linux的跟蹤與診斷技術簡介1
1.1.2 eBPF的發(fā)展史3
1.1.3 eBPF與cBPF的功能區(qū)別4
1.1.4 eBPF與內(nèi)核模塊5
1.1.5 eBPF的優(yōu)勢與劣勢5
1.2 eBPF應用場景6
1.2.1 eBPF跟蹤與性能分析7
1.2.2 eBPF與可觀測8
1.2.3 eBPF與網(wǎng)絡14
1.2.4 eBPF與安全14
1.3 eBPF基礎架構16
1.3.1 eBPF加載流程和相關組件17
1.3.2 eBPF的JIT編譯原理18
1.3.3 eBPF的掛載與執(zhí)行22
1.4 本章小結22
第2章 eBPF的特性解析23
2.1 eBPF指令架構23
2.1.1 cBPF指令集24
2.1.2 eBPF指令集25
2.1.3 使用C語言編寫eBPF程序34
2.1.4 使用匯編語言編寫eBPF程序35
2.1.5 使用字節(jié)碼編寫eBPF程序37
2.2 eBPF系統(tǒng)調(diào)用40
2.2.1 eBPF系統(tǒng)調(diào)用的函數(shù)原型40
2.2.2 eBPF系統(tǒng)調(diào)用的類型40
2.2.3 eBPF系統(tǒng)調(diào)用的數(shù)據(jù)
結構解析41
2.3 eBPF輔助函數(shù)43
2.3.1 eBPF輔助函數(shù)的設計43
2.3.2 eBPF輔助函數(shù)的實現(xiàn)47
2.4 eBPF程序類型設計49
2.4.1 eBPF程序類型49
2.4.2 驗證器接口設計51
2.4.3 測試接口設計52
2.4.4 卸載接口設計53
2.5 跟蹤診斷類eBPF程序54
2.5.1 kprobe/kretprobe類程序55
2.5.2 uprobe/uretprobe類程序58
2.5.3 tracepoint類程序60
2.5.4 perf事件類程序63
2.6 網(wǎng)絡處理類:XDP程序66
2.6.1 XDP基本原理67
2.6.2 XDP應用場景68
2.6.3 XDP內(nèi)核解析69
2.7 本章小結73
第3章 eBPF開發(fā)框架74
3.1 libbpf74
3.1.1 使用libbpf開發(fā)eBPF程序75
3.1.2 BPF類型格式79
3.1.3 CO-RE功能82
3.2 BCC85
3.2.1 環(huán)境配置86
3.2.2 使用BCC開發(fā)eBPF程序88
3.2.3 編譯運行90
3.3 bpftrace90
3.3.1 環(huán)境配置91
3.3.2 使用bpftrace開發(fā)eBPF程序92
3.3.3 編譯運行95
3.4 eunomia-bpf96
3.4.1 環(huán)境配置97
3.4.2 使用eunomia-bpf?開發(fā)
eBPF程序98
3.4.3 編譯運行100
3.5 Coolbpf?100
3.5.1 環(huán)境配置102
3.5.2 使用Coolbpf開發(fā)eBPF
程序102
3.5.3 編譯運行103
3.6 eBPF開發(fā)框架對比104
3.7 本章小結105
第4章 基于eBPF的應用
可觀測實踐106
4.1 使用uprobe/USDT觀測應用程序106
4.1.1 uprobe:用戶空間的動態(tài)
追蹤工具106
4.1.2 USDT:用戶空間的靜態(tài)
追蹤點技術108
4.2 Nginx函數(shù)延遲觀測與性能分析109
4.2.1 基于eBPF分析函數(shù)延遲110
4.2.2 Nginx中與性能相關的
關鍵函數(shù)113
4.2.3 測試Nginx的函數(shù)延遲115
4.3 Java應用的GC觀測116
4.3.1 GC策略簡介與問題
排查示例116
4.3.2 通過eBPF實現(xiàn)GC觀測117
4.4 MySQL慢查詢監(jiān)測與排障實踐123
4.4.1 慢查詢的常見原因124
4.4.2 慢查詢監(jiān)測方法與示例場景124
4.4.3 利用bpftrace程序追蹤
MySQL查詢126
4.5 觀測SSL/TLS明文數(shù)據(jù)128
4.5.1 TLS的工作原理128
4.5.2 OpenSSL API工作機制分析129
4.5.3 sslsniff的eBPF內(nèi)核
代碼編寫130
4.5.4 sslsniff的用戶態(tài)代碼分析135
4.5.5 編譯與運行sslsniff工具138
4.6 使用eBPF跟蹤Go協(xié)程狀態(tài)139
4.6.1 跟蹤Go協(xié)程狀態(tài)的eBPF
內(nèi)核代碼140
4.6.2 運行eBPF程序追蹤Go
協(xié)程狀態(tài)141
4.7 本章小結142
第5章 基于eBPF的網(wǎng)絡
可觀測實踐143
5.1 內(nèi)核網(wǎng)絡協(xié)議棧143
5.1.1 網(wǎng)絡發(fā)包流程143
5.1.2 網(wǎng)絡收包流程159
5.1.3 內(nèi)核網(wǎng)絡抖動問題分析168
5.2 網(wǎng)絡可觀測實踐172
5.2.1 HTTP流量統(tǒng)計172
5.2.2 TCP連接信息和往返
時間分析179
5.2.3 XDP實現(xiàn)可編程包處理187
5.2.4 基于eBPF的流量控制實踐189
5.2.5 基于sockmap進行數(shù)據(jù)轉發(fā)192
5.2.6 基于sockops監(jiān)測服務
響應延遲205
5.2.7 Virtio網(wǎng)卡隊列可觀測213
5.3 本章小結218
第6章 基于eBPF的內(nèi)存
可觀測實踐219
6.1 系統(tǒng)內(nèi)存的申請流程219
6.2 內(nèi)存性能瓶頸點與解決思路222
6.2.1 常見的內(nèi)存性能瓶頸222
6.2.2 內(nèi)存性能瓶頸診斷方法225
6.3 實戰(zhàn):頁面錯誤監(jiān)控227
6.3.1 什么是頁面錯誤227
6.3.2 有關頁面錯誤的跟蹤點228
6.3.3 頁面錯誤事件可觀測
實現(xiàn)方案229
6.4 實戰(zhàn):使用cachetop分析
文件緩存233
6.4.1 使用常規(guī)方法分析文件緩存233
6.4.2 cachetop實現(xiàn)原理234
6.4.3 c