加入收藏 | 设为首页 | 会员中心 | 我要投稿 莱芜站长网 (https://www.0634zz.com/)- 云连接、建站、智能边缘云、设备管理、大数据!
当前位置: 首页 > 综合聚焦 > Linux > 正文

Linux追踪技术与ftrace的使用

发布时间:2023-02-20 10:16:55 所属栏目:Linux 来源:互联网
导读:前言 一、Single thread tracing 通过写入 set_ftrace_pid,您可以跟踪单个线程,比如: echo 0 tracing_on echo nop current_tracer echo trace 追踪 pid = 411870 的任务: echo 411870 set_ftrace_pid echo function current_tracer echo 1 tracing_on ca
  前言
  一、Single thread tracing
  通过写入 set_ftrace_pid,您可以跟踪单个线程,比如:
 
  echo 0 > tracing_on
  echo nop > current_tracer
  echo > trace
  追踪 pid = 411870 的任务:
 
   echo 411870 > set_ftrace_pid
   echo function > current_tracer
   echo 1 > tracing_on
   cat trace | more

  二、Ftrace function_graph
  2.1 Graph Tracing
  此跟踪器类似于函数跟踪器,只是它在函数的入口和出口处探测函数。 这是通过在每个 task_struct 中使用动态分配的返回地址堆栈来完成的。 在函数进入时,跟踪器会覆盖每个跟踪函数的返回地址以设置自定义探针。 因此原始返回地址存储在task_struct中的返回地址堆栈中。
 
  在函数的两端进行探测会导致特殊功能,例如:
  (1)衡量函数执行时间。
  (2)有一个可靠的调用栈来绘制函数调用图。
 
  这个跟踪器在以下几种情况下是有用的:
  (1)想找到内核异常行为的原因,需要详细了解在任何区域(或特定区域)发生了什么。
  (2)正在经历不寻常的延迟,但很难找到它的起源。
  (3)快速找到特定功能所采用的路径
  (4)查看运行中的内核,看看那里发生了什么。
 
  有几列可以动态启用/禁用。 您可以根据需要使用所需的每种选项组合:
 
  function_graph 跟踪器打印函数的调用图,展示其代码流。

 
  只跟踪一个函数及其所有子函数,将其名称echo 到 set_graph_function 中:
  echo do_nanosleep > set_graph_function
  下面使用 do_nanosleep() 函数上的 function_graph 跟踪器来显示其子函数调用:
 
  echo do_nanosleep > set_graph_function
  echo function_graph > current_tracer

   echo nop > current_tracer
   echo > set_graph_function
  输出显示子调用和代码流:do_nanosleep() 调用 hrtimer_start_range_ns().左侧的列显示了 cpu(在此输出中,主要是 cpu 3)和函数的持续时间,以便可以识别延迟.高延迟包括一个字符符号以帮助您注意它们,在此输出中,延迟为 1000337 微秒(1.0 秒)旁边的“$”。

 
  $: Greater than 1 second
  @: Greater than 100 ms
  *: Greater than 10 ms
  #: Greater than 1 ms
  !: Greater than 100 μs
  +: Greater than 10 μs
  这个例子特意没有设置函数过滤器(set_ftrace_filter),这样所有子调用都可以看到。 但是,这确实会产生一些开销,从而夸大了报告的持续时间。 它通常对于定位高延迟的来源仍然很有用,这会使增加的开销相形见绌。 当您希望给定函数的时间更准确时,可以使用函数过滤器来减少跟踪的函数。 例如,仅跟踪 do_nanosleep():
 
  echo do_nanosleep > set_ftrace_filter
  以 do_sys_open 函数为例子来测试function_graph:
 
  echo do_sys_open > set_graph_function
  echo function_graph > current_tracer
  echo funcgraph-proc > trace_options

  cpu 字段给出了执行函数的 cpu 号,本例中为2 号 cpu
  TASK/PID 地段给出进程名称和进程PID号
  DURATION 字段给出了函数执行的时间长度,以 us 为单位。
  FUNCTION CALLS 则给出了调用的函数,并显示了调用流程。
  需要注意:
  对于不调用其它函数的函数,其对应行以“;”结尾,而且对应的 DURATION 字段给出其运行时长;
 
  对于调用其它函数的函数,则在其“}”对应行给出了运行时长,该时间是一个累加值,包括了其内部调用的函数的执行时长。DURATION 字段给出的时长并不是精确的,它还包含了执行 ftrace 自身的代码所耗费的时间,所以示例中将内部函数时长累加得到的结果会与对应的外围调用函数的执行时长并不一致;不过通过该字段还是可以大致了解函数在时间上的运行开销的。
 
  备注:function graph trace 实际是在要跟踪函数的入口处和返回处分别放置了钩子函数,在要跟踪函数的入口处插入钩子函数ftrace_caller,在要跟踪函数的返回处插入钩子函数return_to_handler。因此function_graph tracer即可以跟踪到函数的入口还可以跟踪到函数的返回

(编辑:莱芜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读