Ftrace淺析

      Ftrace是系統的內部追蹤器,這個設計是爲了幫助開發人員和設計人員去查找Kernel內部發生的情況,他還可以用來分析和調試用戶空間之外的延遲和性能問題。

       儘管通常將ftrace視爲函數跟蹤器,但實際上它是多個分類跟蹤實用程序的框架,可以進行延遲跟蹤,以檢查禁用和啓用的中斷之間發生了什麼,以及搶佔以及從喚醒任務到計劃任務的時間。

        ftrace最常見的用途之一是事件跟蹤。 整個內核中有數百個靜態事件點,可以通過tracefs文件系統啓用這些事件點,以查看內核某些部分的情況。有關更多信息,請參見events.txt。

       

使用例子:分析Androbench的讀寫調用情況

(1)使用function_graph:

echo 0 > sys/kernel/debug/tracing/tracing_on (關閉trace)

echo    > /sys/kernel/debug/tracing/trace (清除trace文件的緩存內容)

echo function_graph > /sys/kernel/debug/tracing/tracing_on (設置追蹤器爲function_graph)

echo vfs_read(或者vfs_write) > /sys/kernel/debug/tracing/set_graph_function

echo funcgraph-proc > /sys/kernel/debug/tracing/trace_options (顯示當前的進程)

echo 1 > /sys/kernel/debug/tracing/tracing_on (打開trace)

adb pull /sys/kernel/debug/tracing/trace 本地路徑 (將抓取的trace文件導出到本地)

注意:

a. 在跑Androbench的時候最好同時將trace文件導出到本地,因爲trace文件是有緩存空間限制的,如果抓取的trace文件太大,後面抓的trace信息會覆蓋前面抓的trace內容,

trace文件的緩存空間查看如下:可以自己根據情況動態調節

 # cat buffer_size_kb (查看單個CPU的trace文件緩存大小)

1408 (units kilobytes) 
 # cat buffer_total_size_kb (查看所以CPU的trace文件緩存大小)

5632 (units kilobytes) 

b. 我們在運行Androbench的時候,在終端敲入top命令可以看到有一個com.androbench的進程,這個只是一個UI Thread, 這個進程本身沒有執行讀寫的動作,所以你執行下面這個命令去trace這個進程的PID追蹤的話會丟失很多vfs_read/vfs_write的如direct_io, submit_bio等信息,真正執行讀寫的動作是fork一些子進程去執行讀寫的(順序讀寫,隨機讀寫,數據庫讀寫),不加下面這條可以抓到真正的vfs_read/vfs_write信息,當然也會抓到direct_io和submit_bio等調用的trace信息,Androbench讀寫是直接IO的,不經過Pach Cache, 不是buffer io, 會進一步貼近UFS/eMMC器件本身的Performance, 這個Androbench讀寫是direct io方方式還我們從抓取到ftrace信息就可以看的到,

echo com.androbench2的PID > /sys/kernel/debug/tracing/set_ftrace_pid 

(2)使用nop ,以ufs器件舉例

echo 0 > sys/kernel/debug/tracing/tracing_on (關閉trace)

echo    > /sys/kernel/debug/tracing/trace (清除trace文件的緩存內容)

echo   1 > /sys/kernel/debug/tracing/events/ext4/enable (設置ext4文件系統相關的trace point)

echo   1 > /sys/kernel/debug/tracing/events/ufs/enable   (設置ufs block driver驅動層即LLD Driver相關的trace point)

echo   1 > /sys/kernel/debug/tracing/events/block/enable (設置block 通用塊設備層相關的trace point)

echo   1 > /sys/kernel/debug/tracing/events/scsi/enable  (設置 scsi 上層 即scsi mid layer的相關的trace point)

echo 1 > /sys/kernel/debug/tracing/tracing_on (打開trace)

adb pull /sys/kernel/debug/tracing/trace 本地路徑  (將抓取的trace文件導出到本地)

 

        

 

 

 

 

 

參考文件:Documentation\trace\ftrace.txt

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章