1. mount -t debugfs nodev /sys/kernel/debug
在mount后,可以在debug目录下看到tracing目录,该目录包含了ftrace的控制与输出文件。
(1) enable ftrace可以获得更为详细的信息
  1. sysctl kernel.ftrace_enabled=1
(2) 使用tracer
  1. #cat availabe_tracers                             //查看当前支持的tracer有哪些
  2. blk function_graph wakeup ... nop
  3. #echo wakeup > current_tracer
  4. #echo latency-format > trace_options
  5. #echo 0 > tracing_max_latency
  6. #echo 1 > tracing_on
  7. #chrt -f 5 sleep 1
  8. #echo 0 > tracing_on
  9. #cat trace
(3) 每一个CPU都有一个对应的internal trace buffer
  1. #cat buffer_size_kb
  2. #echo nop > current_tracer
  3. #echo 10000 > buffer_size_kb
  4. #cat buffer_size_kb
(4) trace_pipe是动态的,读取trace_pipe会阻塞直到有内容写入trace_pipe,这种方式的好处是打印出来的信息全部都是你关心的内容,如果再加上一些其他的选项进行过滤,就能很快得到你想要的内容。
  1. #echo function > current_tracer
  2. #cat trace_pipe > /tmp/trace.out &
  3. #echo 1 > tracing_on
  4. #usleep 1
  5. #echo 0 > tracing_on
  6. #cat /tmp/trace.out
(5) function graph tracer
第一列代表函数执行在第几个cpu上,第二列代表的函数执行时间,如果其对应的第三列是一个"}",则代表的是一个函数体的执行时间。在第二列前,如果达到了duration thresholds,会有一个overhead field,"+"代表函数执行超过10usec,"!"代表函数执行超过100usec。关闭这些属性的操作(启用的话去掉"no"即可);
  1. echo nofuncgraph-cpu > trace_options
  2. echo nofuncgraph-duration > trace_options
  3. echo nofuncgraph-overhead > trace_options
如果你想只观察某个cpu的func graph,可以使用tracing_cpu_mask文件,写入内容格式参见taskset命令
func graph还有一些其他的选项可以启用:
  1. echo funcgraph-proc > trace_options
  2. echo funcgrpah-abstime > trace_options
这里TIME为绝对时间
(6) 动态ftrace
文件set_ftrace_filter与set_ftrace_notrace用来enable或者disable某些特定函数的trace,这些函数可以通过查看文件available_filter_functions得到。
1) 支持使用通配符:
  1. <match>*
  2. *<match>
  3. *<match>*
  4. #echo 'hrtimer_*' > set_ftrace_filter
  5. #echo > set_ftrace_filter
2) filter commands
  1. syntax: <function>:<command>:<parameter>
  2. 1. mod, this command enables function filtering per module
  3. #echo 'write*:mod:ext3' > set_ftrace_filter
  4. #echo '!writeback*:mod:ext3' >>set_ftrace_filter
  5. 2. traceon/traceoff
  6. these commands trun tracing on and off when the specified functions are hit. The parameter determines how many times the tracing system is turned on and off. If unspecified, there is no limit.
  7. For example, to disable tracing when a schedule bug is hit in the first 5 times, run:
  8. #echo '__schedule_bug:traceoff:5' > set_ftrace_filter
  9. These command are cumulative whether or not they are appended to set_ftrace_filter. To remove a command, prepend it by '!' and drop the parameter:
  10. #echo '!__schedule_bug:traceoff'
3) set_graph_function, help you to trace only one function and all of its children.
  1. #echo __do_fault > set_graph_function
(7) event机制,内核中某个信息的trace需要使用event,如在2.6.38内核上,目前sched机制是使用event进行trace。
1) 使用event有两种方式
i) 通过set_event文件
  1. #echo sched_wakeup >> set_event
  2. #echo '!sched_wakeup' >> set_event
  3. #echo > set_event
events被组织成一个个子系统,如ext4,irq,sched等待,一个完整的event name是这样的:<subsystem>:<event>,其中subsystem是可选的,一个子系统中所有的events可以通过<subsystem>:*指定。
  1. #echo *:* > set_event
  2. #echo 'irq:*' > set_event
ii) 通过'enable' toggle
  1. #echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
  2. #echo 1 > /sys/kernel/debug/tracing/events/sched/enable
  3. #echo 1 > /sys/kernel/debug/tracing/events/enable
2) 定义一个event-enabled tracepoint
tracepoint不在本文讨论范围之内
3) event format
这里,不以common_开头的filed是每个event特有的。每一个event对应的有一个TRACE_EVENT定义一个record,这里offset为field在record中的偏移,size为其大小。下载一个内核,在samples/trace_events目录下有一个例子,可以查看TRACE_EVENT的定义方法。
4) event filter
语法:
  1. field-name relation-operatior value                           //一个predicate
可以通过'&&', '||',以及圆括号将几个predicate组合起来。对于数字域,可以使用操作符==, !=, < , > , <=, >=,对于字符串域,可以使用==, !=。目前字符串只支持完全匹配,且最多可以组合16个predicate。
例子:
  1. #cd /sys/kernel/debug/tracing/events/signal/signal_generate
  2. #echo "((sig >= 10 && sig < 15) || sig == 17) && comm != bash" > filter
每个子系统都有独立的filter文件支持,如:
  1. #cd /sys/kernel/debug/tracing/events/sched
  2. #echo 0 > filter
  3. #cat sched_switch/filter
  4. none
  5. #cat sched_wakeup/filter
  6. #echo common_pid == 0 > filter
  7. #cat sched_switch/filter
  8. common_pid == 0
  9. #cat sched_wakeup/filter
  10. common_pid == 0
  11. #echo prev_pid == 0 > filter
  12. #cat sched_switch/filter
  13. prev_pid == 0
  14. #cat sched_wakeup/filter
  15. common_pid == 0
可以看到,虽然将sched子系统的filter设为prev_pid == 0,但由于只有sched_switch事件存在prev_pid域,所以对sched的filter文件的设置只影响了sched_switch。
(8) 其他一些feature
set_ftrace_pid: 可以选择trace指定进程
tracing_cpumask: 可以选择trace制定cpu
tracing_max_latency: 一些tracer会trace最大延迟,并将时间写入该文件。如果当前trace的最大延迟比文件中大,就会执行写入(时间单位:microsecond)。
trace_options: 这个文件中包含一些选项,可以控制输出内容的格式,如上面提过的funcgraph-proc
1) irqsoff,跟踪中断disable的时间,将最大延迟写入tracing_max_latency
  1. #cd /sys/kernel/debug/tracing
  2. #echo nop > current_tracer
  3. #echo 'irq:*' > set_event
  4. #echo latency-format > trace_options
  5. #echo 0 > tracing_max_latency
  6. #echo 1 > tracing_on
  7. #sleep 1
  8. #echo 0 > tracing_on
  9. #cat trace
中断与抢占相关的输出结果很有意思,如下图:
cmp: trace的进程名称
pid: 进程的PID
CPU#: 进程运行在哪个cpu上
irqs-off: 如果中断被disable,则为'd',否则为'.'。如果体系结构不支持读取irq flag变量,则为'X'
need-resched: 如果需要调度,则为'N',否则为'.'
hardirq/softirq: 'H'代表在softirq中发生了hardirq,'h'正在运行hard irq,'s'正在运行soft irq,'.'代表正常上下文。
preempt-depth: 代表抢占disable的级别。
time: 当enable latency-format的时候,代表自trace开始到此的相对时间,否则代表绝对时间。
delay: '+'大于1毫秒,'!'大于preepmt_mark_thresh(默认为100), ' '小于等于1毫秒

ftrace笔记的更多相关文章

  1. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...

  2. 利用ftrace跟踪内核static tracepoint——实例writeback event

    摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求.关于linux tracepoint的详细信息,我们可以在 ...

  3. 利用ftrace跟踪内核static tracepoint

    摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求.关于linux tracepoint的详细信息,我们可以在 ...

  4. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

随机推荐

  1. LeetCode || 大杂烩w

    454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...

  2. CS193p Lecture 6 - UINavigation, UITabBar

    抽象类(Abstract):指的是这个类不能被实例化,只能被继承: OC中没有关键词来标明某个类是抽象类,只能在注释中标注一下: 抽象类中的抽象方法,必须是public的,使方法称为public的方法 ...

  3. js基本语法之 值类型(数据类型)(变量类型)

    一.不可改变的原始值(栈数据)(五个) 数字(number),字符串(string),布尔值(boolean),undefined,null 其中;undefined是未定义的意思,而null是空的意 ...

  4. Shell脚本的条件测试与比较

    Shell脚本的条件测试与比较 一.shell脚本的条件测试 通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结构执行不同的操作,有时也会与if等条件语句相结合,来完成测试 ...

  5. Immutable 特性

    https://io-meter.com/2016/09/03/Functional-Go-persist-datastructure-intro/ 持久化的数据结构(Persistent Data ...

  6. CSS3-文本-text-overflow

    text-overflow 语法: text-overflow : clip | ellipsis 取值说明: 1.clip:表示不显示省略标记(...),而只是简单的裁切,需要在一定的高度范围内配合 ...

  7. 王小胖之 URL编码和解码

    使用场景:程序员使用较多,主要是图个方便,实现很简单 实现功能:URL编码 和URL解码 数据实例: 输入:王小胖好啊,王小胖顶呱呱!! ~~ english 123 !@#$%^&*()_+ ...

  8. Python9-模块1-day19

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  9. 关于priority_queue的一些说明

    参考GGBeng 相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大 ...

  10. ubuntu 执行apt-get update报错Failed to fetch

    在ubuntu下执行sudo apt-get update时,经常会遇到报错: Err http://security.ubuntu.com precise-security InRelease Er ...