ftrace 是 Linux 内核中的一个跟踪工具,主要用于帮助开发者分析和调试内核的行为。ftrace 的名字来源于 “function tracer
”,它最初是用于跟踪内核函数调用的,但现在已经发展成一个功能强大的通用跟踪框架,可以跟踪函数调用、调度事件、中断、定时器、内存映射等各种内核事件。
下面是一些使用 ftrace 的基本示例:
查看当前可用的跟踪器:
$ cat /sys/kernel/debug/tracing/available_tracers
启用 function_graph 跟踪器(用于跟踪函数调用图):
$ echo function_graph > /sys/kernel/debug/tracing/current_tracer
查看跟踪结果:
$ cat /sys/kernel/debug/tracing/trace
关闭当前跟踪器:
$ echo nop > /sys/kernel/debug/tracing/current_tracer
注意:使用 ftrace 需要相应的权限,通常需要 root 权限。
trace-cmd 是一个由 Steven Rostedt 维护的用于控制和使用 Ftrace 的工具,它是 Linux 中包含的一个低开销的内核跟踪系统。
使用 trace-cmd,你可以启动和停止内核跟踪,保存和读取跟踪结果,以及列出可用的跟踪选项。
以下是一些基本的 trace-cmd 使用示例:
开始跟踪:
$ trace-cmd start -e sched_switch
这条命令开始跟踪调度器切换事件(sched_switch)。
停止跟踪并保存结果:
$ trace-cmd stop
$ trace-cmd extract -o my_trace.dat
首先停止跟踪,然后将跟踪结果保存到文件 my_trace.dat
中。
读取跟踪结果:
$ trace-cmd report my_trace.dat
这条命令将读取并打印出跟踪文件 my_trace.dat
中的内容。
以上就是一些基本的 trace-cmd 使用方法。trace-cmd 还有很多其他的功能和选项,你可以通过阅读 trace-cmd 的 man 手册或者 trace-cmd --help
来学习更多。
下面列出了一些常用的跟踪事件:
sched_switch
:这个事件记录了进程切换的信息,包括旧进程的 PID、新进程的 PID、以及他们的优先级等;
block_rq_issue/block_rq_complete
:这些事件记录了块设备请求的发出和完成;
irq_handler_entry/irq_handler_exit
:这些事件记录了中断处理程序的入口和退出;
softirq_entry/softirq_exit/softirq_raise
:这些事件记录了软中断的情况;
跟踪调度器切换事件:
$ trace-cmd record -e sched:sched_switch
该命令将开始记录 sched_switch 事件。你可以在此后执行你需要跟踪的操作。然后,使用 trace-cmd report
命令查看记录的事件。
跟踪块设备请求:
$ trace-cmd record -e block:block_rq_issue -e block:block_rq_complete
这个命令将记录块设备请求的发出和完成事件。同样,你可以使用 trace-cmd report 命令查看记录的事件。
跟踪中断处理:
$ trace-cmd record -e irq:irq_handler_entry -e irq:irq_handler_exit
这个命令将记录中断处理程序的入口和退出事件。使用 trace-cmd report 命令来查看记录的事件。
跟踪软中断:
$ trace-cmd record -e softirq:softirq_entry -e softirq:softirq_exit -e softirq:softirq_raise
这个命令将记录软中断的入口、退出和触发事件。查看记录的事件可以使用 trace-cmd report 命令。
ftrace 和 trace-cmd 都是 Linux 内核提供的跟踪工具,但是使用方式和便利程度有所不同。
ftrace 是内核中的一个特性,它提供了一个文件系统接口(位于 /sys/kernel/debug/tracing/
),可以通过读写这些文件来控制跟踪和查看跟踪结果。虽然 ftrace 功能强大,但是直接使用还是有些复杂,需要对内核的跟踪机制有一定了解。
trace-cmd 则是一个命令行工具,它对 ftrace 的接口进行了封装,提供了一种更简单易用的方式来使用 ftrace。使用 trace-cmd,你可以更方便地启动和停止跟踪、保存和读取跟踪结果,以及查看可用的跟踪选项。
总的来说,trace-cmd 提供了一种更用户友好的方式来使用 ftrace。如果你想要使用 ftrace,但又不想直接处理底层的文件系统接口,那么 trace-cmd 是一个很好的选择。
启用和使用 ftrace 功能,需要在编译 Linux 内核时,开启对应的选项。
具体来说,你需要在内核配置(.config
文件)中开启以下选项:
CONFIG_FTRACE
:这是 ftrace 的基本选项,必须开启;CONFIG_FUNCTION_TRACER
:这个选项用于启用函数跟踪器,也就是原始的 ftrace 功能。如果你想要跟踪内核函数的执行,需要开启这个选项;CONFIG_FUNCTION_GRAPH_TRACER
:这个选项用于启用函数图跟踪器,这个跟踪器可以在函数级别跟踪内核的执行流程,包括函数的调用和返回;CONFIG_DYNAMIC_FTRACE
:这个选项用于启用动态函数跟踪,这个功能可以在运行时动态地开启或关闭特定函数的跟踪;CONFIG_*_EVENTS
选项:这些选项用于启用特定类型的事件跟踪,比如调度事件、中断事件、内存映射事件等。在配置好这些选项后,你需要重新编译和安装内核。安装新内核后重启系统,ftrace 功能应该就可以使用了。