ftrace主要是用来帮助开发人员了解Linux内核的运行轨迹,以便进行故障调试或性能分析。它是在2.6.27内核
中开始出现的,自此以后,不断有新的tracer加入,到2.6.30为止最少已经有10种tracer。具体的tracer可以参阅
/Documentation/trace/ftrace.txt。
本文主要说明ftrace的使用方法:
要使用ftrace必须在内核中首先添加对其的支持,也就是要重新编译一个新的内核。
Kernel hacking
Tracers
Kernal Function Tracer
Kernal Function Graph Tracer
。。。。。。。
依
次将这些选项编译进内核中。这样,在新编译的内核上,你就可以尽情的享用ftrace带给你的便利。这里要说明一下,ftrace是以debugfs为出
口,读出内核信息的。而在debugfs配置到内核时,将会创建一个/sys/kernel/debug目录,我们所要查看的内核信息都要从该目录下获
得。
首先,要挂载debugfs。在运行时使用如下命令进行挂载
sudo mount -t debugfs nodev /sys/kernel/debug/
也可以把它添加在/etc/fstab文件中。
接下来,为了便于访问,通过建立软链接,将/sys/kernel/debug目录链接/debug目录下,(2.6.30中已经有/debug目录,早一点内核可能没有),如果没有,可以手工创建。
wuting@wuting-desktop:~$ sudo ln -s /sys/kernel/debug/tracing/ /debug/
wuting@wuting-desktop:~$ ls /debug/
Tracing
用ls命令可以看到在tracing目录下有如下文件
wuting@wuting-desktop:~$ ls /debug/tracing
available_events events saved_cmdlines stack_max_size trace_stat
available_filter_functions failures set_event stack_trace tracing_cpumask
available_tracers options set_ftrace_filter trace tracing_enabled
buffer_size_kb per_cpu set_ftrace_notrace trace_marker tracing_max_latency
current_tracer printk_formats set_ftrace_pid trace_options tracing_on
dyn_ftrace_total_info README set_graph_function trace_pipe tracing_thresh
除目录(绿色)外,这里的文件都可以通过echo命令进行写入操作,用cat命令进行读操作。这样,我们就可以利用echo和cat对ftrace进行配置。
最后,举例说明ftrace的具体用法。
echo function_graph > /debug/tracing/current_tracer //配置使用Function graph tracer来跟踪函数调用。
echo 10000 > /debug/tracing/buffer_size_kb//配置ring buffer的大小为10000KB
echo 1 > /debug/tracing/tracing_enabled //使能trace
/*执行需要跟踪的程序,如ls,*/
ls -l
echo 0 > /debug/tracing/tracing_enabled //禁止trace
cat /debug/tracing/trace > trace.txt //读取跟踪信息,为了便于查看将其重定向到文件
打开trace.txt,可以看到,内核函数之间的调用关系,以图形化的形式显示在我们眼前。其中,第一列表示在那个CPU上执行的,第二列是函数执行所用的时间,加号(+)表示有延迟,第三列是函数之间的调用关系。
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
0) + 55.570 us | }
0) 0.675 us | strncpy();
0) + 58.825 us | }
0) + 61.605 us | }
0) 0.465 us | strcmp();
0) | kallsyms_lookup() {
0) | is_ksym_addr() {
0) 0.455 us | in_gate_area_no_task();
0) 1.375 us | }
0) | module_address_lookup() {
0) + 55.645 us | get_ksymbol();
0) 0.685 us | strncpy();
0) + 58.525 us | }
0) + 61.315 us | }
0) 0.465 us | strcmp();
...................
总结一下,ftrace的使用过程就是:
●选择一种tracer
●使能tracer
●执行需要trace的应用程序
●关闭ftrace
●查看trace文件
阅读(890) | 评论(0) | 转发(0) |