0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

動(dòng)態(tài)追蹤技術(shù)分類及其使用方法

CHANBAEK ? 來(lái)源:話說(shuō)Linux ? 作者:話說(shuō)Linux ? 2023-01-19 16:35 ? 次閱讀

文章介紹幾種常用的內(nèi)核動(dòng)態(tài)追蹤技術(shù),對(duì) ftrace、perf 及 eBPF 的使用方法進(jìn)行案例說(shuō)明。

1.什么是動(dòng)態(tài)追蹤

動(dòng)態(tài)追蹤技術(shù),是通過(guò)探針機(jī)制來(lái)采集內(nèi)核或者應(yīng)用程序的運(yùn)行信息,從而可以不用修改內(nèi)核或應(yīng)用程序的代碼,就獲得調(diào)試信息,對(duì)問(wèn)題進(jìn)行分析、定位。

通常在排查和調(diào)試異常問(wèn)題時(shí),我們首先想到的是使用 GDB 在程序運(yùn)行路徑上設(shè)置斷點(diǎn),然后結(jié)合命令進(jìn)行分析定位; 或者,在程序源碼中增加一系列的日志,從日志輸出中尋找線索。 不過(guò),斷點(diǎn)往往會(huì)中斷程序的正常運(yùn)行; 而增加新的日志,往往需要重新編譯和部署。 在面對(duì)偶現(xiàn)問(wèn)題以及對(duì)時(shí)延要求嚴(yán)格的場(chǎng)景下,GDB 和增加日志的方式就不能滿足需求了。

動(dòng)態(tài)追蹤為這些問(wèn)題提供了完美的方案:它既不需要停止服務(wù),也不需要修改程序的代碼; 程序還按照原來(lái)的方式正常運(yùn)行時(shí),就可以分析出問(wèn)題的根源。 同時(shí),相比以往的進(jìn)程級(jí)跟蹤方法(比如 ptrace),動(dòng)態(tài)追蹤往往只會(huì)帶來(lái)很小的性能損耗。

2.動(dòng)態(tài)追蹤技術(shù)分類

動(dòng)態(tài)追蹤的工具很多,systemtap、perf、ftrace、sysdig、eBPF 等。 動(dòng)態(tài)追蹤的事件源根據(jù)事件類型不同,主要分為三類:靜態(tài)探針, 動(dòng)態(tài)探針以及硬件事件。

  • 硬件事件:通常由性能監(jiān)控計(jì)數(shù)器 PMC(Performance Monitoring Counter)產(chǎn)生,包括了各類硬件的性能情況,比如 CPU 的緩存、指令周期、分支預(yù)測(cè)等。
  • 靜態(tài)探針:事先在代碼中定義好,并編譯到應(yīng)用程序或者內(nèi)核中的探針。 這些探針只有在開啟探測(cè)功能時(shí),才會(huì)被執(zhí)行到; 未開啟時(shí)并不會(huì)執(zhí)行。 常見(jiàn)的靜態(tài)探針包括內(nèi)核中的跟蹤點(diǎn)(tracepoints)和 USDT(Userland Statically Defined Tracing)探針。
  • 動(dòng)態(tài)探針:沒(méi)有事先在代碼中定義,但卻可以在運(yùn)行時(shí)動(dòng)態(tài)添加的探針,比如函數(shù)的調(diào)用和返回等。 動(dòng)態(tài)探針支持按需在內(nèi)核或者應(yīng)用程序中添加探測(cè)點(diǎn),具有更高的靈活性。 常見(jiàn)的動(dòng)態(tài)探針有兩種,即用于內(nèi)核態(tài)的 kprobes 和用于用戶態(tài)的 uprobes。 需要注意的是 kprobes 需要內(nèi)核編譯時(shí)開啟 CONFIG_KPROBE_EVENTS,uprobes 則需要內(nèi)核編譯時(shí)開啟 CONFIG_UPROBE_EVENTS。

3動(dòng)態(tài)追蹤之ftrace

ftrace 最早用于函數(shù)跟蹤,后來(lái)擴(kuò)展支持了各種事件跟蹤功能。 ftrace 通過(guò) debugfs 以普通文件的形式,向用戶空間提供訪問(wèn)接口,這樣不需要額外的工具,就可以通過(guò)掛載點(diǎn)(通常為 /sys/kernel/debug/tracing 目錄)的文件讀寫,來(lái)跟 ftrace 交互,跟蹤內(nèi)核或者應(yīng)用程序的運(yùn)行事件。

在使用 ftrace 之前,首先要確定當(dāng)前系統(tǒng)是否已經(jīng)掛載了 debugfs,可以使用如下方式進(jìn)行確認(rèn)。

#方式一:查看掛載信息
mount | grep debugfs
#方式二:查看掛載點(diǎn)
ls /sys/kernel/debug/tracing

如果在上面的查找結(jié)果中有輸出,說(shuō)明當(dāng)前系統(tǒng)已經(jīng)掛載了 debugfs,如果系統(tǒng)未掛載 debugfs,則使用如下的命令進(jìn)行掛載。

mount -t debugfs nodev /sys/kernel/debug

在 /sys/kernel/debug/tracing 目錄下提供了各種跟蹤器(tracer)和事件(event),一些常用的選項(xiàng)如下。

  • available_tracers:當(dāng)前系統(tǒng)支持的跟蹤器;
  • available_events:當(dāng)前系統(tǒng)支持的事件;
  • current_tracer:當(dāng)前正在使用的跟蹤器; 默認(rèn)為 nop,表示不做任何跟蹤操作,使用 echo 命令把跟蹤器的名字寫入該文件,即可切換到不同的跟蹤器;
  • trace:當(dāng)前的跟蹤信息;
  • tracing_on:用于開始或暫停跟蹤;
  • trace_options:設(shè)置 ftrace 的一些相關(guān)選項(xiàng);

ftrace 提供了多個(gè)跟蹤器,用于跟蹤不同類型的信息,比如函數(shù)調(diào)用、中斷關(guān)閉、進(jìn)程調(diào)度等。 具體支持的跟蹤器取決于系統(tǒng)配置,使用如下的命令來(lái)查詢當(dāng)前系統(tǒng)支持的跟蹤器。

root@ubuntu:/sys/kernel/debug/tracing# cat available_tracers 
hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop

以上是系統(tǒng)支持的所有跟蹤器,function 表示跟蹤函數(shù)的執(zhí)行,function_graph 則是跟蹤函數(shù)的調(diào)用關(guān)系,也就是生成直觀的調(diào)用關(guān)系圖,這是最常用的兩種跟蹤器。 也可以通過(guò)配置內(nèi)核,使系統(tǒng)支持更多類型的跟蹤器。

在使用跟蹤器前,需要確定好跟蹤目標(biāo),包括內(nèi)核函數(shù)和事件,函數(shù)是指內(nèi)核中的函數(shù)名,事件是指內(nèi)核中預(yù)先定義的跟蹤點(diǎn)。 可以使用如下方式查看內(nèi)核支持跟蹤的函數(shù)和事件。

#查看內(nèi)核支持追蹤的函數(shù)
cat available_filter_functions
#查看內(nèi)核支持追蹤的事件
cat available_events

接下來(lái)以一個(gè)簡(jiǎn)單的示例說(shuō)明 ftrace 的基本用法,比如我們需要跟蹤 open 的系統(tǒng)調(diào)用,open 在內(nèi)核中的實(shí)現(xiàn)接口為 do_sys_open,所以需要將跟蹤的函數(shù)設(shè)置為 do_sys_open,以下是跟蹤過(guò)程的步驟。

#設(shè)置函數(shù)跟蹤點(diǎn)為 do_sys_open
echo do_sys_open > set_graph_function
#設(shè)置當(dāng)前跟蹤器為 function_graph
echo function_graph > current_tracer
#配置 trace 屬性:顯示當(dāng)前的進(jìn)程
echo funcgraph-proc > trace_options
#清除 trace 緩存
echo  > trace
#開啟跟蹤
echo 1 > tracing_on
#產(chǎn)生 do_sys_open 調(diào)用
ls
#關(guān)閉跟蹤
echo 0 > tracing_on

在關(guān)閉跟蹤后,使用 cat 命令查看跟蹤結(jié)果,如下所示,在 trace 文件中保存了跟蹤到的信息,第一列表示接口執(zhí)行的 CPU,第二列表示任務(wù)名稱和進(jìn)程 PID,第三列是函數(shù)執(zhí)行延遲,最后一列是函數(shù)調(diào)用關(guān)系圖。

root@ubuntu:/sys/kernel/debug/tracing# cat trace
# tracer: function_graph
#
# CPU  TASK/PID         DURATION      FUNCTION CALLS
# |     |    |           |   |        |   |   |   |
 2)    ls-46073    |               |  do_sys_open() {
 2)    ls-46073    |               |    getname() {
 2)    ls-46073    |               |      getname_flags() {
 2)    ls-46073    |               |        kmem_cache_alloc() {
 2)    ls-46073    |               |          _cond_resched() {
 2)    ls-46073    |   0.119 us    |            rcu_all_qs();
 2)    ls-46073    |   0.416 us    |          }
 2)    ls-46073    |   0.095 us    |          should_failslab();
 2)    ls-46073    |   0.112 us    |          memcg_kmem_put_cache();
 2)    ls-46073    |   1.041 us    |        }
 2)    ls-46073    |               |        __check_object_size() {
 2)    ls-46073    |   0.097 us    |          check_stack_object();
 2)    ls-46073    |   0.100 us    |          __virt_addr_valid();
 2)    ls-46073    |   0.097 us    |          __check_heap_object();
 2)    ls-46073    |   0.662 us    |        }
 2)    ls-46073    |   2.109 us    |      }
 2)    ls-46073    |   2.414 us    |    }

ftrace 的輸出通過(guò)不同級(jí)別的縮進(jìn),直觀展示了各函數(shù)間的調(diào)用關(guān)系。 但是 ftrace 的使用需要好幾個(gè)步驟,用起來(lái)并不方便,不過(guò),trace-cmd 已經(jīng)把這些步驟給包裝了起來(lái),這樣,就可以通過(guò)一行命令,完成上述所有過(guò)程。 trace-cmd 的安裝方式如下。

# Ubuntu
apt install trace-cmd
# CentOS
yum install trace-cmd

trace-cmd安裝好之后,可以通過(guò)執(zhí)行如下的命令輸出類似的結(jié)果,值得注意的是 trace-cmd 的執(zhí)行不能在 /sys/kernel/debug/tracing 路徑,否則執(zhí)行出出錯(cuò),提示信息為“trace-cmd: Permission denied”。

trace-cmd record -p function_graph -g do_sys_open -O funcgraph-proc ls
trace-cmd report

ftrace 的追蹤功能不止于此,它不僅能追蹤到接口的調(diào)用關(guān)系,還能抓取接口調(diào)用的時(shí)間戳,用于性能分析; 還可根據(jù)需要追蹤的接口進(jìn)行模糊過(guò)濾,眾多的功能不在這里詳細(xì)介紹,如果項(xiàng)目中需要用到再進(jìn)行具體了解和總結(jié)。

4.動(dòng)態(tài)追蹤之perf

perf 的功能強(qiáng)大,可以統(tǒng)計(jì)分析出應(yīng)用程序或者內(nèi)核中的熱點(diǎn)函數(shù),從而用于程序性能分析; 也可以用來(lái)分析 CPU cache、CPU 遷移、分支預(yù)測(cè)、指令周期等各種硬件事件; 還可以對(duì)感興趣的事件進(jìn)行動(dòng)態(tài)追蹤。 下面以 do_sys_open 為例,設(shè)置目標(biāo)函數(shù)追蹤。 執(zhí)行如下命令,可以查詢所有支持的事件。

perf list

在 perf 的各個(gè)子命令中添加 --event 選項(xiàng),設(shè)置追蹤感興趣的事件。 如果這些預(yù)定義的事件不滿足實(shí)際需要,可以使用 perf probe 來(lái)動(dòng)態(tài)添加。 而且,除了追蹤內(nèi)核事件外,perf 還可以用來(lái)跟蹤用戶空間的函數(shù)。 執(zhí)行如下代碼添加 do_sys_open 探針。

#執(zhí)行指令
perf probe --add do_sys_open
#輸出
Added new event:
  probe:do_sys_open    (on do_sys_open)
You can now use it in all perf tools, such as:
  perf record -e probe:do_sys_open -aR sleep 1

探針添加成功后,就可以在所有的 perf 子命令中使用。 比如,上述輸出就是一個(gè) perf record 的示例,執(zhí)行它就可以對(duì) 1s 內(nèi)的 do_sys_open 進(jìn)行采樣,如下所示。

#執(zhí)行命令
perf record -e probe:do_sys_open -aR sleep 1
#輸出
[ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.810 MB perf.data (18 samples) ]

執(zhí)行如下命令顯示采樣結(jié)果,輸出結(jié)果中列出了調(diào)用 do_sys_open 的任務(wù)名稱、進(jìn)程 PID 以及運(yùn)行的 CPU 等信息。

#執(zhí)行命令
perf script
#輸出
perf         3676 [003]  7619.618568: probe:do_sys_open: (ffffffffa92e78e0)
sleep        3677 [000]  7619.621118: probe:do_sys_open: (ffffffffa92e78e0)      
sleep        3677 [000]  7619.621130: probe:do_sys_open: (ffffffffa92e78e0)     
vminfo       1403 [001]  7619.864117: probe:do_sys_open: (ffffffffa92e78e0)
dbus-daemon   749 [001]  7619.864222: probe:do_sys_open: (ffffffffa92e78e0)
dbus-daemon   749 [001]  7619.864310: probe:do_sys_open: (ffffffffa92e78e0) 
irqbalance    743 [000]  7620.013548: probe:do_sys_open: (ffffffffa92e78e0) 
irqbalance    743 [000]  7620.013687: probe:do_sys_open: (ffffffffa92e78e0)

在使用結(jié)束后,使用如下命令刪除探針。

#刪除 do_sys_open 探針
perf probe --del probe:do_sys_open

5.動(dòng)態(tài)追蹤之eBPF

eBPF 相對(duì)于 ftrace 和 perf 更加靈活,它可以通過(guò) C 語(yǔ)言自由擴(kuò)展,這些擴(kuò)展通過(guò) LLVM (Low Level Virtual Machine) 轉(zhuǎn)換為 BPF 字節(jié)碼后,加載到內(nèi)核中執(zhí)行。

5.1 搭建 eBPF 開發(fā)環(huán)境

雖然 Linux 內(nèi)核很早就已經(jīng)支持了 eBPF,但很多新特性都是在 4.x 版本中逐步增加的。 所以,想要穩(wěn)定運(yùn)行 eBPF 程序,內(nèi)核至少需要 4.9 或者更新的版本。 而在開發(fā)和學(xué)習(xí) eBPF 時(shí),為了體驗(yàn)和掌握最新的 eBPF 特性,推薦使用更新的 5.x 內(nèi)核,接下來(lái)的案例是基于 Ubuntu20.04 系統(tǒng),內(nèi)核版本為 5.15.0-56-generic,eBPF 開發(fā)和運(yùn)行需要相關(guān)的開發(fā)工具如下。

  • 將 eBPF 程序編譯成字節(jié)碼的 LLVM;
  • C 語(yǔ)言程序編譯工具 make;
  • 流行的 eBPF 工具集 BCC 和它依賴的內(nèi)核頭文件;
  • 內(nèi)核代碼倉(cāng)庫(kù)實(shí)時(shí)同步的 libbpf;
  • 內(nèi)核提供的 eBPF 程序管理工具 bpftool。

可運(yùn)行如下命令進(jìn)行相關(guān)工具的安裝。

apt install -y make clang llvm libelf-dev libbpf-dev bpfcc-tools libbpfcc-dev linux-tools-$(uname -r) linux-headers-$(uname -r)

5.2 開發(fā) eBPF 程序的步驟

一般來(lái)說(shuō), eBPF 程序的開發(fā)分為如下 5 個(gè)步驟。

  • 第一步,使用 C 語(yǔ)言開發(fā)一個(gè) eBPF 程序;
  • 第二步,借助 LLVM 把 eBPF 程序編譯成 BPF 字節(jié)碼;
  • 第三步,通過(guò) bpf 系統(tǒng)調(diào)用,把 BPF 字節(jié)碼提交給內(nèi)核;
  • 第四步,內(nèi)核驗(yàn)證并運(yùn)行 BPF 字節(jié)碼,并把相應(yīng)的狀態(tài)保存到 BPF 映射中;
  • 第五步,用戶程序通過(guò) BPF 映射查詢 BPF 字節(jié)碼的運(yùn)行狀態(tài)。

圖片

eBPF 程序執(zhí)行過(guò)程

以上的每一步,都可以自己動(dòng)手去完成。 但為了方便,推薦從 BCC(BPF Compiler Collection)開始學(xué)起。 BCC 是一個(gè) BPF 編譯器集合,包含了用于構(gòu)建 BPF 程序的編程框架和庫(kù),并提供了大量可以直接使用的工具。 使用 BCC 的好處是,它把上述的 eBPF 執(zhí)行過(guò)程通過(guò)內(nèi)置框架抽象了起來(lái),并提供了 Python、C++ 等編程語(yǔ)言接口。 這樣,就可以直接通過(guò) Python 語(yǔ)言去跟 eBPF 的各種事件和數(shù)據(jù)進(jìn)行交互。

5.3 借助 BCC 開發(fā) eBPF 程序案例

接下來(lái),就以跟蹤 openat()(即打開文件)這個(gè)系統(tǒng)調(diào)用為例,說(shuō)明如何開發(fā)并運(yùn)行第一個(gè) eBPF 程序。 使用 BCC 開發(fā) eBPF 程序,可以把上面的五步簡(jiǎn)化為下面的三步。

5.3.1 使用 C 開發(fā)一個(gè) eBPF 程序

新建一個(gè) trace_open.c 文件,輸入如下內(nèi)容。

/* 包含頭文件 */
#include 
#include 


/* 定義數(shù)據(jù)結(jié)構(gòu) */
struct data_t {
  u32 pid;
  u64 ts;
  char comm[TASK_COMM_LEN];
  char fname[NAME_MAX];
};


/* 定義性能事件映射 */
BPF_PERF_OUTPUT(events);


/* 定義 kprobe 處理函數(shù) */
int trace_open(struct pt_regs *ctx, int dfd, const char __user *filename, struct open_how *how)
{
  struct data_t data = {};

  /* 獲取 PID 和時(shí)間 */
  data.pid = bpf_get_current_pid_tgid();
  data.ts = bpf_ktime_get_ns();

  /* 獲取進(jìn)程名 */
  if (bpf_get_current_comm(&data.comm, sizeof(data.comm)) == 0)
  {
    bpf_probe_read(&data.fname, sizeof(data.fname), (void *)filename);
  }

  /* 提交性能事件 */
  events.perf_submit(ctx, &data, sizeof(data));

  return 0;
}

BPF 程序可以利用 BPF 映射(map)進(jìn)行數(shù)據(jù)存儲(chǔ),而用戶程序也需要通過(guò) BPF 映射,同運(yùn)行在內(nèi)核中的 BPF 程序進(jìn)行交互。 用戶層為了獲取內(nèi)核打開文件名稱時(shí),就要引入 BPF 映射。 為了簡(jiǎn)化 BPF 映射的交互,BCC 定義了一系列的庫(kù)函數(shù)和輔助宏定義。

如下是對(duì)上述代碼的說(shuō)明。

  • data_t 是用戶自定義的數(shù)據(jù)結(jié)構(gòu),用于保存進(jìn)程 PID、時(shí)間、執(zhí)行命令及文件名稱;
  • 使用 BPF_PERF_OUTPUT 來(lái)定義一個(gè) Perf 事件類型的 BPF 映射;
  • bpf_get_current_pid_tgid 用于獲取進(jìn)程的 TGID 和 PID。 定義的 data.pid 數(shù)據(jù)類型為 u32,所以高 32 位舍棄掉后就是進(jìn)程的 PID;
  • bpf_ktime_get_ns 用于獲取系統(tǒng)自啟動(dòng)以來(lái)的時(shí)間,單位是納秒;
  • bpf_get_current_comm 用于獲取進(jìn)程名,并把進(jìn)程名復(fù)制到預(yù)定義的緩沖區(qū)中;
  • bpf_probe_read 用于從指定指針處讀取固定大小的數(shù)據(jù),這里則用于讀取進(jìn)程打開的文件名。
  • perf_submit() 接口將填充好的 data 數(shù)據(jù)提交到定義的 BPF 映射中;

5.3.2 使用 Python 開發(fā)用戶態(tài)程序

創(chuàng)建一個(gè) trace_open.py 文件,并輸入下面的內(nèi)容。

#!/usr/bin/env python3


# 1) import bcc library
from bcc import BPF


# 2) load BPF program
b = BPF(src_file="trace_open.c")


# 3) attach kprobe
b.attach_kprobe(event="do_sys_openat2", fn_name="trace_open")


# 4) print header
print("%-18s %-16s %-6s %-16s" % ("TIME(s)", "COMM", "PID", "FILE"))


# 5) define the callback for perf event
start = 0
def print_event(cpu, data, size):
  global start
  event = b["events"].event(data)
  if start == 0:
    start = event.ts
  time_s = (float(event.ts - start)) / 1000000000
  print("%-18.9f %-16s %-6d %-16s" % (time_s, event.comm, event.pid, event.fname))

# 6) loop with callback to print_event
b["events"].open_perf_buffer(print_event)
while 1:
  try:
    b.perf_buffer_poll()
  except KeyboardInterrupt:
    exit()

如下是對(duì)上述代碼的說(shuō)明。

  • 第 1) 處導(dǎo)入了 BCC 庫(kù)的 BPF 模塊,以便接下來(lái)調(diào)用;
  • 第 2) 處調(diào)用 BPF() 加載第一步開發(fā)的 BPF 源代碼;
  • 第 3) 處將 BPF 程序掛載到內(nèi)核探針(簡(jiǎn)稱 kprobe),其中 do_sys_openat2() 是系統(tǒng)調(diào)用 openat() 在內(nèi)核中的實(shí)現(xiàn);
  • 第 4) 處輸出顯示標(biāo)題;
  • 第 5) 處的 print_event 定義一個(gè)數(shù)據(jù)處理的回調(diào)函數(shù),打印進(jìn)程的名字、PID 以及它調(diào)用 openat 時(shí)打開的文件;
  • 第 6) 處的 open_perf_buffer 定義了名為 "events" 的 Perf 事件映射,而后通過(guò)一個(gè)循環(huán)調(diào)用 perf_buffer_poll 讀取映射的內(nèi)容,并執(zhí)行回調(diào)函數(shù)輸出進(jìn)程信息。

5.3.3 執(zhí)行 eBPF 程序

用戶態(tài)程序開發(fā)完成之后,最后一步就是執(zhí)行它了。 需要注意的是,eBPF 程序需要以 root 用戶來(lái)運(yùn)行,非 root 用戶需要加上 sudo 來(lái)執(zhí)行,輸入如下命令執(zhí)行程序。

python3 trace_open.py

命令執(zhí)行后,可以在另一個(gè)終端中輸入 cat 或 ls 命令(執(zhí)行文件打開命令),然后回到運(yùn)行 trace_open.py 腳本的終端,結(jié)果如下。

TIME(s)            COMM               PID    FILE
0.000000000        b'ls'              5171   b'/etc/ld.so.cache'
0.000021937        b'ls'              5171   b'/lib/x86_64-linux-gnu/libselinux.so.1'
......
2.088971702        b'gsd-housekeepin' 1803   b'/etc/fstab'
2.089056747        b'gsd-housekeepin' 1803   b'/proc/self/mountinfo'
......
2.741662512        b'cat'             5172   b'/etc/ld.so.cache'
2.741681539        b'cat'             5172   b'/lib/x86_64-linux-gnu/libc.so.6'
......

5.4 eBPF 開發(fā)方式簡(jiǎn)介

除了 BCC 之外,eBPF 還有可以使用其他的方式進(jìn)行輔助開發(fā),比如 bpftrace 和 libbpf,每種方法都有自己的優(yōu)點(diǎn)和適用范圍,以下是這三種方式的對(duì)比。

  • bpftrace 通常用在快速排查和定位系統(tǒng)上,它支持用單行腳本的方式來(lái)快速開發(fā)并執(zhí)行一個(gè) eBPF 程序。 不過(guò),bpftrace 的功能有限,不支持特別復(fù)雜的 eBPF 程序,也依賴于 BCC 和 LLVM 動(dòng)態(tài)編譯執(zhí)行。
  • BCC 通常用在開發(fā)復(fù)雜的 eBPF 程序中,其內(nèi)置的各種小工具也是目前應(yīng)用最為廣泛的 eBPF 小程序。 不過(guò),BCC 也不是完美的,它依賴于 LLVM 和內(nèi)核頭文件才可以動(dòng)態(tài)編譯和加載 eBPF 程序。
  • libbpf 是從內(nèi)核中抽離出來(lái)的標(biāo)準(zhǔn)庫(kù),用它開發(fā)的 eBPF 程序可以直接分發(fā)執(zhí)行,這樣就不需要每臺(tái)機(jī)器都安裝 LLVM 和內(nèi)核頭文件了。 不過(guò),它要求內(nèi)核開啟 BTF 特性,需要非常新的發(fā)行版才會(huì)默認(rèn)開啟(如 RHEL 8.2+ 和 Ubuntu 20.10+ 等)。

在實(shí)際應(yīng)用中,可以根據(jù)內(nèi)核版本、內(nèi)核配置、eBPF 程序復(fù)雜度,以及是否允許安裝內(nèi)核頭文件和 LLVM 編譯工具等,來(lái)選擇最合適的方案。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40082
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207889
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    658

    瀏覽量

    21927
  • 追蹤技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    4278
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Labview 下建立dll及其使用方法詳解

    的功能,不是一般的VI打包生成dll的方法.Labview 下建立dll及其使用方法詳解[hide] [/hide]
    發(fā)表于 12-05 11:09

    keil 注冊(cè)機(jī)及其使用方法

    keil注冊(cè)機(jī) 可破解最新版本keilv9.51 !附件內(nèi)容:1.keil注冊(cè)機(jī) 2.注冊(cè)機(jī)使用方法
    發(fā)表于 02-03 23:57

    日本磚家的書電機(jī)用電刷及其使用方法

    日本某磚家的書......電機(jī)用電調(diào)及其使用方法................很有參考價(jià)值推薦課程:張飛軟硬開源,基于STM32 BLDC直流無(wú)刷電機(jī)驅(qū)動(dòng)器視頻套件http://t.elecfans.com/topic/42.html?elecfans_trackid=
    發(fā)表于 01-19 10:04

    光線追蹤技術(shù)的作用

    其實(shí)對(duì)于產(chǎn)品設(shè)計(jì)師而言,光線追蹤技術(shù)并不陌生。簡(jiǎn)單的說(shuō),是自三維(3D)圖形誕生以來(lái)圖形技術(shù)領(lǐng)域最重要的進(jìn)步之一,而且它即將從高深的電影和廣告領(lǐng)域轉(zhuǎn)向移動(dòng)、可穿戴和汽車等嵌入式領(lǐng)域,作為全新的、更有
    發(fā)表于 11-02 08:21

    什么是最大功率點(diǎn)追蹤?具有哪些分類

    什么是最大功率點(diǎn)追蹤?具有哪些分類?
    發(fā)表于 10-26 07:23

    SRAM的工作原理及其使用方法了解

    一、實(shí)驗(yàn)?zāi)康模?.了解半導(dǎo)體靜態(tài)隨機(jī)讀寫存儲(chǔ)器SRAM的工作原理及其使用方法2.掌握半導(dǎo)體存儲(chǔ)器的字、位擴(kuò)展技術(shù)3.用proteus設(shè)計(jì)、仿真基于AT89C51單片機(jī)的RAM擴(kuò)展實(shí)驗(yàn)二、實(shí)驗(yàn)內(nèi)容
    發(fā)表于 12-08 06:14

    動(dòng)態(tài)數(shù)碼管的使用方法

    歷年的藍(lán)橋杯單片機(jī)組比賽都會(huì)考到數(shù)碼管模塊;對(duì)于省賽以及國(guó)賽來(lái)說(shuō),動(dòng)態(tài)數(shù)碼管都是必考模塊!現(xiàn)在來(lái)給大家介紹動(dòng)態(tài)數(shù)碼管的使用方法1、對(duì)數(shù)碼管進(jìn)行操作,無(wú)需改變跳帽的位置2、數(shù)碼管相關(guān)原理圖如下...
    發(fā)表于 01-12 06:19

    集成學(xué)習(xí)的多分類動(dòng)態(tài)組合方法

    為了提高數(shù)據(jù)的分類性能,提出一種集成學(xué)習(xí)的多分類動(dòng)態(tài)組合方法(DEA)。該方法在多個(gè)UCI標(biāo)準(zhǔn)數(shù)據(jù)集上進(jìn)行測(cè)試,并與文中使用的基于Adab
    發(fā)表于 04-08 08:58 ?19次下載

    基于ASP.NET的追蹤技術(shù)研究

    追蹤技術(shù)對(duì)于ASP.NET 應(yīng)用開發(fā)具有重要作用,通過(guò)它可以獲取各種各樣的背景信息,提高整個(gè)調(diào)試過(guò)程的效率。本文在論述追蹤的基本使用方法的同時(shí),重點(diǎn)針對(duì)其獲取信息量
    發(fā)表于 08-29 11:03 ?8次下載

    電網(wǎng)動(dòng)態(tài)無(wú)功補(bǔ)償(SVC)技術(shù)及其應(yīng)用

    電網(wǎng)動(dòng)態(tài)無(wú)功補(bǔ)償(SVC)技術(shù)及其應(yīng)用
    發(fā)表于 09-26 14:31 ?63次下載
    電網(wǎng)<b class='flag-5'>動(dòng)態(tài)</b>無(wú)功補(bǔ)償(SVC)<b class='flag-5'>技術(shù)</b><b class='flag-5'>及其</b>應(yīng)用

    傳感器的主要故障分類及其診斷方法

    傳感器的主要故障分類及其診斷方法,學(xué)習(xí)資料,感興趣的可以瞧一瞧。
    發(fā)表于 10-26 17:00 ?0次下載

    電平表的使用方法_電平表的原理與分類

    本文開始介紹了什么是電平表以及電平表的用途,其次闡述了電平表的原理和分類,最后詳細(xì)介紹了電平測(cè)試表的使用方法
    發(fā)表于 03-13 09:04 ?2.4w次閱讀

    python中的字典(dict)對(duì)象以及其使用方法

    本文通過(guò)以英文的形式全面講解了python中的字典(dict)對(duì)象以及其使用方法
    發(fā)表于 05-15 10:00 ?1次下載

    人體紅外測(cè)溫儀分類_人體紅外測(cè)溫儀使用方法

    本文首先闡述了人體紅外測(cè)溫儀的分類,另外還詳細(xì)介紹了人體紅外測(cè)溫儀使用方法及使用注意事項(xiàng)。
    發(fā)表于 02-27 08:51 ?4747次閱讀

    示波器的使用方法(三):示波器的使用方法詳解

    示波器的使用方法并非很難,重點(diǎn)在于正確使用示波器的使用方法。往期文章中,小編對(duì)模擬示波器的使用方法和數(shù)字示波器的使用方法均有所介紹。為增進(jìn)大家對(duì)示波器的
    的頭像 發(fā)表于 12-24 20:37 ?2981次閱讀