ebpf 單行程序學習
背景
公司方神借給我一本:
《BPF之巔:洞悉linux系統和應用性能》紙質書
拿回家晚上在沙發上看了幾天。
感覺書很厚看的不是很系統。
僅能憑自己的感覺總結一下這些天的讀書感悟。
本來計劃是2023年的春節 7 天長假系統的學習ebpf
但是因爲學習Linux內核參數耽擱了。
工作後又各種忙和慌亂一直沒有時間學習。
已經快跟上我立減肥flag倒的程度了。。。
一些基本理解
cbpf和ebpf的基本概念都不在闡述。
我理解ebpf之後其實核心的工具主要是bcc以及bpftrace
bcc是高手們自己利用python或者是go語言編寫的工具集,用於實現特定的功能。
bpftrace 可以用於實現單行程序,更加符合unix do one thing do it well的哲學。
本次向簡單理一下bpftrace的單行程序的理解。
便於後續的學習和使用。
bpftrace單行程序很類似於 awk 的語法。 通過attach 到不同的探針,跟蹤點,來獲取內核的核心信息
bpftrace的語法格式
注意:這些內容參照Brendan Greeg書中的附錄部分。
bpftrace -e 'probe /filter/ {action;}'
通過這個命令就可以實現對特定探針的信息收集等工作。
注意使用之前需要先安裝 bpftrace 可以在線安裝: yum install bpftrace -y 即可。
注意 -e 表明是跟蹤這個探針
-l 列出探針,不跟蹤
-c 執行命令
bpftrace的部分舉例
1. 跟蹤新進程。包括進程參數
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { join(args->argv);}'
2. 統計系統調用的數量
timeout 3 bpftrace -e 'tracepoint:raw_syscalls:sys_enter {@[pid,comm] = count();}'
注意這個命令可以統計最近三秒內的系統調用數量。如果不加時間可以使用 ctrl + c 的方式終止跟蹤執行打印
3. bpftrace -e 'software:page-faults:1 {@[pid,comm] = count();}'
注意 如果不知道有哪一些probe 可以使用可以通過這個命令來獲取
bpftrace -l 'software:*'
注意 原作者的附錄裏面page-fault 是錯誤的,需要改爲複數形式。
4. 統計vfs調用
bpftrace -e 'kprobe:vfs_* {@[probe] = count();}'
注意這個是內核及的 kprobe kernel-probe
5. 統計io尺寸。可以驗證數據庫的塊大小相關
bpftrace -e 't:block:block_rq_issue {@bytes = hist(args->bytes);}'
注意 t 是 tracepoint的縮寫。
6. 按照pid和進程名統計
bpftrace -e 't:syscalls:sys_enter_connect {@[pid,comm] = count();}'
7. 直方圖統計udp發送的字節數
timeout 3 bpftrace -e 'k:udp_sendmsg {@send_pytes = hist(arg2);}'
困了 今天到這。。