Ftrace浅析

      Ftrace是系统的内部追踪器,这个设计是为了帮助开发人员和设计人员去查找Kernel内部发生的情况,他还可以用来分析和调试用户空间之外的延迟和性能问题。

       尽管通常将ftrace视为函数跟踪器,但实际上它是多个分类跟踪实用程序的框架,可以进行延迟跟踪,以检查禁用和启用的中断之间发生了什么,以及抢占以及从唤醒任务到计划任务的时间。

        ftrace最常见的用途之一是事件跟踪。 整个内核中有数百个静态事件点,可以通过tracefs文件系统启用这些事件点,以查看内核某些部分的情况。有关更多信息,请参见events.txt。

       

使用例子:分析Androbench的读写调用情况

(1)使用function_graph:

echo 0 > sys/kernel/debug/tracing/tracing_on (关闭trace)

echo    > /sys/kernel/debug/tracing/trace (清除trace文件的缓存内容)

echo function_graph > /sys/kernel/debug/tracing/tracing_on (设置追踪器为function_graph)

echo vfs_read(或者vfs_write) > /sys/kernel/debug/tracing/set_graph_function

echo funcgraph-proc > /sys/kernel/debug/tracing/trace_options (显示当前的进程)

echo 1 > /sys/kernel/debug/tracing/tracing_on (打开trace)

adb pull /sys/kernel/debug/tracing/trace 本地路径 (将抓取的trace文件导出到本地)

注意:

a. 在跑Androbench的时候最好同时将trace文件导出到本地,因为trace文件是有缓存空间限制的,如果抓取的trace文件太大,后面抓的trace信息会覆盖前面抓的trace内容,

trace文件的缓存空间查看如下:可以自己根据情况动态调节

 # cat buffer_size_kb (查看单个CPU的trace文件缓存大小)

1408 (units kilobytes) 
 # cat buffer_total_size_kb (查看所以CPU的trace文件缓存大小)

5632 (units kilobytes) 

b. 我们在运行Androbench的时候,在终端敲入top命令可以看到有一个com.androbench的进程,这个只是一个UI Thread, 这个进程本身没有执行读写的动作,所以你执行下面这个命令去trace这个进程的PID追踪的话会丢失很多vfs_read/vfs_write的如direct_io, submit_bio等信息,真正执行读写的动作是fork一些子进程去执行读写的(顺序读写,随机读写,数据库读写),不加下面这条可以抓到真正的vfs_read/vfs_write信息,当然也会抓到direct_io和submit_bio等调用的trace信息,Androbench读写是直接IO的,不经过Pach Cache, 不是buffer io, 会进一步贴近UFS/eMMC器件本身的Performance, 这个Androbench读写是direct io方方式还我们从抓取到ftrace信息就可以看的到,

echo com.androbench2的PID > /sys/kernel/debug/tracing/set_ftrace_pid 

(2)使用nop ,以ufs器件举例

echo 0 > sys/kernel/debug/tracing/tracing_on (关闭trace)

echo    > /sys/kernel/debug/tracing/trace (清除trace文件的缓存内容)

echo   1 > /sys/kernel/debug/tracing/events/ext4/enable (设置ext4文件系统相关的trace point)

echo   1 > /sys/kernel/debug/tracing/events/ufs/enable   (设置ufs block driver驱动层即LLD Driver相关的trace point)

echo   1 > /sys/kernel/debug/tracing/events/block/enable (设置block 通用块设备层相关的trace point)

echo   1 > /sys/kernel/debug/tracing/events/scsi/enable  (设置 scsi 上层 即scsi mid layer的相关的trace point)

echo 1 > /sys/kernel/debug/tracing/tracing_on (打开trace)

adb pull /sys/kernel/debug/tracing/trace 本地路径  (将抓取的trace文件导出到本地)

 

        

 

 

 

 

 

参考文件:Documentation\trace\ftrace.txt

 

 

你可能感兴趣的:(性能)