您好,登錄后才能下訂單哦!
這篇文章主要講解了“Linux內核ftrace怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Linux內核ftrace怎么使用”吧!
什么是 ftrace
我們可以將ftrace理解為Function tracer的簡稱,可以看出其基本功能是實現函數調用的跟蹤。其實ftrace不僅僅用于進行函數調用的跟蹤,其它很多內核信息都可以通過該工具進行跟蹤。
除了上面函數調用跟蹤外,ftrace 還能幫我們分析內核特定的事件,比如調度,中斷等;它還能幫我們去追蹤延遲,比如中斷被屏蔽,搶占被禁止的時間,以及喚醒一個進程之后多久開始執行的時間等等。
因此可以理解,ftrace其實為我們提供了一個透視內核的工具,這就像醫院的CT機或者核磁共振一樣,通過該工具我們可以了解內核內部的更多細節。下面我們羅列出該工具的主要功能,大家可以作為參考:
(1) Function tracer 和 Function graph tracer:跟蹤函數調用。
(2) Schedule switch tracer:跟蹤進程調度情況。
(3) Preemptoff tracer:和前一個 tracer 類似,preemptoff tracer 跟蹤并記錄禁止內核搶占的函數,并清晰地顯示出禁止搶占時間最長的內核函數。
(4) Preemptirqsoff tracer:同上,跟蹤和記錄禁止中斷或者禁止搶占的內核函數,以及禁止時間最長的函數。
(5) Branch tracer:跟蹤內核程序中的 likely/unlikely 分支預測命中率情況。 Branch tracer 能夠記錄這些分支語句有多少次預測成功。從而為優化程序提供線索。
(6) Hardware branch tracer:利用處理器的分支跟蹤能力,實現硬件級別的指令跳轉記錄。在 x86 上,主要利用了 BTS 這個特性。
(7) Sysprof tracer:缺省情況下,sysprof tracer 每隔 1 msec 對內核進行一次采樣,記錄函數調用和堆棧信息。
(8) Kernel memory tracer:內存 tracer 主要用來跟蹤 slab allocator 的分配情況。包括 kfree,kmem_cache_alloc 等 API 的調用情況,用戶程序可以根據 tracer 收集到的信息分析內部碎片情況,找出內存分配最頻繁的代碼片斷,等等。
(9) Initcall tracer:記錄系統在 boot 階段所調用的 init call 。
(10) Mmiotrace tracer:記錄 memory map IO 的相關信息。
(11) Power tracer:記錄系統電源管理相關的信息。
(12) Workqueue statistical tracer:這是一個 statistic tracer,統計系統中所有的 workqueue 的工作情況,比如有多少個 work 被插入 workqueue,多少個已經被執行等。開發人員可以以此來決定具體的 workqueue 實現,比如是使用 single threaded workqueue 還是 per cpu workqueue.
(13) Event tracer:跟蹤系統事件,比如 timer,系統調用,中斷等。
(14) Wakeup tracer:跟蹤進程的調度延遲,即高優先級進程從進入 ready 狀態到獲得 CPU 的延遲時間。該 tracer 只針對實時進程。
(15) Irqsoff tracer:當中斷被禁止時,系統無法相應外部事件,比如鍵盤和鼠標,時鐘也無法產生 tick 中斷。這意味著系統響應延遲,irqsoff 這個 tracer 能夠跟蹤并記錄內核中哪些函數禁止了中斷,對于其中中斷禁止時間最長的,irqsoff 將在 log 文件的第一行標示出來,從而使開發人員可以迅速定位造成響應延遲的罪魁禍首。
ftrace的基本用法
ftrace的基本用法其實是比較簡單的。以Ubuntu18.04為例,我們只需要在current_tracer文件中輸入function字符串即可。具體操作步驟如下:
cd /sys/kernel/debug/tracing echo function > current_tracer
當執行上述命令后,我們用vim命令打開該目錄下面一個名為trace的文件,此時就可以函數調用情況。
如果查看該文件,可能會發現有幾萬個函數調用,估計看著就頭大。其實它的功能要強大的多,比如我們通過function_graph實現調用棧的層級關系,此時可以更加方便的理清函數調用關系。同時,我們還可實現函數名稱的過濾,比如只抓取某些,或者不抓取某些函數等等。
有些版本的操作系統可能不能直接使用該功能,這就需要進行一些配置。關于這些配置,本文暫不介紹,后續專門進行相關介紹。
ftrace的實現原理概述
ftrace最早用于跟蹤函數調用,后來隨著需求的增加,ftrace演變為一個框架。也就是我們前面介紹的對內核各種探測的功能。
整個ftrace的架構如圖所示,其整體分為兩層,核心部分是內核框架和一些捕獲信息的插件,其中函數調用就是其中一個插件;另外一部分則是用戶態的一些輔助工具集。
可以看出,在內核中核心的是ftrace框架,具體功能組件是各種插件,也就是tracers。如果需要跟蹤具體的內容,則該tracer需要注冊到框架當中。tracer捕獲的信息會輸出到一個環形緩沖區中。整個框架中需要用到另外一個內核模塊,也就是debugfs模塊。該模塊實現了用戶態與內核的交互。
內核態的代碼在kernel/trace目錄下面,該下面是ftrace框架和各個tracer的代碼。如下圖所示,可以看出tracer還是比較多的。
整個ftrace的代碼量也并不是特別多,大概有4萬多行的樣子。所以,目前ftrace確實是一個非常強大的內核狀態監測工具。
感謝各位的閱讀,以上就是“Linux內核ftrace怎么使用”的內容了,經過本文的學習后,相信大家對Linux內核ftrace怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。