Linux内核学习与问题定位,这个工具一定要掌握事半功倍。今天我们就来介绍一下这个工具以及它的使用方法。今天主要介绍以下几个部分:什么是ftraceftrace的基本用法ftrace的实现原理概述什么是ftrace我们可以把ftrace理解为Functiontracer的缩写,可以看出它的基本功能就是实现函数调用追踪。事实上,ftrace不仅仅用来跟踪函数调用,很多其他的内核信息都可以通过这个工具进行跟踪。除了上面的函数调用跟踪,ftrace还可以帮我们分析内核特有的事件,比如调度、中断等;它还可以帮助我们跟踪延迟,比如什么时候中断被屏蔽,什么时候禁止抢占,一个进程唤醒后多久开始执行等等。因此,可以理解为ftrace其实是给我们提供了一个看穿的工具内核,就像医院里的CT机或MRI。通过这个工具,我们可以了解内核内部的更多细节。下面我们列出该工具的主要功能,供大家参考:(1)Functiontracer和Functiongraphtracer:跟踪函数调用。(2)Scheduleswitchtracer:跟踪进程调度。(3)Preemptofftracer:与前面的tracer类似,preemptofftracer跟踪记录禁止内核抢占的函数,清楚地显示出禁止抢占时间最长的内核函数。(4)Preemptirqsofftracer:同上,跟踪记录禁止中断或抢占的内核函数,以及被禁止时间最长的函数。(5)Branchtracer:跟踪内核程序中likely/unlikely的分支预测命中率。Branchtracer可以记录这些分支语句被预测成功的次数。从而为优化器提供线索。(6)硬件分支跟踪器:利用处理器的分支跟踪能力,实现硬件级的指令跳转记录。在x86上,主要使用BTS的特性。(7)Sysproftracer:默认情况下,sysproftracer每隔1毫秒对内核进行一次采样,并记录函数调用和堆栈信息。(8)Kernelmemorytracer:memorytracer主要用于跟踪slaballocator的分配情况。包括kfree、kmem_cache_alloc等API调用,用户程序可以根据tracer收集到的信息分析内部碎片,找出内存分配最频繁的代码片段等。(9)Initcalltr??acer:记录系统在启动阶段调用的initcall。(10)mmiotracetracer:记录内存映射IO的信息。(11)Powertracer:记录系统电源管理的相关信息。(12)Workqueuestatisticstracer:这是一个统计tracer,统计系统中所有workqueue的工作量,比如有多少job已经插入workqueue,有多少已经执行等,开发者可以通过这个来判断特定的工作队列实现,例如使用单线程工作队列或每个cpu工作队列。(13)Eventtracer:跟踪系统事件,如定时器、系统调用、中断等。(14)Wakeuptracer:跟踪进程的调度延迟,即高优先级进程从进入进程开始的延迟时间就绪状态获取CPU。此跟踪器仅适用于实时进程。(15)Irqsofftracer:当中断被禁止时,系统不能响应外部事件,如键盘鼠标,时钟不能产生节拍中断。这意味着系统响应延迟。irqsoff跟踪器可以跟踪和记录内核中哪些函数禁用了中断。对于最长的中断禁用时间,irqsoff会在日志文件的第一行进行标记,以便于开发者快速定位响应延迟的罪魁祸首。ftrace的基本使用ftrace的基本使用其实比较简单。以Ubuntu18.04为例,我们只需要在current_tracer文件中输入函数字符串即可。具体操作步骤如下:cd/sys/kernel/debug/tracingechofunction>current_tracer执行完上面的命令后,我们用vim命令在目录下打开一个名为trace的文件,然后就可以进行函数调用了。如果你看文件,你可能会发现函数调用有几万个,估计头都大了。事实上,它的功能要强大得多。比如我们通过function_graph来实现调用栈的层级关系。这个时候理清函数调用关系就比较方便了。同时我们还可以过滤函数名,比如只抓取一些函数,或者不抓取一些函数等等。某些版本的操作系统可能无法直接使用该功能,需要进行一些配置。关于这些配置,本文暂时不介绍,后面会介绍。ftrace实现原理概述ftrace最早是用来跟踪函数调用的,后来随着需求的增加演变成一个框架。也就是我们前面介绍的内核的各种检测功能。整个ftrace的架构如图所示,整体分为两层。核心部分是内核框架和一些捕获信息的插件,其中函数调用是插件之一;另一部分是用户态的一些辅助工具集。可以看出内核的核心是ftrace框架,具体的功能组件是各种插件,也就是tracer。如果需要跟踪特定内容,则需要在框架中注册跟踪器。跟踪器捕获的信息输出到环形缓冲区。整个框架还需要一个内核模块,就是debugfs模块。该模块实现了用户态与内核的交互。内核态的代码在kernel/trace目录下,里面是ftrace框架和各个tracer的代码。如下图,可以看出tracer还是很多的。整个ftrace的代码量不是特别多,大概4万行左右。因此,ftrace确实是目前非常强大的内核状态监控工具。
