Linux内核调试和Perf Tracing

注意: /sys/kernel/debug/tracing/tracing_on不仅是用来控制 ftrace这个工具的启用与否,还会控制kprobe、uprobe等内核功能,因此ftrace的使用不应频繁控制tracing_on的开关(echo 1或者echo 0进去),而应当通过echo "nop" > current_tracer的方式关闭ftrace

1. 内核调试

1.1 systemtap

1.1.1 相关资料:

1.2 ftrace

1.2.1 相关资料:

/sys/kernel/debug/tracing下有比较多的文件用来配置ftrace,具体那些文件有哪些功能,看下面这个关于ftrace的内核文档就行。

1.2.2 实际操作例子:

注意,每次设置tracer或者过滤器前,最好能够将tracing_on设为0,否则在tracing过程中修改配置,可能导致系统卡顿一段时间。

首先进入到debugfs中方便操作:

1
cd /sys/kernel/debug/tracing
  1. 查看并设置当前的tracer:
1
2
3
4
5
# 查看当前使用的tracer:
cat curent_tracer

# 查看ftrace支持的所有tracer:
cat available_tracers

  关于所有tracer的介绍,可以看文档:https://www.kernel.org/doc/html/latest/trace/ftrace.html#the-tracers。比较常用的tracer有:functionfunction_graphnop。 (nop表示不进行任何操作。)

function主要用来向上查看最终调用目标函数的调用链路; function_graph主要用来查看一个函数调用了哪些函数。

1
2
3
4
5
# 设置当前tracer
echo "function_graph" > current_tracer

# 检查是否开启内核tracing (注意该选项也会影响其他内核tracing功能,如eBPF)
cat tracing_on # 为1表示已开始,为0则表示处于关闭状态
  1. 设置过滤器:

  当使用functionfunction_graph时,需要设置trace的目标。

1
2
3
4
5
6
7
8
# 查看可以trace的内核函数
cat available_filter_functions

# 设置要trace的内核函数
echo tcp_sendpage > cat set_graph_function

# 如果要设置ftrace过程追踪函数调用过程中记录的函数名所使用的过滤器:
echo tcp_sendpage_locked > set_ftrace_filter

注意set_ftrace_filter作用比较微妙,当tracer是function时,这个文件用来包含所有要追踪的函数;当tracer是function_graph时,这个文件用来过滤所有子过程。如果要修改set_ftrace_filter,请务必将current_tracer设置为nop,否则系统极可能会stuck住。。。

  1. 查看trace结果:
1
2
3
4
5
# 先清空历史记录
echo > trace

# 等一段时间后再查看结果
cat trace

可能会得到如下的输出(如果设置了set_ftrace_filter则可能显示的函数会更少一些):

1
2
3
4
5
6
7
# CPU  DURATION                  FUNCTION CALLS
# | | | | | | |
45) | tcp_sendpage() {
45) 0.654 us | lock_sock_nested();
45) + 41.636 us | tcp_sendpage_locked();
45) 4.505 us | release_sock();
45) + 49.383 us | }

2. Perf Tracing

2.1 perf

2.2 iostat

2.3 top


Linux内核调试和Perf Tracing
https://www.torch-fan.site/2023/05/02/Linux内核调试和Perf-Tracing/
作者
Torch-Fan
发布于
2023年5月2日
更新于
2023年5月8日
许可协议