HACK#67 追踪内核的函数调用
本节介绍使用ftrace研究从哪里调用哪个函数的方法。
追踪是指记录对象软件何时、如何运行的调试或系统监控的方法之一。对引起故障的内核操作进行分析时,有时仅根据源代码是无法获悉实际调用顺序等的。出现性能问题时,或想要改善特定处理的延迟等问题时,就会想要追踪哪里存在瓶颈。使用基于采样的分析工具(profile)虽然也能大致知道性能降低的位置,但终究只能进行概率性的判断,有时不适合用于追踪某特定位置。
这种情况下,采用的方法是通过追踪器依次记录对象程序内部发生的处理并进行分析。有用的追踪主要有下列情况。
·引起bug的条件的分析
·定时(timing)bug的分析
·性能降低的分析
另外,有时也会为了进行系统性能监控或故障监控,而进行日常维护型的追踪。
ftrace
最近发布了Linux内核的标准追踪功能ftrace。ftrace是内核的追踪器框架,有时也将作为ftrace母体的函数调用的追踪器称为ftrace。这里将ftrace作为一般的追踪器框架来使用,函数调用的追踪器用函数追踪器来描述。
ftrace大致有两个功能。一个包括插件追踪器(plugin tracer)分析的追踪功能。另一个是追踪内核事件的功能(将来通过引进uprobes,也可能支持用户空间的追踪),称为追踪事件的。
插件追踪器中有一些是基于追踪事件的,但除了记录事件内容以外,还具有处理事件状态,显示整理结果的功能。在代表性的插件追踪器中,除了成为ftrace名字来源的函数追踪器以外,还有生成调用图表(call graph)的追踪器、MMIO(内存映射I/O)的追踪器等。
另一方面,追踪事件是为了记录内核中代表性操作的状态而安装的追踪代码。通过记录这些追踪事件的信息,就可以记录内核中的代表性操作。
插件追踪器可以与追踪事件同时使用,因此除了插件追踪器的信息以外还可以使用追踪事件。