精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Ftrace研究Linux內核

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-05-05 10:00 ? 次閱讀

說明背景

文檔作為會議的記錄和補充,會議主題是《使用Ftrace研究Linux內核》,主講人謝歡。回放鏈接

基本內容

1、Ftrace整體框架

c19f5546-cc07-11ec-bce3-dac502259ad0.jpg

根據官方文檔的定義,Ftrace是一個內部跟蹤器,旨在幫助系統的開發者和設計者去觀測內核的運行。它可以被用于調試或分析發生在用戶空間之外的延遲和性能問題。隨著發展,目前已經演變成為一個基礎的調試框架(支持多個不同類型的trace功能)。 直觀理解有兩層含義:一是提供函數鉤子的基礎設施,二是基于tracefs文件系統的trace框架。
  • function tracer:在函數頭掛鉤子函數

  • function graph tracer:可以帶時間戳函數執行流打印

  • kprobe:一般是掛在函數入口點,用于獲取參數

  • trace event:函數執行時調用靜態的鉤子函數

  • kretprobe:通常是函數出口點,執行鉤子函數

2、使用方式

c1b63996-cc07-11ec-bce3-dac502259ad0.jpg

Ftrace通過tracefs文件系統的控制文件來進行調試。如果內核構建階段配置ftrace,默認會掛載tracefs到/sys/kernel/tracing,也可以在運行環境手動掛載

c1c8a69e-cc07-11ec-bce3-dac502259ad0.png

接下來的內容我會根據課程介紹,整理出ftrace不同功能的使用案例,一些問答和和觀點以及個人對課程總結。

function tracer使用

case01: 過濾"vfs_open"函數

c1dd2f06-cc07-11ec-bce3-dac502259ad0.png

觀察結果:圖示能看到所有執行vfs_open的跟蹤信息

c1f35c68-cc07-11ec-bce3-dac502259ad0.png

function graph tracer使用

case01: 函數"vfs_open"的執行時間


		

echo vfs_open > ./set_ftrace_filter # 過濾要跟蹤的函數

echo function_graph > ./current_tracer # 設置當前使用的tracerecho 1 > ./options/funcgraph-proc # 啟用進程TASK/PID打印cp trace /test.txt && cat /test.txt

c211ac4a-cc07-11ec-bce3-dac502259ad0.jpg

觀察結果:查看到vfs_open被執行的調試信息包括TASK/PID,函數的執行時間在,接口名。原理上是通過在函數的入口點和出口點(kprobe/kretprobe)掛鉤子來實現的。

case02: 函數"vfs_open"向下執行流

echo > ./set_ftrace_filter # 不使用過濾!!!echo vfs_open > ./set_graph_function #  使用函數圖表echo function_graph > ./current_tracer # 過濾要跟蹤的函數echo 1 > ./options/funcgraph-proc # 打印進程TASK/PIDecho 1 > ./options/funcgraph-tail # 尾部注釋(方便觀察)cp trace /test.txt && cat /test.txt

c227c1ce-cc07-11ec-bce3-dac502259ad0.jpg

觀察結果:vfs_open被執行時,能看到向下的執行流程,其中涉及到的函數調用和相關信息會打印出來。

kprobe event

case01: 查看"vfs_open"當前打開文件名

# 理論計算:# $arg1, 第一個參數# +0x8($arg1), 地址偏移+0x8# +0x70(+0x8($arg1)), 相當與C語言的 *(*($arg1 + 0x8) + 0x70)
echo 'p vfs_open name=+0x70(+0x8($arg1)):string namep=+0(+0x60(+0x8($arg1))):string' > ./kprobe_eventsecho 1 > ./events/kprobes/p_vfs_open_0/enableecho > trace && cat /test.txtcp trace /test.txt && cat /test.txt

c23dbad8-cc07-11ec-bce3-dac502259ad0.jpg

觀察結果:圖示看到一些vfs_open函數的kprobe事件,name是當前被查看的文件名。kprobe通過參數加地址偏移計算拿到特定成員的地址

case02: 捕獲"vfs_open"查看指定文件的信息的事件

# 功能: 利用filter和trigger文件root@debian:/sys/kernel/debug/tracing# ls ./events/kprobes/p_vfs_open_0/enable filter format hist id inject trigger
# 格式: kprobe eventroot@debian:/sys/kernel/debug/tracing# cat ./events/kprobes/p_vfs_open_0/format
echo 'p vfs_open name=+0x70(+0x8($arg1)):string namep=+0(+0x60(+0x8($arg1))):string' > ./kprobe_eventsecho 1 > ./events/kprobes/p_vfs_open_0/enable # 過濾包含"test"字段的文件的事件echo 'name ~ "*test*"' > ./events/kprobes/p_vfs_open_0/filterecho > trace && cat /test.txtecho 'stacktrace if name ~ "*test*"' > ./events/kprobes/p_vfs_open_0/trigger  # 包含"test"字段的文件的事件會觸發"stacktrace"堆棧打印

trace event

cat /sys/kernel/debug/tracing/available_events # 查看當前支持的跟蹤事件列表

case01: 打開驅動中跟蹤節點

echo 1 > /sys/kernel/debug/tracing/events/gsgpu/enable && echo 0 > /sys/kernel/debug/tracing/trace && /root/run_test.sh ; cp /sys/kernel/debug/tracing/trace /test.txt && echo 0 > /sys/kernel/debug/tracing/events/gsgpu/enablecat /test.txt

case02: 通過filter過濾事件

echo 0 > /sys/kernel/debug/tracing/events/gsgpu/enable && echo 1 > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/enable && echo 0 > /sys/kernel/debug/tracing/trace && echo "bo_size >= 50000" > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/filter && /root/run_test.sh ; cp /sys/kernel/debug/tracing/trace /test.txt && echo 0 > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/filtercat /test.txt

case03: 通過trigger查看棧回溯

echo 0 > /sys/kernel/debug/tracing/events/gsgpu/enable && echo 1 > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/enable && echo 0 > /sys/kernel/debug/tracing/trace && echo 'stacktrace' > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/trigger && /root/run_test.sh ; cp /sys/kernel/debug/tracing/trace /test.txt && echo '!stacktrace' > /sys/kernel/debug/tracing/events/gsgpu/gsgpu_bo_move/trigger && cat /test.txt

objtrace

case01:觀察對象數據在函數中流動

源碼位置:https://github.com/x-lugoo/linux/tree/objtrace-v9

[root@JeffXie tracing]# cat ./events/kprobes/p_bio_add_page_0/trigger Available triggers: traceon traceoff snapshot stacktrace enable_event disable_event hist objtrace
cd /sys/kernel/debug/tracing/echo 'p bio_add_page arg1=$arg1 arg2=$arg2' > ./kprobe_eventsecho 'objtracearg1,0x285 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger# du -sh /test.txt // 12Kcat /test.txt > /dev/nullcat ./trace

c252437c-cc07-11ec-bce3-dac502259ad0.jpg

觀察結果:參數arg1對應object對象,由于有kprobe匹配到目標參數達到觸發條件,我看到圖示中打印的調試信息。這樣就可以觀察到指定接口的參數在內核函數中是怎樣流動的

一些觀點

  • 1、ftrace很多功能在國內使用不充分,比如tracer網上資料少,ftrace功能很強大,可挖掘的潛力大。像是大家對shell的使用,如果大家能積累更多的案例,這樣能更好的普及和使用。

  • 2、ftrace和正常的日志環形緩沖區不同,如果大量日志向同一個緩沖區輸入,一會導致信息混亂,二是容易覆蓋有效數據。使用ftrace的過濾等功能,可以更好的解決此類問題(適用更加復雜的業務場景)。補充ftrace其他功能:自動保存結果輸出到文件;生成直方圖;觸發其他事件;等等。

  • 3、ftrace對內核的通用性還是比較強的,相比ebpf來說ftrace對于低版本的內核更加友好。

  • 4、ftrace的用戶群體大,但是名聲沒有ebpf的功能大。

  • 5ftrace的tracer在linux中使用shell腳本來實現,如果想要觀察和定位,使用這種手段方便;如果轉發類或者做業務相關的,推薦使用ebpf比較多。可以根據各自優勢應用到不同的場景,也可以兩者結合使用。

一些問答

perf/ftrace/ebpf關系

基于kprobe的ebpf通過 fd找到字節碼程序,當perf使用相同功能的時候,可以依據 fd來找到這個字節碼程序。基于kprobe的ebpf本質上是基于ftrace, 使用ftrace框架來調用字節碼程序

#使用bpftrace工具將ebpf程 序掛載到"kprobe:do_ nanosleep"bpftrace -e 'kprobe:do_nanosleep { printf("PID %d sleeping... ", pid); }'

kprobe和function trace的鉤子有什么區別?

基本相同,kprobe的鉤子函數會做更多的解析工作,例如解析更多的 field(例如argN或stackN等)

什么是no trace函數?

如果函數本身參與ftrace功能,不能用于trace(避免遞歸) 這樣的函數一般都是no trace。

uprobe是用什么實現的?

uprobe在用戶層,基于斷點指令來實現。

ftrace對性能影響多大?

看如何使用?如果對所有函數使用function tracer,如果只使用一個性能事件性能消耗很小。

如果從學習內核的角度來講,怎樣把ftrace作為一個輔助的工具來上手內核?

在調試內核的時候,通常使用printk/printf來使用,使用ftrace的前提要戒掉這個習慣,然后使用ftrace工具來調試。

對于可靠性和安全性比較高的領域,對于ftrace是不是要慎用一些?

是的,對原理理解要求比較高一些。對原理比較清楚的話,能很好的縮小ftrace的使用范圍,來進一步降低對系統的性能消耗。

如何評估這些調試工具的開銷?

正確對待ftrace是一個輔助工具,前提還是要對代碼比較熟悉,ftrace輔助對代碼的觀察。

ftrace這樣的工具好處?

使用在不破壞內核的情況下,提供一個對內核可觀測手段;提供基礎的tracer功能,靈活運用好tracer功能對分析問題幫助;perf工具將各種類型的掛載點收入囊中,一統江湖。

linux內核中有這么多鉤子?都有什么局限,如何選擇

看具體想使用哪些功能,比如查看函數怎么執行,選擇function tracer;比如查看某一個函數的參數,使用kprobe掛載點對應的鉤子函數不一樣的。

ftrace的tracer在linux中使用shell腳本來實現,如果想要觀察和定位,使用這種手段方便;如果轉發類或者做業務相關的,推薦使用ebpf比較多

各有優勢,應用到不同的場景,也可以兩者結合使用。

嵌入式場景,內存資源比較緊張的時候適用么?

內存消耗比較小。也可以設置,buffer可以調小一些。

ftrace在性能消耗比ebpf更小么?

也不一定,看使用那部分功能。

有沒有推薦的日志化性能分析的圖形工具?

tracecmd和KernelShark。

個人總結

內核源碼中放置很多靜態跟蹤節點,這些節點可以被關聯到對應的回調函數。當我想要調試某個子系統/模塊時,通過debug系統將對應的節點開啟(將回調函數掛鉤子到靜態跟蹤點上,與之關聯),這樣內核在執行到跟蹤點位置的時候會調用鉤子函數,最終執行結果將被輸出寫到一個環形日志緩存區里,通過debug系統查看信息。

作為一種內核層面的調試手段,trace event利用了ftrace框架,算是ftrace的一個應用吧。當我想要調試某一個模塊,開啟對應的節點就好了,trace event基于現有的跟蹤節點(一般是寫代碼的添加好的)效率高些,或者解決新的bug時將關鍵調試信息固化到調試系統里。

從做工作的角度,我能體會到的是trace event工具能帶來工作效率的提升。從學習的角度,我相信使用ftrace工具能更加方便觀測內核

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1366

    瀏覽量

    40236
  • Linux
    +關注

    關注

    87

    文章

    11232

    瀏覽量

    208958

原文標題:會議記錄|使用Ftrace研究Linux內核

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?421次閱讀

    詳解linux內核的uevent機制

    linux內核中,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶空間應用程序各種硬件更改或其他事件,比如插入或移除硬件設備(如USB驅動器或網絡接口)。uevent表示“用戶空間
    的頭像 發表于 09-29 17:01 ?493次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是Linux驅動開發的基礎。在編
    的頭像 發表于 08-30 15:02 ?388次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?438次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?247次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?789次閱讀

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux中實現實時計算性能,進而有效地將Linux轉變為RTOS,那么大多數發行版都可以打上名為PREE
    的頭像 發表于 04-12 08:36 ?2230次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>

    C++在Linux內核開發中從爭議到成熟

    Linux 內核郵件列表中一篇已有六年歷史的老帖近日再次引發激烈討論 —— 主題是建議將 Linux 內核的開發語言從 C 轉換為更現代的 C++。
    的頭像 發表于 01-31 14:11 ?594次閱讀
    C++在<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>開發中從爭議到成熟

    Ubuntu 24.04 LTS選用Linux 6.8為默認內核

    關于Ubuntu 24.04 LTS使用何種內核版本,一直備受關注。Canonical工程師Andrea Righi昨日宣布,Ubuntu 24.04將默認搭載Linux 6.8內核
    的頭像 發表于 01-29 11:27 ?1022次閱讀

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理:Linux內核負責管理和調度系統中的進程。它通過進程調度算法來決定哪個進程在什么時間運行以及如何分配系統資源。 內存管理:
    的頭像 發表于 01-22 14:34 ?2621次閱讀

    rk3399移植Linux內核

    RK3399是一款由中國廠商瑞芯微推出的高性能處理器芯片,被廣泛用于嵌入式系統開發。在進行應用程序開發之前,我們需要將Linux內核移植到RK3399上,以支持硬件的驅動和功能。本文將詳細介紹如何將
    的頭像 發表于 01-08 09:56 ?1071次閱讀

    RZ/G2L Linux系統如何添加新的內核模塊

    RZ/G2L Linux系統的鏡像基于yocto構建,本篇介紹如何添加新的內核模塊。
    的頭像 發表于 01-04 12:19 ?1707次閱讀
    RZ/G2L <b class='flag-5'>Linux</b>系統如何添加新的<b class='flag-5'>內核</b>模塊

    Linux內核中RCU的用法

    Linux內核中,RCU最常見的用途是替換讀寫鎖。在20世紀90年代初期,Paul在實現通用RCU之前,實現了一種輕量級的讀寫鎖。后來,為這個輕量級讀寫鎖原型所設想的每個用途,最終都使用RCU來實現了。
    的頭像 發表于 12-27 09:56 ?1676次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中RCU的用法

    獲取Linux內核源碼的方法

    (ELF1/ELF1S開發板及顯示屏)Linux內核是操作系統中最核心的部分,它負責管理計算機硬件資源,并提供對應用程序和其他系統組件的訪問接口,控制著計算機的內存、處理器、設備驅動程序和文件系統等
    的頭像 發表于 12-13 09:49 ?625次閱讀
    獲取<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>源碼的方法

    Linux內核自解壓過程分析

    uboot完成系統引導以后,執行環境變量bootm中的命令;即,將Linux內核調入內存中并調用do_bootm函數啟動內核,跳轉至kernel的起始位置。
    的頭像 發表于 12-08 14:00 ?876次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>自解壓過程分析