Linux version : 2.6.35.4 (CentOS)
1. Ftrace 是內建的tracker,在編譯核心時可以到選單裡的<kernel hacking>選擇 (因為不太熟悉各選項的用途,因次我全選了= _=)
2. 選完後開始編譯
make à make modules_install
à make install àreboot
3. 到 /sys/kernel/debug , 將 debugfs mount上去
# mount –t debugfs
nodev /sys/kernel/debug
4. 現在可以到 /sys/kernel/debug/tracing下, 會看到一大堆檔案
可以查看 available_tracers 看看有那些tracer可以用
5. 使用 tracer的步驟
(a) 關閉 tracing_enabled (0是closed, 1 是 opened)
# echo 0 >
tracing_enabled
(b) 打開 ftraced_enabled (不太清楚原因
# echo 1 >
/proc/sys/kernel/ftrace_enabled
(c) 選擇目前要用的tracer
# echo … >
current_tracer
(d) 設定要跟蹤的函數到 set_ftrace_filter
# echo … >
set_ftrace_filter
(e) 打開 tracing enabled
# echo 1 >
tracing_enabled
(f) 執行想要追蹤的程式或做其他事, ftrace會開始追蹤kernel
(g) 結束追蹤
# echo 0 >
tracing_enabled
或暫停追蹤(tracer只是暫停沒有結束
# echo 0 >
tracing_on
(h) 看結果囉!
# cat trace
可以搭配 grep指令列出想看的東西
# cat trace |
grep test (test是我剛剛執行的執行檔)
或是 >> 將 trace輸出成自己的檔案
# cat trace
>> /trace1 (輸出到跟目錄下 檔名為 trace1)
6. 我這一次觀察了2種 tracer
(a) Function
會列出function執行的順序
下圖是我執行 test 之後的tracer, 我有用
filter鎖定我要看的函數, 也就是主要做context_switch的schedule了
欄位意思大概是這樣
TASK-PID
|
Cpu#
|
TIMESTAMP
|
FUNCTION
|
<test>-5049
|
000
|
13211.469334
|
Scheduleßwork_resched
|
Process test pid
5049正在執行, 使用編號 0的CPU, 時間是timestamp, 正由work_resched呼叫schedule function
看樣子應該是準備進行contest switch了
我的test就是會讓他睡8次的一支程式(作業需要XD)
所以可以看到8個nanosleep呼叫schedule準備把控制權交出來然後去睡覺
(a) Sched_switch
列出 context switch的info
下圖是使用sched_switch看process 做context switchc的情況
我用 grep test 過濾出我想看的, 欄位意思大概是
TASK-PID
|
Cpu#
|
TIMESTAMP
|
FUNCTION
|
<test>-5182
|
000
|
14456.847013
|
(*)
|
(*): 5182:120:S
== > [000] 0:120:R <idle>
pid 5182, priority 120,目前狀態S代表
TASK_INTERRUPTIBLE可中斷睡眠狀態
== >代表轉移控制權( + 可能是代表正在叫醒某Process)
7. Reference
沒有留言:
張貼留言