1. 程式人生 > >ftrace利器之trace-cmd和kernelshark

ftrace利器之trace-cmd和kernelshark

-s pre dir fin 配置使用 IE com 如果 wake

關鍵詞:ftrace、trace-cmd、kernelshark

trace-cmd是設置讀取ftrace的命令行工具,kernelshark既可以記錄數據,也可以圖形化分析結果。

trace-cmd和kernelshark源碼都由kernel.org維護在trace-cmd.git

kernekshark還有自己的幫助網站kernelshark.org

1. trace-cmd編譯安裝

可以通過git下載trace-cmd相關代碼:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git

trace-cmd編譯安裝也比較簡單

make install--------------------------只安裝trace-cmd

make install_gui--------------------安裝trace-cmd和kernelshark

2. trace-cmd的使用

2.1 trace-cmd -h

trace-cmd version 2.5.6

usage:
trace-cmd [COMMAND] ...

commands:
record - record a trace into a trace.dat file
start - start tracing without recording into a file
extract - extract a trace from the kernel------------------------------------------------將系統當前的trace保存到trace.dat中。


stop - stop the kernel from recording trace data-------------------------------------start和stop配置使用,用於開始停止錄制。
restart - restart the kernel trace data recording
show - show the contents of the kernel tracing buffer------------------------------讀取/sys/kernel/debug/tracing/trace
reset - disable all kernel tracing and clear the trace buffers----------------------對ftrace的設置和ring buffer復位

report - read out the trace stored in a trace.dat file
stream - Start tracing and read the output directly----------------------------------實時在shell中顯式ftrace結果
profile - Start profiling and read the output directly
hist - show a historgram of the trace.dat information-------------------------------對trace.dat顯式統計信息
stat - show the status of the running tracing (ftrace) system---------------------顯示當前ftrace的events、ring buffer等情況
split - parse a trace.dat file into smaller file(s)
options - list the plugin options available for trace-cmd report
listen - listen on a network socket for trace clients
list - list the available events, plugins or options-------------------------------------顯示當前ftrace支持的events、tracers、options
restore - restore a crashed record
snapshot - take snapshot of running trace
stack - output, enable or disable kernel stack tracing------------------------------echo 1 > /proc/sys/kernel/stack_tracer_enabled打開stack_tracer,然後trace-cmd stack查看
check-events - parse trace event formats

trace-cmd record開始記錄,ctrl+c停止記錄並保存到trace.dat中。

還可以通過trace-cmd reset對各種設置進行復位,然後trace-cmd start進行錄制,trace-cmd stop停止錄制,trace-cmd extract將數據保存到trace.dat中。

2.2 trace-cmd record

trace-cmd record用於錄制ftrace信息,通過如下選項可以指定只跟蹤特定traceevents,或者跟蹤特定pid、或者跟蹤特定funtion/function_graph函數。

還可以設置cpumask、ringbuffer大小等等。

usage:
trace-cmd record [-v][-e event [-f filter]][-p plugin][-F][-d][-D][-o file] \
[-s usecs][-O option ][-l func][-g func][-n func] \
[-P pid][-N host:port][-t][-r prio][-b size][-B buf][command ...]
[-m max][-C clock]
-e run command with event enabled-----------------------------------------------------指定只抓取某一事件或者某一類型事件
-f filter for previous -e event
-R trigger for previous -e event
-p run command with plugin enabled
-F filter only on the given process
-P trace the given pid like -F for the command-----------------------------------------只跟蹤某一個pid
-c also trace the childen of -F
-C set the trace clock
-T do a stacktrace on all events
-l filter function name
-g set graph function
-n do not trace function
-m max size per CPU in kilobytes
-M set CPU mask to trace------------------------------------------------------------------這5個選項對應ftrace的設置set_ftrace_filter、set_graph_function、set_ftrace_notrace、buffer_size_kb、tracing_cpumask。
-v will negate all -e after it (disable those events)
-d disable function tracer when running
-D Full disable of function tracing (for all users)
-o data output file [default trace.dat]-----------------------------------------------------指定輸出文件名
-O option to enable (or disable)
-r real time priority to run the capture threads
-s sleep interval between recording (in usecs) [default: 1000]--------------------默認1ms保存一次數據,加大有利於將此操作頻率。1000000變成1s寫一次數據。
-S used with --profile, to enable only events in command line
-N host:port to connect to (see listen)
-t used with -N, forces use of tcp in live trace
-b change kernel buffersize (in kilobytes per CPU)-----------------------------------改變ring buffer大小
-B create sub buffer and folling events will be enabled here
-k do not reset the buffers after tracing.
-i do not fail if an event is not found
--profile enable tracing options needed for report --profile
--func-stack perform a stack trace for function tracer
(use with caution)

如下表示只記錄sched_switch和sched_wakeup兩個時間,每1s寫入一次數據。

trace-cmd record -e sched_switch -e sched_wakeup -s 1000000

一個不大不小的坑!正確發送ctrl+c

在使用trace-cmd record記錄事件的時候,通過ctrl+c可以停止記錄。

但是如果在adb shell中,ctrl+c可能優先退出了shell,而沒有正常停止trace-cmd record。

最終在目錄下只有trace.dat.cpuX的文件,這些文件是中間文件,kernelshark是無法解析的

解決方法有兩種,一是在串口console中ctrl+c,另一種是通過kill發送SIGINT信號kill -2 pid。

2.3 trace-cmd stat/

3. kernelshark的使用

3.1 kernelshark記錄事件

通過菜單欄執行Capture->Record,會彈出Capture對話框。

常用的設置有Events和Plugin,比如這裏設置了sched_switch和sched_wakeup兩個事件,選擇了function_graph插件。

然後開始Run,停止使用Stop。

Close關閉後,可以在Kenelshark中查看細節。

可以看出這裏不光顯示了sched_switch和sched_wakeup事件,同時還顯示了function_graph函數調用。

技術分享圖片

3.2 kernelshark分析結果

3.2.1 加載trace.dat

通過File->Load data加載trace-cmd record記錄的數據,然後開始分析。

默認界面如下:

技術分享圖片

3.2.2 過濾功能

通常獲取的數據需要進行一些過濾,才能發現問題。

filter提供了豐富的過濾功能,在File中提供了加載Load filter、保存Save filter、到處Export filter等功能。

具體在Filter中提供三類功能,分別針對事件events、進程tasks、CPU;還有兩個菜單決定是否同步顯式Filter結果。

task-打開某些task、關閉某些task;event-事件過濾以及高級事件過濾;cpu-開關某些cpu跟蹤。

以最常用的場景,只想關註某些進程的內容:

技術分享圖片

3.4 圖表擴展

橫軸圖表提供了兩大類:CPU和進程。

cpu-每個cpu一個plot;task-可以選擇不同task,一個task一個plot。

比如在Filter->tasks選定fork_rr_affinity,同時在Plots中選定fork_rr_affinity之後。

增加了4個plots,並且CUP0只顯示了fork_rr_affinity相關執行情況,CPU1沒有調度,說明affinity設置成功。

技術分享圖片

3.4 其它功能

還有一些其它有用的功能,比如搜索功能,選定要搜索的Column,文本框中輸入字符串即可。

勾選graph follows,可以實現Plots和下面的events同步顯示。

技術分享圖片

鼠標向右拖拉可以放大選擇區域;向左拖拉則縮小當前選擇區域。

向左向右調整顯式區域,有助於全局或者細節查看執行情況。

4. 小結

trace-cmd作為ftrace的前端,對ftrace的各種設置進行包裝,同時能對結果進行處理,極大地提高了ftrace的使用效率。

kernelshark作為trace-cmd的前端,借助圖形化,靈活的filter,縮放功能,能更有效的幫助分析,高效的得到結果。

ftrace利器之trace-cmd和kernelshark