亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Linux在日常的使用中已經(jīng)無處不在了,從人們的手機,到電視機,再到路由器,都運行在linux內(nèi)核之上,而eBPF就是Linux內(nèi)核的一把瑞士軍刀,通過eBPF可以在linux內(nèi)核中運行程序,運維人員可以使用它對linux內(nèi)核進行監(jiān)控,開發(fā)者可以使用它對linux內(nèi)核功能進行定制修改,做到很多以前無法實現(xiàn)的功能。

官方的說法: eBPF is a revolutionary technology with origins in the Linux kernel that can run sandboxed programs in an operating system kernel.

個人認(rèn)為,簡單的說,eBPF可以理解為一個框架,通過這個框架,我們可以在內(nèi)核中執(zhí)行自己編寫的程序代碼。

eBPF基本概念

eBPF的前身是BPF(extended Berkeley Packet Filter),BPF是內(nèi)核中用來做高效過濾網(wǎng)絡(luò)報文的,tcpdump里面就是用的BPF技術(shù)過濾報文。2014年內(nèi)核3.18中eBPF第一次出現(xiàn),此時的eBPF已經(jīng)成為內(nèi)核的頂級子系統(tǒng),演進為一個通用執(zhí)行引擎,允許用戶在內(nèi)核中運行自己的程序。

掛載點(Hook)eBPF程序基于事件觸發(fā),當(dāng)內(nèi)核代碼走到對應(yīng)的掛載點就會執(zhí)行掛載在此處的eBPF程序。常見的掛載點有:系統(tǒng)調(diào)用,內(nèi)核函數(shù)進入/退出,內(nèi)核跟蹤點,網(wǎng)絡(luò)數(shù)據(jù)包等等。

映射(Maps)eBPF程序中用來存儲數(shù)據(jù),共享數(shù)據(jù)的結(jié)構(gòu)體就是Maps,內(nèi)核內(nèi)置了多種類型的Maps給開發(fā)者使用,常見的有哈希表,數(shù)組,LRU,Ring buffer等等。

幫助函數(shù)(Helper Calls)內(nèi)核為了保證安全,運行在內(nèi)核中的eBPF程序只能調(diào)用當(dāng)前內(nèi)核版本預(yù)定義好的函數(shù),不能隨意調(diào)用其他內(nèi)核函數(shù),函數(shù)名稱都是以bpf_開頭命名。例如u32 bpf_get_smp_processor_id(void),可以獲取當(dāng)前eBPF程序運行在哪個cpu上。

加載與驗證(Loader & Verification)編寫好的eBPF程序需要先通過編譯,生成字節(jié)碼,之后通過調(diào)用bpf系統(tǒng)調(diào)用將字節(jié)碼加載到內(nèi)核,此時內(nèi)核會運行自己的驗證器來檢驗eBPF程序,確保程序是安全的,有限循環(huán)的,不會把linux系統(tǒng)搞壞。

eBPF特點

強大的內(nèi)核可編程性。隨著內(nèi)核版本的升級,內(nèi)核中可以運行eBPF程序的地方越來越多,eBPF可以做的事情也越來越多。不同內(nèi)核功能加入eBPF版本列表:

XDP(快速數(shù)據(jù)路徑)

Kernel 4.8

LIRC(紅外)

Kernel 4.18

限制100萬條指令

Kernel 5.2

Socket lookup(控制數(shù)據(jù)包入socket)

Kernel 5.9

開發(fā)方便開發(fā)者不需要自己定義數(shù)據(jù)結(jié)構(gòu),直接使用現(xiàn)成的Maps進行存儲共享數(shù)據(jù),只需要關(guān)注具體的業(yè)務(wù)實現(xiàn)代碼。由于eBPF程序先編譯成字節(jié)碼,之后內(nèi)核自己校驗通過之后再生成可用的內(nèi)核代碼,所以可以一次編譯處處運行,不需要像內(nèi)核模塊一樣,每次更新內(nèi)核之后都要重新編譯。

可以在x86上編譯mips架構(gòu)上運行的eBPF字節(jié)碼。免去交叉編譯的痛苦。

安全數(shù)據(jù)操作都是通過Maps,操作Maps的函數(shù)也是預(yù)先定義好的,不存在訪問空指針。

eBPF使用

介紹了這么多eBPF的概念,接下來實際操作一下,看看eBPF程序如何編譯和使用,這里采用原汁原味的linux源代碼編譯演示。

使用最新的archlinux系統(tǒng),其他系統(tǒng)也差不多,稍微按照實際情況改一下。

# asp checkout linux# 準(zhǔn)備linux內(nèi)核源碼

# makepkg -o -d –skippgpcheck# 下載linux源代碼

# make mrproper

# zcat /proc/config.gz >.config

# make headers_install

# make modules_prepare

# make VMLINUX_BTF=/sys/kernel/btf/vmlinux M=samples/bpf

# asp checkout linux# 準(zhǔn)備linux內(nèi)核源碼

# makepkg -o -d –skippgpcheck# 下載linux源代碼

# make mrproper

# zcat /proc/config.gz >.config

# make headers_install

# make modules_prepare

# make VMLINUX_BTF=/sys/kernel/btf/vmlinux M=samples/bpf

這里把內(nèi)核自帶的bpf示例程序都編譯出來了,在目錄samples/bpf下面。

這里我們具體看一個sampleip的eBPF程序,看看eBPF程序是如何編寫的

直接上代碼:

首先17到23行定義了一個maps,叫ip_map,類型是哈希,鍵是u64,值是u32,最大長度8192。

之后定義了一個do_sample函數(shù),函數(shù)參數(shù)類型是bpf_perf_event_data,里面有當(dāng)前內(nèi)核IP指令指針寄存器的內(nèi)容。通過調(diào)用bpf_map_lookup_elem函數(shù)來更新ip_map。

運行內(nèi)核編譯好的sampleip程序,默認(rèn)是采樣5秒,每秒采樣99次,程序結(jié)束后會把ip_map采集到的信息打印出來。

從這個實例中可以看出,開發(fā)的eBPF程序比傳統(tǒng)的內(nèi)核開發(fā)方便了很多,數(shù)據(jù)結(jié)構(gòu)不用操心,可以調(diào)用的函數(shù)也不用操心,都是預(yù)先定義好的,只需要實現(xiàn)自己的業(yè)務(wù)邏輯即可。

eBPF使用場景

linux性能分析,性能調(diào)優(yōu)上面的sampleip就是簡單的內(nèi)核性能分析,可以看出當(dāng)前內(nèi)核經(jīng)常調(diào)用的函數(shù)。eBPF對于內(nèi)核開銷很小,可以在生產(chǎn)環(huán)境排查問題的時候進行精確定位,同時由于eBPF的安全性,不用擔(dān)心會把內(nèi)核搞掛。有興趣的可以去看一下bcc,里面對于內(nèi)核每個子系統(tǒng)都有對應(yīng)的eBPF監(jiān)控程序,非常方便。

linux網(wǎng)絡(luò)加速eBPF在這個領(lǐng)域中也是牛的很,底層有XDP快速數(shù)據(jù)路徑,可以直接在網(wǎng)卡收到數(shù)據(jù)包的同時進行處理,避免內(nèi)核分配skb開銷,可以用來實現(xiàn)DDos,負(fù)載均衡,性能媲美DPDK。再往上一點內(nèi)核的tc也可以hook eBPF程序?qū)崿F(xiàn)自定義流量分類,再向上的socket層還可以調(diào)用eBPF實現(xiàn)動態(tài)修改socket選項,甚至tcp的擁塞算法內(nèi)核也提供了eBPF掛載的地方,可以自己實現(xiàn)一套新的擁塞算法。

安全管理systemd中使用eBPF控制服務(wù)可以監(jiān)聽的端口,libvirtd也使用eBPF進行設(shè)備的訪問控制,社區(qū)還有eBPF控制進程允許訪問的文件,允許讀寫哪些/sys文件。

eBPF的出現(xiàn)讓Linux內(nèi)核開發(fā)變得簡單,降低了內(nèi)核開發(fā)門檻,為普通人了解深入linux內(nèi)核提供了途徑,真的是一個革命性的發(fā)明,有l(wèi)inux的地方就有ebpf ^^。

分享到:
標(biāo)簽:介紹 華云 eBPF
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定