一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統 - Fedora - 在 Fedora 中用 bpftrace 追蹤代碼

在 Fedora 中用 bpftrace 追蹤代碼

2021-08-01 23:20Linux中國Augusto Caringi Fedora

bpftrace 是一個 基于 eBPF 的新型追蹤工具,在 Fedora 28 第一次引入。這篇文章的內容涉及了 bpftrace 的一些基礎,以及它是如何工作的,請繼續閱讀獲取更多的信息和一些有用的實例。

在 Fedora 中用 bpftrace 追蹤代碼

bpftrace 是一個 基于 eBPF 的新型追蹤工具,在 Fedora 28 第一次引入。Brendan Gregg、Alastair Robertson 和 Matheus Marchini 在網上的一個松散的黑客團隊的幫助下開發了 bpftrace。它是一個允許你分析系統在幕后正在執行的操作的追蹤工具,可以告訴你代碼中正在被調用的函數、傳遞給函數的參數、函數的調用次數等。

這篇文章的內容涉及了 bpftrace 的一些基礎,以及它是如何工作的,請繼續閱讀獲取更多的信息和一些有用的實例。

eBPF(擴展的伯克利數據包過濾器extended Berkeley Packet Filter

 

eBPF 是一個微型虛擬機,更確切的說是一個位于 Linux 內核中的虛擬 CPU。eBPF 可以在內核空間以一種安全可控的方式加載和運行小型程序,使得 eBPF 的使用更加安全,即使在生產環境系統中。eBPF 虛擬機有自己的指令集架構(ISA),類似于現代處理器架構的一個子集。通過這個 ISA,可以很容易將 eBPF 程序轉化為真實硬件上的代碼。內核即時將程序轉化為主流處理器架構上的本地代碼,從而提升性能。

eBPF 虛擬機允許通過編程擴展內核,目前已經有一些內核子系統使用這一新型強大的 Linux 內核功能,比如網絡、安全計算、追蹤等。這些子系統的主要思想是添加 eBPF 程序到特定的代碼點,從而擴展原生的內核行為。

雖然 eBPF 機器語言功能強大,由于是一種底層語言,直接用于編寫代碼很費力,bpftrace 就是為了解決這個問題而生的。eBPF 提供了一種編寫 eBPF 追蹤腳本的高級語言,然后在 clang / LLVM 庫的幫助下將這些腳本轉化為 eBPF,最終添加到特定的代碼點。

安裝和快速入門

 

在終端 使用 sudo 執行下面的命令安裝 bpftrace:

  1. $ sudo dnf install bpftrace

使用“hello world”進行實驗:

  1. $ sudo bpftrace -e 'BEGIN { printf("hello world\n"); }'

注意,出于特權級的需要,你必須使用 root 運行 bpftrace,使用 -e 選項指明一個程序,構建一個所謂的“單行程序”。這個例子只會打印 “hello world”,接著等待你按下 Ctrl+C。

BEGIN 是一個特殊的探針名,只在執行一開始生效一次;每次探針命中時,大括號 {} 內的操作(這個例子中只是一個 printf)都會執行。

現在讓我們轉向一個更有用的例子:

  1. $ sudo bpftrace -e 't:syscalls:sys_enter_execve { printf("%s called %s\n", comm, str(args->filename)); }'

這個例子打印了父進程的名字(comm)和系統中正在創建的每個新進程的名稱。t:syscalls:sys_enter_execve 是一個內核追蹤點,是 tracepoint:syscalls:sys_enter_execve 的簡寫,兩種形式都可以使用。下一部分會向你展示如何列出所有可用的追蹤點。

comm 是一個 bpftrace 內建指令,代表進程名;filename 是 t:syscalls:sys_enter_execve 追蹤點的一個字段,這些字段可以通過 args 內建指令訪問。

追蹤點的所有可用字段可以通過這個命令列出:

  1. bpftrace -lv "t:syscalls:sys_enter_execve"

示例用法

 

列出探針

bpftrace 的一個核心概念是探針點probe point,即 eBPF 程序可以連接到的(內核或用戶空間的)代碼中的測量點,可以分成以下幾大類:

  • kprobe——內核函數的開始處
  • kretprobe——內核函數的返回處
  • uprobe——用戶級函數的開始處
  • uretprobe——用戶級函數的返回處
  • tracepoint——內核靜態追蹤點
  • usdt——用戶級靜態追蹤點
  • profile——基于時間的采樣
  • interval——基于時間的輸出
  • software——內核軟件事件
  • hardware——處理器級事件

所有可用的 kprobe / kretprobetracepoints、software 和 hardware 探針可以通過這個命令列出:

  1. $ sudo bpftrace -l

uprobe / uretprobe 和 usdt 是用戶空間探針,專用于某個可執行文件。要使用這些探針,通過下文中的特殊語法。

profile 和 interval 探針以固定的時間間隔觸發;固定的時間間隔不在本文的范疇內。

統計系統調用數

映射 是保存計數、統計數據和柱狀圖的特殊 BPF 數據類型,你可以使用映射統計每個系統調用正在被調用的次數:

  1. $ sudo bpftrace -e 't:syscalls:sys_enter_* { @[probe] = count(); }'

一些探針類型允許使用通配符匹配多個探針,你也可以使用一個逗號隔開的列表為一個操作塊指明多個連接點。上面的例子中,操作塊連接到了所有名稱以 t:syscalls:sysenter_ 開頭的追蹤點,即所有可用的系統調用。

bpftrace 的內建函數 count() 統計系統調用被調用的次數;@[] 代表一個映射(一個關聯數組)。該映射的鍵 probe 是另一個內建指令,代表完整的探針名。

這個例子中,相同的操作塊連接到了每個系統調用,之后每次有系統調用被調用時,映射就會被更新,映射中和系統調用對應的項就會增加。程序終止時,自動打印出所有聲明的映射。

下面的例子統計所有的系統調用,然后通過 bpftrace 過濾語法使用 PID 過濾出某個特定進程調用的系統調用:

  1. $ sudo bpftrace -e 't:syscalls:sys_enter_* / pid == 1234 / { @[probe] = count(); }'

進程寫的字節數

讓我們使用上面的概念分析每個進程正在寫的字節數:

  1. $ sudo bpftrace -e 't:syscalls:sys_exit_write /args->ret > 0/ { @[comm] = sum(args->ret); }'

bpftrace 連接操作塊到寫系統調用的返回探針(t:syscalls:sys_exit_write),然后使用過濾器丟掉代表錯誤代碼的負值(/arg->ret > 0/)。

映射的鍵 comm 代表調用系統調用的進程名;內建函數 sum() 累計每個映射項或進程寫的字節數;args 是一個 bpftrace 內建指令,用于訪問追蹤點的參數和返回值。如果執行成功,write 系統調用返回寫的字節數,arg->ret 用于訪問這個字節數。

進程的讀取大小分布(柱狀圖):

bpftrace 支持創建柱狀圖。讓我們分析一個創建進程的 read 大小分布的柱狀圖的例子:

  1. $ sudo bpftrace -e 't:syscalls:sys_exit_read { @[comm] = hist(args->ret); }'

柱狀圖是 BPF 映射,因此必須保存為一個映射(@),這個例子中映射鍵是 comm。

這個例子使 bpftrace 給每個調用 read 系統調用的進程生成一個柱狀圖。要生成一個全局柱狀圖,直接保存 hist() 函數到 @(不使用任何鍵)。

程序終止時,bpftrace 自動打印出聲明的柱狀圖。創建柱狀圖的基準值是通過 args->ret 獲取到的讀取的字節數。

追蹤用戶空間程序

你也可以通過 uprobes / uretprobes 和 USDT(用戶級靜態定義的追蹤)追蹤用戶空間程序。下一個例子使用探測用戶級函數結尾處的 uretprobe ,獲取系統中運行的每個 bash 發出的命令行:

  1. $ sudo bpftrace -e 'uretprobe:/bin/bash:readline { printf("readline: \"%s\"\n", str(retval)); }'

要列出可執行文件 bash 的所有可用 uprobes / uretprobes, 執行這個命令:

  1. $ sudo bpftrace -l "uprobe:/bin/bash"

uprobe 指向用戶級函數執行的開始,uretprobe 指向執行的結束(返回處);readline() 是 /bin/bash 的一個函數,返回鍵入的命令行;retval 是被探測的指令的返回值,只能在 uretprobe 訪問。

使用 uprobes 時,你可以用 arg0..argN 訪問參數。需要調用 str() 將 char * 指針轉化成一個字符串。

自帶腳本

 

bpftrace 軟件包附帶了許多有用的腳本,可以在 /usr/share/bpftrace/tools/ 目錄找到。

這些腳本中,你可以找到:

  • killsnoop.bt——追蹤 kill() 系統調用發出的信號
  • tcpconnect.bt——追蹤所有的 TCP 網絡連接
  • pidpersec.bt——統計每秒鐘(通過 fork)創建的新進程
  • opensnoop.bt——追蹤 open() 系統調用
  • bfsstat.bt——追蹤一些 VFS 調用,按秒統計

你可以直接使用這些腳本,比如:

  1. $ sudo /usr/share/bpftrace/tools/killsnoop.bt

你也可以在創建新的工具時參考這些腳本。

鏈接

 

  • bpftrace 參考指南——https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md
  • Linux 2018 bpftrace(DTrace 2.0)——http://www.brendangregg.com/blog/2018-10-08/dtrace-for-linux-2018.html
  • BPF:通用的內核虛擬機——https://lwn.net/Articles/599755/
  • Linux Extended BPF(eBPF)Tracing Tools——http://www.brendangregg.com/ebpf.html
  • 深入 BPF:一個閱讀材料列表—— https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf

原文鏈接:https://linux.cn/article-13632-1.html

延伸 · 閱讀

精彩推薦
  • FedoraHostwinds教程:如何在Fedora上安裝Docker

    Hostwinds教程:如何在Fedora上安裝Docker

    docker 是一個開源應用容器引擎,以類似于虛擬機但不虛擬化的方式在自包含的環境中創建相關應用程序和服務。您可以在多個平臺上下載并安裝Docker,比如...

    未知1232023-05-09
  • FedoraFedora 35 將搭載 LLVM 13 和 Go 1.17

    Fedora 35 將搭載 LLVM 13 和 Go 1.17

    Fedora工程和指導委員會 (FESCo) 批準了將于秋季發布的 Fedora 35 的一些額外變更。...

    開源中國6002021-08-19
  • Fedora阿里云購買鏡像服務器

    阿里云購買鏡像服務器

    阿里云 作為國內的領先云計算服務提供商,為用戶提供了各種可靠、高效的云計算產品,其中就包括鏡像服務器。鏡像服務器是一個非常優秀的解決方案,...

    未知1342023-06-02
  • Fedorafedora8 下mysql 安裝的安裝方法

    fedora8 下mysql 安裝的安裝方法

    fedora8 下mysql 安裝的安裝方法...

    fedora教程網6422019-10-14
  • FedoraFedora 33開始測試切換到Btrfs

    Fedora 33開始測試切換到Btrfs

    盡管距離 Fedora 的下一個穩定版本(Fedora 33)還有幾個月的距離,但仍有一些值得關注的變化。在所有其他 Fedora 33 接受的系統范圍的更改中,最有趣的提議...

    Linux中國3392020-07-27
  • Fedora阿里云服務器配置低選擇什么系統比較好

    阿里云服務器配置低選擇什么系統比較好

    在選擇阿里 云服務器 時,除了考慮服務器的大小和價格,還需要考慮哪個操作系統最適合該服務器。操作系統是服務器的基礎,因為它提供了一個框架,...

    未知1152023-05-10
  • Fedorafedora phpMyAdmin 安裝方法及介紹

    fedora phpMyAdmin 安裝方法及介紹

    在安裝fedora的時候,把基本該選擇的組件都選上,其中就有Appache,mysql,和php,但是在我們管了數據庫的時候,還是有個圖形界面比較方便,所以我們自己...

    fedora教程網5742019-10-15
  • Fedora【轉載】fedora22和win10之間的文件共享互訪

    【轉載】fedora22和win10之間的文件共享互訪

    ? 鋼鐵俠與孔子? 關注 2016.06.04 14:10*? 字數 1327? 閱讀 2170 評論 0 喜歡 1 ?一,相關知識了解(本文執行環境為fedora22和win10) 在局域網內windows系統之間共享...

    未知872023-05-09
主站蜘蛛池模板: 精品国产精品国产 | 精品无码久久久久久久久 | 东北老妇露脸xxxxx | 精品四虎国产在免费观看 | 91视频破解 | 色婷婷久久综合中文久久一本 | 亚洲AV无码偷拍在线观看 | 久久天堂成人影院 | 亚洲欧美精品久久 | 欧美在线成人免费国产 | 美女福利网站 | 精品久久久久久久久免费影院 | 超h高h肉h文武侠 | 成人免费草草视频 | ass巨大胖女人sias | fc2免费人成为视频 eeuss18影院www国产 | 日韩小视频在线观看 | 2014天堂| 国产成人精品一区二三区在线观看 | 亚洲a视频在线 | 国产图色| 免费黄色片在线观看 | 欧美男同互吃gay老头 | 午夜福利体检 | 虎四免费入口 | 四虎精品在线观看 | 97伊人久久精品亚洲午夜 | 日韩日韩日韩手机看片自拍 | 互换身体全集免费观看 | 我在厨房摸岳的乳HD在线观看 | 欧美在线视频一区二区 | 欧美1区| 花房乱爱在线观看 | 日本大片免aaa费观看视频 | 国产精品合集久久久久青苹果 | 久久精品国产免费 | 欧美成人aa久久狼窝动画 | 亚洲成a人不卡在线观看 | 欧美美女一区二区三区 | xxxxxx日本处大片免费看 | 国内精品自产拍在线观看91 |