在前面我已經分享了關于ebpf入門的文章:
基于ubuntu22.04-深入淺出 eBPF。
這篇文章介紹一個基于ebpf技術的強大工具--bpftrace。
在現代計算機系統中,了解系統的內部運行情況對于診斷問題、優化性能以及進行安全監控至關重要。bpftrace作為一款強大的跟蹤工具,為開發人員和系統管理員提供了一種獨特的方式來監視和分析Linux系統的內部運行。本文描述bpftrace的原理和使用。
bpftrace
「bpftrace是基于eBPF和BBC實現了通過探針機制采集內核和程序運行的信息,然后用圖表等方式將信息展示出來,幫助開發者找到隱藏較深的Bug、安全問題和性能瓶頸。」「bpftrace是一種高級跟蹤,適用于最新的Linux內核(4.x)中提供的Linux增強型Berkeley數據包過濾器(eBPF)。bpftrace使用LLVM作為將腳本編譯為BPF碼字節語言,并使用BCC與Linux BPF系統交互,以及現有的Linux跟蹤功能:內核動態跟蹤(kprobes)、用戶級動態跟蹤(uprobes)、和跟蹤點。bpftrace語言的靈感來自awk和C,以及DTrace和SystemTap等前身跟蹤」
「bpftrace通過高度抽象的封裝來使用eBPF,大多數功能只需要寥寥幾筆就可以運行起來,可以很快讓我們搞清楚eBPF是什么樣的,而暫時不關心eBPF復雜的內部機理。由于bpftrace深受AWK和c的影響,bpftrace使用起來于AWK非常相似,那些內核hook注入點幾乎可以按普通字符串匹配來理解,非常容易上手。」
![5a593e34-4af9-11ee-bb52-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A2/F5/wKgaomT1mGWAQh3FAAIOyWSGE6E152.png)
bpftrace安裝
在bpftrace的項目中,提供了一些常見系統的安裝方法,官方文檔:(https://github.com/iovisor/bpftrace/blob/master/INSTALL.md#ubuntu-packages)。支持的系統:Ubuntu,Fedora,Gentoo,Debian,openSUSE,CentOS,Arch,Alpine。
- 作者使用ubuntu22.04系統,安裝過程非常簡單,步驟如下:
youyeetoo@youyeetoo:~$sudoapt-getinstall-ybpftrace
- 安裝完畢,可以確認一下安裝情況,如果看到版本號說明安裝成功:
youyeetoo@youyeetoo:~$bpftrace-V
bpftracev0.14.0
bpftrace使用
bpftrace是eBPF的高級封裝,借助bpftrace可以一窺 eBPF 輪廓。
##列出ebpf支持的探針指令:
$bpftrace-l
##查看ebpf支持的探針個數:
$bpftrace-l|wc-l
##查看不同類型ebpf探針個數:
$bpftrace-l|awk-F":"'{print$1}'|sort|uniq-c
bpftrace執行腳本
bpftrace提供了兩種不同的方式執行腳本:
- 單行指令執行:bpftrace -e 'cmds'
- 單行指令模式是即用即棄,執行一些簡短的指令非常方便,所有指令都包含在最后一個參數中,需要注意的是,雖然單行指令模式的指令可能很長,但對于 bpftrace 來說,它只接受了 2 個參數:-e 和 一個指令字符串(需要使用單引號包裹,確保所有指令都被識別為一個完整的字符串)。
- 單行指令,官方也提供了一些樣例,如下:
#Filesopenedbyprocess
$bpftrace-e'tracepointsys_enter_open{printf("%s%sn",comm,str(args->filename));}'
#Syscallcountbyprogram
$bpftrace-e'tracepointsys_enter{@[comm]=count();}'
#Readbytesbyprocess:
$bpftrace-e'tracepointsys_exit_read/args->ret/{@[comm]=sum(args->ret);}'
#Readsizedistributionbyprocess:
$bpftrace-e'tracepointsys_exit_read{@[comm]=hist(args->ret);}'
#Showper-secondsyscallrates:
$bpftrace-e'tracepointsys_enter{@=count();}interval1{print(@);clear(@);}'
#Tracedisksizebyprocess
$bpftrace-e'tracepointblock_rq_issue{printf("%d%s%dn",pid,comm,args->bytes);}'
#Countpagefaultsbyprocess
$bpftrace-e'software1{@[comm]=count();}'
#CountLLCcachemissesbyprocessnameandPID(usesPMCs):
$bpftrace-e'hardware1000000{@[comm,pid]=count();}'
#Profileuser-levelstacksat99Hertz,forPID189:
$bpftrace-e'profile99/pid==189/{@[ustack]=count();}'
#Filesopened,forprocessesintherootcgroup-v2
$bpftrace-e'tracepointsys_enter_openat/cgroup==cgroupid("/sys/fs/cgroup/unified/mycg")/{printf("%sn",str(args->filename));}'
- 腳本文件執行:bpftrace
- 通過bpftrace就可以執行c style的代碼,通過這類的代碼,bpftrace可以實現相對復雜的邏輯。比如通過bpftrace獲取當前所有shell的輸入,代碼如下:
BEGIN
{
printf("Tracingbashcommands...HitCtrl-Ctoend.n");
printf("%-9st%st%st%sn","TIME","UID","PID","COMMAND");
}
uretprobe:/bin/bash:readline
{
time("%H:%M:%St");
printf("%dt%dt%sn",uid,pid,str(retval));
}
END
{
printf("end-test");
}
![5a8a5f78-4af9-11ee-bb52-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/A2/F5/wKgaomT1mGaAER7xAAIXlZznyk4917.png)
- 官方提供了很多工具可直接調用,鏈接:https://github.com/iovisor/bpftrace/tree/master/tools
工具 | 說明 |
---|---|
tools/bashreadline.bt | 在系統范圍內打印輸入的bash命令 |
tools/biolatency.bt | 以直方圖形式顯示塊I/O延遲 |
tools/biosnoop.bt | 塊I/O跟蹤工具,顯示每個I/O延遲 |
tools/biostacks.bt | 使用初始化堆棧顯示磁盤 I/O 延遲 |
tools/bitesize.bt | 以直方圖形式顯示磁盤 I/O 大小 |
tools/capable.bt | 跟蹤安全能力檢查 |
tools/cpuwalk.bt | 采樣哪些 CPU 正在執行進程 |
tools/dcsnoop.bt | 跟蹤目錄條目緩存 (dcache) 查找 |
tools/execsnoop.bt | 通過 exec() 系統調用跟蹤新進程 |
tools/gethostlatency.bt | 顯示 getaddrinfo/gethostbyname[2] 調用的延遲 |
tools/killsnoop.bt | 由kill()系統調用發出的跟蹤信號 |
tools/loads.bt | 打印負載平均值 |
tools/mdflush.bt | 跟蹤 md 刷新事件 |
tools/naptime.bt | 顯示自愿睡眠呼叫 |
tools/opensnoop.bt | 跟蹤顯示文件名的 open() 系統調用 |
tools/oomkill.bt | 跟蹤 OOM 殺手 |
tools/pidpersec.bt | 計算新進程(通過 fork) |
tools/runqlat.bt | CPU 調度程序運行隊列延遲作為直方圖 |
tools/runqlen.bt | CPU 調度程序運行隊列長度作為直方圖 |
tools/setuids.bt | 跟蹤 setuid 系統調用:權限提升 |
tools/ssllatency.bt | 將 SSL/TLS 握手延遲總結為直方圖 |
tools/sslsnoop.bt | 跟蹤 SSL/TLS 握手,顯示延遲和返回值 |
tools/statsnoop.bt | 跟蹤 stat() 系統調用以進行一般調試 |
tools/swapin.bt | 按進程顯示交換 |
tools/syncsnoop.bt | 跟蹤sync()各種系統調用 |
tools/syscount.bt | 統計系統調用 |
tools/tcpaccept.bt | 跟蹤 TCP 被動連接 (accept()) |
tools/tcpconnect.bt | 跟蹤 TCP 活動連接 (connect()) |
tools/tcpdrop.bt | 跟蹤基于內核的 TCP 數據包丟失的詳細信息 |
tools/tcplife.bt | 使用連接詳細信息跟蹤 TCP 會話生命周期 |
tools/tcpretrans.bt | 跟蹤 TCP 重傳 |
tools/ tcpsynbl.bt | 以直方圖形式顯示 TCP SYN 積壓 |
tools/threadsnoop.bt | 列出新線程創建 |
tools/undump.bt | 捕獲 UNIX 域套接字包 |
tools/vfscount.bt | 統計 VFS 調用 |
tools/vfsstat.bt | 對一些 VFS 調用進行計數,并提供每秒摘要 |
tools/writeback.bt | 跟蹤文件系統寫回事件的詳細信息 |
tools/xfsdist.bt | 將 XFS 操作延遲分布總結為直方圖 |
審核編輯 黃宇
-
嵌入式
+關注
關注
5095文章
19189瀏覽量
307987 -
Linux
+關注
關注
87文章
11351瀏覽量
210506 -
Ubuntu
+關注
關注
5文章
567瀏覽量
30063
發布評論請先 登錄
相關推薦
解構內核源碼eBPF樣例編譯過程
openEuler 倡議建立 eBPF 軟件發布標準
強勁的Linux Trace工具 bpftrace for Linux 2018
![強勁的Linux Trace<b class='flag-5'>工具</b> <b class='flag-5'>bpftrace</b> for Linux 2018](https://file.elecfans.com/web1/M00/94/FD/o4YBAFz2IeWABmQmAAAZPRcXZfY271.png)
eBPF是什么以及eBPF能干什么
![<b class='flag-5'>eBPF</b>是什么以及<b class='flag-5'>eBPF</b>能干什么](https://file.elecfans.com/web2/M00/05/B6/pYYBAGDis6OAAariAAAExNW9KWw760.png)
介紹eBPF針對可觀測場景的應用
openEuler倡議建立eBPF軟件發布標準
Linux 內核:eBPF優勢和eBPF潛力總結
什么是eBPF,eBPF為何備受追捧?
eBPF的前世今生?eBPF在使用中遇到的問題有哪些?
![<b class='flag-5'>eBPF</b>的前世今生?<b class='flag-5'>eBPF</b>在使用中遇到的問題有哪些?](https://file1.elecfans.com/web2/M00/90/53/wKgaomTXMPuAHleMAAAgLsCdH4o630.png)
基于ebpf的性能工具應用
![基于<b class='flag-5'>ebpf</b>的<b class='flag-5'>性能</b><b class='flag-5'>工具</b>應用](https://file1.elecfans.com/web2/M00/AD/0E/wKgaomVLREKAe3UOAAB7PJbK0zA684.jpg)
eBPF動手實踐系列三:基于原生libbpf庫的eBPF編程改進方案簡析
![<b class='flag-5'>eBPF</b>動手實踐系列三:基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進方案簡析](https://file1.elecfans.com/web2/M00/C4/F8/wKgZomX5LwaAGNVNAAAWUQ98t-0882.png)
評論