2021-05-12 14:32:11
Linux核心效能分析利器之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。
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,縮放功能,能更有效的幫助分析,高效的得到結果。
相關文章