?哈嘍,大家好,我是小G。
前言
ftrace 功能很強大,不僅能跟蹤代碼流程,也能用來分析性能問題。對于 Linux 和 Android 平臺的學習和開發(fā)人員來說 ,能夠熟練使用 ftrace 的話,是非常強大的生產(chǎn)力,非常尤其要深入和快速學習linux內(nèi)核相關流程,也非常有用。
我也是在努力學習中,目前能進行一些簡單的性能問題分析,常用的主要還在使用 ftrace 熟悉和學習 linux 內(nèi)核函數(shù)和相關流程,更好的理解工作中涉及到的內(nèi)核層面知識。所以用的 最多的是ftrace 的 function、function_graph ?這兩個跟蹤器。
在學習使用? function、function_graph 之前,需要先了解一些,ftrace 相關的一些數(shù)據(jù)和節(jié)點文件知識。
正文
最新的linux 內(nèi)核,ftrace 所有相關數(shù)據(jù)和文件節(jié)點都位于?/sys/kernel/tracing 目錄下。
ftrace部分數(shù)據(jù)和文件節(jié)點說明:
文件..................... | 用途......................... |
---|---|
README | README文件提供了一個簡短的使用說明,展示了ftrace的操作命令序列??梢酝ㄟ^cat命令查看該文件以了解概要的操作流程。 |
current_tracer | current_tracer用于設置或顯示當前使用的跟蹤器;使用echo將跟蹤器名字寫入該文件可以切換到不同的跟蹤器。系統(tǒng)啟動后,其缺省值為nop,即不做任何跟蹤操作。在執(zhí)行完一段跟蹤任務后,可以通過向該文件寫入nop來重置跟蹤器。 |
available_tracers | available_tracers記錄了當前編譯進內(nèi)核的跟蹤器的列表,可以通過cat查看其內(nèi)容。寫current_tracer文件時用到的跟蹤器名字必須在該文件列出的跟蹤器名字列表中。 |
trace | trace文件提供了查看獲取到的跟蹤信息的接口??梢酝ㄟ^cat等命令查看該文件以查看跟蹤到的內(nèi)核活動記錄,也可以將其內(nèi)容保存為記錄文件以備后續(xù)查看。 |
...... | ... |
set_graph_function | set_graph_function設置要清晰顯示調(diào)用關系的函數(shù),顯示的信息結構類似于C語言代碼,這樣在分析內(nèi)核運作流程時會更加直觀一些。在使用function_graph跟蹤器時使用;缺省為對所有函數(shù)都生成調(diào)用關系序列,可以通過寫該文件來指定需要特別關注的函數(shù)。 |
buffer_size_kb | buffer_size_kb用于設置單個CPU所使用的跟蹤緩存的大小。跟蹤器會將跟蹤到的信息寫入緩存,每個CPU的跟蹤緩存是一樣大的。跟蹤緩存實現(xiàn)為環(huán)形緩沖區(qū)的形式,如果跟蹤到的信息太多,則舊的信息會被新的跟蹤信息覆蓋掉。
說明: 要更改該文件的值需要先將“current_tracer”設置為“nop”才可以。 |
tracing_on | tracing_on用于控制跟蹤的暫停。有時候在觀察到某些事件時想暫時關閉跟蹤,可以將0寫入該文件以停止跟蹤,這樣跟蹤緩沖區(qū)中比較新的部分是與所關注的事件相關的;寫入1可以繼續(xù)跟蹤。 |
available_filter_functions | available_filter_functions記錄了當前可以跟蹤的內(nèi)核函數(shù)。對于不在該文件中列出的函數(shù),無法跟蹤其活動。 |
set_ftrace_filter、
set_ftrace_notrace |
set_ftrace_filter和?set_ftrace_notrace在編譯內(nèi)核時配置了動態(tài)ftrace(選中 CONFIG_DYNAMIC_FTRACE 選項)后使用。前者用于顯示指定要跟蹤的函數(shù),后者則作用相反,用于指定不跟蹤的函數(shù)。如果一個函數(shù)名同時出現(xiàn)在這兩個文件中,則這個函數(shù)的執(zhí)行狀況不會被跟蹤。這些文件還支持簡單形式的含有通配符的表達式,這樣可以用一個表達式一次指定多個目標函數(shù)。缺省為可以跟蹤所有內(nèi)核函數(shù),文件set_ftrace_notrace的值則為空。
說明: 要寫入這兩個文件的函數(shù)名必須可以在文件available_filter_functions中看到。 |
ftrace部分跟蹤器說明:
ftrace包含多個跟蹤器,用于跟蹤不同類型的信息,例如進程調(diào)度、中斷關閉等??梢酝ㄟ^ available_tracers 獲取內(nèi)核當前支持的跟蹤器列表。常見的跟蹤器有:
跟蹤器.............. | 說明....................... |
---|---|
nop | nop跟蹤器不會跟蹤任何內(nèi)核活動,將nop寫入current_tracer文件可以刪除之前所使用的跟蹤器,并清空之前收集到的跟蹤信息,即刷新trace文件。 |
function | function跟蹤器可以跟蹤內(nèi)核函數(shù)的執(zhí)行情況,可以通過文件set_ftrace_filter顯示指定要跟蹤的函數(shù)。 |
function_graph | function_graph跟蹤器可以顯示類似C源碼的函數(shù)調(diào)用關系圖,這樣查看起來比較直觀一些,可以通過文件 set_graph_function顯示指定要生成調(diào)用流程圖的函數(shù)。 |
sched_switch | sched_switch跟蹤器可以對內(nèi)核中的進程調(diào)度活動進行跟蹤。 |
irqsoff、
preemptoff |
irqsoff跟蹤器和?preemptoff跟蹤器分別跟蹤關閉中斷的代碼和禁止進程搶占的代碼,并記錄關閉的最大時長,preemptirqsoff跟蹤器則可以看做它們的組合。 |
ftrace還支持其它一些跟蹤器,了解更多可查看詳細內(nèi)核文檔和源碼?!癉ocumentation/trace”目錄下的文檔以及“kernel/trace”下的源文件。
下一篇,將會看下具體如何使用 function 和 function_graph 。