ftrace 是內建於 Linux 內核的跟蹤工具,從 2.6.27 開始加入主流內核。使用 ftrace 能夠調試或者分析內核中發生的事情。ftrace 提供了不一樣的跟蹤器,以用於不一樣的場合,好比跟蹤內核函數調用、對上下文切換進行跟蹤、查看中斷被關閉的時長、跟蹤內核態中的延遲以及性能問題等。系統開發人員可使用 ftrace 對內核進行跟蹤調試,以找到內核中出現的問題的根源,方便對其進行修復。另外,對內核感興趣的讀者還能夠經過 ftrace 來觀察內核中發生的活動,瞭解內核的工做機制。 linux
使用 ftrace ,首先要將其編譯進內核。內核源碼目錄下的 kernel/trace/Makefile 文件給出了 ftrace 相關的編譯選項。 框架
CONFIG_FUNCTION_TRACER CONFIG_FUNCTION_GRAPH_TRACER CONFIG_CONTEXT_SWITCH_TRACER CONFIG_NOP_TRACER CONFIG_SCHED_TRACER ... |
ftrace 相關的配置選項比較多,針對不一樣的跟蹤器有各自對應的配置選項。不一樣的選項有不一樣的依賴關係,內核源碼目錄下的 kernel/trace/Kconfig 文件描述了這些依賴關係。讀者能夠參考 Makefile 文件和 Konfig 文件,而後選中本身所須要的跟蹤器。 jsp
一般在配置內核時,使用 make menuconfig 會更直觀一些。以 2.6.33.1 版本的內核爲例,要將 ftrace 編譯進內核,能夠選中 Kernel hacking (圖 1 )下的 Tracers 菜單項(圖 2 )。 函數
進入 Tracers 菜單下,能夠看到內核支持的跟蹤器列表。如圖 3 所示,這裏選中了全部的跟蹤器,讀者能夠根據本身的須要選中特定的跟蹤器。 工具
這裏要注意,若是是在 32 位 x86 機器上,編譯時不要選中 General setup 菜單項(圖 4 )下的 Optimize for size 選項(圖 5 ),不然就沒法看到圖 3 中的 Kernel Function Graph Tracer 選項。這是由於在 Konfig 文件中,針對 32 位 x86 機器,表項 FUNCTION_GRAPH_TRACER 有一個特殊的依賴條件: 性能
depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE |
ftrace 經過 debugfs 向用戶態提供了訪問接口,因此還須要將 debugfs 編譯進內核。激活對 debugfs 的支持,能夠直接編輯內核配置文件 .config ,設置 CONFIG_DEBUG_FS=y ;或者在 make menuconfig 時到 Kernel hacking 菜單下選中對 debugfs 文件系統的支持,如圖 6 所示。 測試
配置完成後,編譯安裝新內核,而後啓動到新內核。 注意,激活 ftrace 支持後,編譯內核時會使用編譯器的 -pg 選項,這是在 kernel/trace/Makefile 文件中定義的,如清單 2 所示。
ifdef CONFIG_FUNCTION_TRACER ORIG_CFLAGS := $(KBUILD_CFLAGS) KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) ... endif ... |
使用 -pg 選項會在編譯獲得的內核映像中加入大量的調試信息。通常狀況下,只是在開發測試階段激活 ftrace 支持,以調試內核,修復 bug 。最終用於發行版的內核則會關閉 -pg 選項,也就沒法使用 ftrace。
ftrace 經過 debugfs 向用戶態提供訪問接口。配置內核時激活 debugfs 後會建立目錄 /sys/kernel/debug ,debugfs 文件系統就是掛載到該目錄。要掛載該目錄,須要將以下內容添加到 /etc/fstab 文件:
debugfs /sys/kernel/debug debugfs defaults 0 0 |
或者能夠在運行時掛載:
mount -t debugfs nodev /sys/kernel/debug |
激活內核對 ftrace 的支持後會在 debugfs 下建立一個 tracing 目錄 /sys/kernel/debug/tracing 。該目錄下包含了 ftrace 的控制和輸出文件,如圖 7 所示。根據編譯內核時針對 ftrace 的設定不一樣,該目錄下實際顯示的文件和目錄與這裏也會不一樣。
/sys/kernel/debug/trace 目錄下文件和目錄比較多,有些是各類跟蹤器共享使用的,有些是特定於某個跟蹤器使用的。在操做這些數據文件時,一般使用 echo 命令來修改其值,也能夠在程序中經過文件讀寫相關的函數來操做這些文件的值。下面只對部分文件進行描述,讀者能夠參考內核源碼包中 Documentation/trace 目錄下的文檔以及 kernel/trace 下的源文件以瞭解其他文件的用途。
ftrace 當前包含多個跟蹤器,用於跟蹤不一樣類型的信息,好比進程調度、中斷關閉等。能夠查看文件 available_tracers 獲取內核當前支持的跟蹤器列表。在編譯內核時,也能夠看到內核支持的跟蹤器對應的選項,如以前圖 3 所示。
ftrace 還支持其它一些跟蹤器,好比 initcall、ksym_tracer、mmiotrace、sysprof 等。ftrace 框架支持擴展添加新的跟蹤器。讀者能夠參考內核源碼包中 Documentation/trace 目錄下的文檔以及 kernel/trace 下的源文件,以瞭解其它跟蹤器的用途和如何添加新的跟蹤器。
本系列文章對 ftrace 的配置和使用進行了介紹。本文是其中的第一部分,介紹了 ftrace 的編譯配置、用戶態訪問 ftrace 的接口和 ftrace 的數據文件,並對 ftrace 所提供的部分跟蹤器的用途進行了描述。因爲篇幅的限制,本文沒有對 ftrace 的具體使用和如何在代碼中與 ftrace 進行交互進行描述,這些內容將分別在本系列文章的後續篇章中給出。