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 ├── available_filter_functions ├── available_tracers ├── buffer_size_kb ├── buffer_total_size_kb ├── current_tracer ├── dyn_ftrace_total_info ├── enabled_functions ├── 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 ├── set_ftrace_filter ├── set_ftrace_notrace ├── set_ftrace_pid ├── set_graph_function ├── snapshot ├── stack_max_size ├── stack_trace ├── stack_trace_filter ├── trace ├── trace_clock ├── trace_marker ├── trace_options ├── trace_pipe ├── trace_stat ├── tracing_cpumask ├── tracing_max_latency ├── tracing_on ├── 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
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
工具,原理和这个一样的。
好了,希望以后慢慢深入,从陌生到熟悉吧!
参考文章