ftrace初识和short-live进程查看

本文阅读量 Posted by Kird on 2020-06-11

ftrace初识 和 short-live进程查看

ftrace 也就是 function trace,对内核debug 或者 问题排查,性能优化的时候可以用到。刚接触,遂记录于此,是Linux 内核提供的一个debug接口框架,有很强大的功能,希望以后能通过此工具解决实际问题。
本文记录下ftrace的相关基础内容,并简单的应用,来查看服务器上的瞬时进程,也就是short-live进程。
详细内容可参考互联网上相关ftrace的文章,本文最后也记录下参考的优秀博文。

挂载

如果没有目录/sys/kernel/debug/需要进行挂载。

1
mount -t debugfs none /sys/kernel/debug

/sys/kernel/debug/tracing目录下提供了ftrace的设置和属性接口

配置

目录:/sys/kernel/debug/tracing/
下面注释的几个文件可以先简单关注下作用。

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.
├── available_events #当前编译及内核的跟踪器列表,current_tracer必须是这里面支持的跟踪器。
├── available_filter_functions
├── available_tracers
├── buffer_size_kb
├── buffer_total_size_kb
├── current_tracer
├── dyn_ftrace_total_info
├── enabled_functions
├── events # events 目录
├── free_buffer
├── function_profile_enabled
├── hwlat_detector
├── instances
├── kprobe_events
├── kprobe_profile
├── max_graph_depth
├── options
├── per_cpu
├── printk_formats
├── README
├── saved_cmdlines
├── saved_cmdlines_size
├── set_event #将Trace events名称直接写入set_event就可以打开,或者通过echo启用event的名称也保存在这里
├── set_ftrace_filter
├── set_ftrace_notrace
├── set_ftrace_pid
├── set_graph_function
├── snapshot
├── stack_max_size
├── stack_trace
├── stack_trace_filter
├── trace # 跟踪信息在这里看,cat
├── trace_clock
├── trace_marker
├── trace_options
├── trace_pipe
├── trace_stat
├── tracing_cpumask
├── tracing_max_latency
├── tracing_on # 总开关,0关闭,1开启
├── tracing_thresh
├── uprobe_events
└── uprobe_profile

short-live进程

short-live进程很难通过top等工具查看,因为运行完就退出了,但是如果对服务有影响,怎么找到是谁在运行呢?
可以通过进程运行时系统sched_process_exec events,通过时间追踪日志去寻找。

举例追踪sched_process_exec

1
2
#开启追踪
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exec/enable

为了验证下,查看set_event文件能发现sched:sched_process_exec已经被写入进去了,所以也可以直接写入event名字开启最终。
此时已经可以通过查看trace文件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat /sys/kernel/debug/tracing/trace
# tracer: nop
#
# entries-in-buffer/entries-written: 12/12 #P:2
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
sh-22577 [001] .... 882123.907359: sched_process_exec: filename=/bin/sh pid=22577 old_pid=22577
sed-22579 [001] .... 882123.910336: sched_process_exec: filename=/usr/bin/sed pid=22579 old_pid=22579
lpstat-22578 [000] .... 882123.910372: sched_process_exec: filename=/usr/bin/lpstat pid=22578 old_pid=22578
sh-22581 [000] .... 882124.919346: sched_process_exec: filename=/bin/sh pid=22581 old_pid=22581
lpstat-22582 [001] .... 882124.921962: sched_process_exec: filename=/usr/bin/lpstat pid=22582 old_pid=22582
sed-22583 [000] .... 882124.922252: sched_process_exec: filename=/usr/bin/sed pid=22583 old_pid=22583
flannel-22584 [001] .... 882125.233424: sched_process_exec: filename=/opt/cni/bin/flannel pid=22584 old_pid=22584
portmap-22588 [001] .... 882125.236191: sched_process_exec: filename=/opt/cni/bin/portmap pid=22588 old_pid=22588
sh-22593 [001] .... 882125.930141: sched_process_exec: filename=/bin/sh pid=22593 old_pid=22593
lpstat-22594 [000] .... 882125.933041: sched_process_exec: filename=/usr/bin/lpstat pid=22594 old_pid=22594
sed-22595 [001] .... 882125.933130: sched_process_exec: filename=/usr/bin/sed pid=22595 old_pid=22595
<...>-22596 [001] .... 882126.404656: sched_process_exec: filename=/usr/bin/cat pid=22596 old_pid=22596

能够看到运行的进程相关信息。

另外也可以通过著名的性能排查工具perf-tools中的execsnoop工具,原理和这个一样的。

好了,希望以后慢慢深入,从陌生到熟悉吧!

参考文章



支付宝打赏 微信打赏

赞赏支持一下