简介
ftrace是Linux内核提供的,可动态捕获内核函数调用栈的工具,排查内核相关问题,必备良药
使用要求
想要使用ftrace,对内核版本及其编译选项均有如下要求:
1.内核版本2.6.27及以上
2.编译内核时,需要使能所你需要的trace类型(3.10的话本质只提供的几个可选项)
使用说明
当你已经编译完成并替换好内核后,便可以使用ftrace对某一操作的内核行为进行分析了,ftrace所涉及的文件结构如下图所示:
下面对常用的文件进行说明:
/* 所有跟踪器,常用公共配置文件: */
[root@localhost tracing]# cat available_tracers #内核目前所支持的追踪类型
hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop
[root@localhost tracing]# cat tracing_on #开/关追踪功能
1
[root@localhost tracing]# cat current_tracer #设置当前追踪类型,nop表示啥也不追踪
nop
[root@localhost tracing]# cat available_filter_functions #ftrace可支持的内核函数名称,位于该文件内的函数,写入set_ftrace_filter才有效
/* function跟踪器常用配置文件: */
[root@localhost tracing]# cat set_ftrace_filter #需要跟踪的函数名称
#### all functions enabled ####
[root@localhost tracing]# cat options/func_stack_trace #开/关函数调用栈追踪功能
1
[root@localhost tracing]# cat trace_options #显示出当前所选择的跟踪器的option配置(function跟踪器内容如下)
/* function_graph跟踪器,常用配置文件(3.10.0上无法配置跟踪函数调用栈所以一般还是用function): */
[root@localhost tracing]# cat set_graph_function #指定function_graph跟踪器需要跟踪的函数
#### all functions enabled ####
[root@localhost tracing]# cat max_graph_depth #设置function_graph跟踪函数嵌套的最大深度
10
举例
下面采用Centos7,3.10.0内核版本,以设置中断为例子,演示如何使用function跟踪器实现内核函数调用栈的跟踪(此内核版本对function_graph跟踪器的功能有限,遂尚不用此举例)
1.配置当前跟踪器为function:
[root@localhost tracing]# echo function > current_tracer
2.设定所跟踪的内核函数为irq_do_set_affinity:
[root@localhost tracing]# echo irq_do_set_affinity > set_ftrace_filter
3.检查下option里是否开启了函数调用栈跟踪:
[root@localhost tracing]# cat trace_options
print-parent
nosym-offset
nosym-addr
noverbose
noraw
nohex
nobin
noblock
nostacktrace
trace_printk
noftrace_preempt
nobranch
annotate
nouserstacktrace
nosym-userobj
noprintk-msg-only
context-info
nolatency-format
sleep-time
graph-time
record-cmd
overwrite
nodisable_on_free
irq-info
markers
function-trace
func_stack_trace#启用了函数调用栈跟踪
4.开启跟踪:
[root@localhost tracing]# echo 1 > tracing_on
5.先清空一下trace中现有的内容:
[root@localhost tracing]# echo > trace
6.配置一个中断号的中断亲和性:
[root@localhost Desktop]# echo 0 > /proc/irq/16/smp_affinity_list
7.查看trace中的内容:
[root@localhost tracing]# cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 2/2 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
kworker/0:1-25 [000] d.h. 738.204946: irq_do_set_affinity <-irq_move_masked_irq
kworker/0:1-25 [000] d.h. 738.204955: <stack trace>
=> handle_fasteoi_irq
=> handle_irq
=> do_IRQ
=> ret_from_intr
=> process_one_work
=> worker_thread
=> kthread
=> ret_from_fork_nospec_end
可以看到内核函数的调用栈情况