什么是ftrace
ftrace是 Linux 内核中一个功能强大的跟踪框架,用于跟踪和分析内核及其模块的执行情况。它提供了一系列工具和功能,帮助开发者调试内核、分析性能瓶颈、查看系统调用、函数调用、上下文切换等信息。
ftrace
的主要功能:
- 函数跟踪 (
function tracing
):
- 可以跟踪内核中每个函数的调用情况,包括函数进入、退出的时间和执行时间。
- 例如,可以跟踪某个特定函数的调用频率及其调用者。
- 函数调用图 (
function graph tracing
):
- 记录函数调用的完整调用栈。与简单的函数跟踪不同,函数调用图会显示函数的调用关系以及调用链中的每个函数的执行时间。
- 系统调用跟踪:
- 可以跟踪所有的系统调用或特定的系统调用,从而了解用户空间程序如何与内核交互。
- 调度器跟踪:
ftrace
可以记录和分析调度器行为,比如任务切换、任务调度延迟等,帮助分析多任务系统中的调度性能。
- 事件跟踪:
ftrace
支持各种内核事件的跟踪(例如,IRQ 处理、中断、软中断等),并允许用户定义和过滤感兴趣的事件。
传统的ftrace操作较为繁琐,需要向多个文件写入信息,当前我们紧介绍ftrace前端工具:trace-cmd
trace-cmd
- trace-cmd record:记录实时跟踪数据并将其写入trace.dat 文件
- trace-cmd report:读取 trace.dat 文件并将二进制数据转换为可读的 ASCII 文本格式。
- trace-cmd start:开始跟踪但不记录到 trace.dat 文件。
- trace-cmd stop:停止跟踪。
- trace-cmd extract:从内核缓冲区提取数据并创建 trace.dat 文件。
- trace-cmd reset:禁用所有跟踪并恢复系统性能。
开启相关配置
1 2
| CONFIG_FUNCTION_TRACER CONFIG_FUNCTION_GRAPH_TRACER
|
查看可用追踪器
1 2
| sudo trace-cmd list -t hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
|
只有function_graph才能测量函数执行时间
查看可跟踪的函数
1 2 3 4 5 6 7 8
| uos@uos-PC [~/tom-blog] ➜ sudo trace-cmd list -f | grep mmap
xen_hvm_exit_mmap xen_dup_mmap xen_exit_mmap ldt_arch_exit_mmap __ia32_compat_sys_ia32_mmap ...
|
查看可跟踪的事件
1 2 3 4 5 6 7
| uos@uos-PC [~/tom-blog] ➜ sudo trace-cmd list -e | grep snd
asoc:snd_soc_bias_level_start asoc:snd_soc_bias_level_done asoc:snd_soc_dapm_start asoc:snd_soc_dapm_done ...
|
查看函数调用栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| sudo trace-cmd record -p function -l do_mmap --func-stack
#使用 ctrl-c 退出trace-cmd时,会在当前目录生成 trace.dat文件,使用report读取trace.dat uos@uos-PC [~] ➜ trace-cmd report | head -20
CPU 0 is empty cpus=16 explorer.exe-14504 [008] 1274475.231218: function: do_mmap explorer.exe-14504 [008] 1274475.231223: kernel_stack: <stack trace> => ftrace_trampoline (ffffffffc0d6106a) => do_mmap (ffffffff94891c45) => vm_mmap_pgoff (ffffffff94869ee4) => ksys_mmap_pgoff (ffffffff9488f472) => do_syscall_64 (ffffffff951e9690) => entry_SYSCALL_64_after_hwframe (ffffffff952000ea) explorer.exe-14504 [008] 1274475.231269: function: do_mmap explorer.exe-14504 [008] 1274475.231271: kernel_stack: <stack trace> => ftrace_trampoline (ffffffffc0d6106a) => do_mmap (ffffffff94891c45) => vm_mmap_pgoff (ffffffff94869ee4) => ksys_mmap_pgoff (ffffffff9488f472) => do_syscall_64 (ffffffff951e9690) => entry_SYSCALL_64_after_hwframe (ffffffff952000ea) explorer.exe-14504 [008] 1274475.231285: function: do_mmap explorer.exe-14504 [008] 1274475.231286: kernel_stack: <stack trace>
|
参数介绍
参数 |
介绍 |
-e event |
启用指定的事件进行跟踪 |
-f filter |
为前一个 -e 事件设置过滤器 |
-R trigger |
为前一个 -e 事件设置触发器 |
-p plugin |
启用指定的插件进行跟踪,类似 echo function > current_tracer |
-F |
只过滤指定进程 例如 -F cp tets.txt ~/ |
-P pid |
跟踪指定 pid 的进程,类似于 -F |
-c |
也跟踪由 -F 指定进程产生的子进程 |
-C clock |
设置跟踪时使用的时钟类型 |
-T |
对所有事件做堆栈跟踪(stacktrace) |
-l func |
过滤指定函数名,跟踪的函数是叶子函数,不会跟踪其内部的调用子函数 |
-g func |
设置函数图跟踪的函数,会跟踪函数内部调用的子函数,指定 function_graph tracer 跟踪的 函数,类似 echo function_name > set_graph_function |
-n func |
不跟踪指定函数,例如 trace-cmd record -p function -l 'dev*' -n dev_attr_show |
-m max |
每个 CPU 的最大缓冲区大小(以 KB 为单位) |
-M mask |
设置要跟踪的 CPU 掩码 |
-v |
反转之后的所有 -e(禁用这些事件) |
-d |
跑命令时禁用函数跟踪 |
-D |
完全禁用函数跟踪(对所有用户) |
-o file |
输出数据文件(默认 trace.dat) |
-O option |
启用(或禁用)指定选项 |
-r prio |
设置捕获线程的实时优先级 |
-s usecs |
录制时的睡眠间隔(微秒,默认 1000) |
-S |
与 –profile 一起用,只启用命令行列出的事件 |
-N host:port |
连接到指定主机:端口(用于远程监听) |
-t |
与 -N 一起使用,强制使用 TCP 进行实时跟踪 |
-b size |
每 CPU 的内核缓冲区大小(KB) |
-B |
创建子缓冲区,后续事件将启用到这里 |
-k |
跟踪后不重置缓冲区 |
-i |
如果找不到事件不报错 |
–by-comm |
与 –profile 一起用,合并相关 comm 的事件 |
–profile |
启用分析报告所需的跟踪选项,可以对我们追踪的函数执行时间进行统计 |
–func-stack |
对函数跟踪器执行堆栈跟踪(慎用) |
–max-graph-depth |
限制 function_graph 的深度 |
function_graph有两种过滤条件可以配置:
-l func
:实际对应set_ftrace_filter,这种方式插桩的开销较小,只会追踪顶层func的执行时间且支持等通配符的设置。
-g func
:实际对应set_graph_function,这种方式插桩的开销较大,但能追踪func以及func所有子函数的的执行时间,不支持等通配符的设置。
默认情况下,trace-cmd
的 function_graph
会记录所有嵌套的函数调用。可以通过设置 --max-graph-depth
来限制跟踪深度。例如要将深度设置为 2,可以使用以下命令:
1
| sudo trace-cmd record -p function_graph --max-graph-depth 2 -P 1656
|
直接跟踪执行命令
1 2
| sudo trace-cmd record -p function_graph smartctl -i /dev/sg1 sudo trace-cmd report
|
使用kernelshark图形化分析
我们可以导出trace.dat文件,然后使用kernelshark打开逐个分析