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