茱莉亚·伊万斯

ftrace:跟踪您的内核函数!!

你好!今天我们将讨论一个调试工具:ftrace,这个工具我们之前没有讨论过。有什么比新的调试工具更令人兴奋的呢?!!

更好的是,ftrace不是新的!它从Linux内核2.6开始就存在,约2008年。这是我用一些快速Gooogling找到的最早的文档所以你可以使用它,即使你调试一个老系统!!

我知道ftrace存在2.5年了,但是还没有真正学会。我明天应该办一个讲习班,在那里我谈论ftrace,所以今天我们讨论它!!

ftrace是干什么的?吗?

ftrace是一个Linux内核特性,允许您跟踪Linux内核函数调用。为什么你要这么做?好吧,假设您正在调试一个奇怪的问题,您已经到了凝视内核版本的源代码并想知道什么的地步确切地是怎么回事。

在调试时,我不经常阅读内核源代码,不过偶尔我也是!例如本周在工作中我们有一个项目被冻结和stuckspinning内核。看函数被称为帮助usunderstand更好的发生了什么事在内核和系统wereinvolved(在这种情况下,那是虚拟内存系统)!!

我认为ftrace是一个小众工具(它肯定没有strace那么广泛有用,也比strace更难使用),但是它值得了解。让我们来学习一下吧!!

ftrace的第一步

不像鱼叉和鱼叉,fTrace不是一个程序——你确实'tjust运行ftrace my_cool_function。那太容易了!!

如果你读使用Ftrace调试内核开始时告诉你cd / sys /内核/调试/跟踪然后执行各种文件系统操作。

对我来说,这太烦人了——用这种方式使用ftrace的简单示例如下

cd/sys/kernel/debug/tracingecho函数>._tracerecho do_page_.>set_ftrace_filtercat跟踪

这个文件系统与跟踪系统的接口(“将这些值放入这些魔术文件中,事情就会发生)理论上可以使用但reallynot我的偏好。

幸运的是,团队ftrace也认为这个接口不是用户友好等有一个易于使用的界面trace-cmd!!!trace-cmd与命令行参数异常的项目。我们将使用!我在LWN在trace-cmd: Ftrace的前端

开始使用trace-cmd:让我们跟踪一个函数

首先,我需要安装trace-cmd具有sudo apt-get安装trace-cmd。足够简单。

对于第一个ftrace演示,我决定要知道我的内核什么时候处理页面错误。它经常懒洋洋地(“你不是真的?计划使用内存,正确的?”)这意味着当一个应用程序实际写入它分配的内存时,有一个页面错误,内核需要给应用程序物理内存来使用。

让我们开始trace-cmd并使其跟踪多帕格日断层功能!!

$sudo trace-cmd.-p函数-l do_page_.plugin'function'hitCtrl^C停止记录

我跑了几秒钟,然后击中CTRL+C。太棒了!它创建了一个2.5 mbfile调用trace.dat。让我们看看那个文件是什么!!

$ sudo trace-cmd报告chrome-15144[000]11446.466121:function: do_page_.chrome-15144[000]11446.467910:function: do_page_.chrome-15144[000]11446.469174:function: do_page_.chrome-15144[000]11446.474225:function: do_page_.chro chrome-15144[000]11446.474386:function: do_page_.chrome-15144[000]11446.478768:function: do_page_fault CompositorTileW-15154[001]11446.480172:function: do_page_.chrome-1830[003]11446.486696:function: do_page_fault CompositorTileW-15154[001]11446.488983:function: do_page_.CompositorTileW-15154[001]11446.488983do_page_fault CompositorTileW-15154[001]11446.489034:function: do_page_fault CompositorTileW-15154[001]11446.489045:function: do_page_.

这很整洁——它显示了进程名(chrome),过程ID(15144),CPU(000),以及被跟踪的功能。

通过观察整个报告,(sudo trace-cmd报告|grep chrome)我cansee我们追踪了1.5秒,在此期间Chrome有大概500页的缺点。太酷了!我们已经完成了第一次比赛!!

下一个ftrace技巧:跟踪一个过程吧!!

可以,但是仅仅看到一个函数有点无聊!假设我想了解一切发生的一个程序。我使用静态站点生成Hugo。雨果的内核做什么?吗?

雨果在我电脑上的PID是25314,所以我记录所有内核函数:

sudo trace-cmd记录——帮助#我读了!sudo trace-cmd记录-p函数-P 25314#PID记录25314

sudo trace-cmd报告打印输出18,000行输出。如果你重新感兴趣,你可以看到全部18个,这里的000行

18,000行很多这里有一些有趣的摘录。

这看起来像会发生什么时钟时间系统调用运行。整洁!!

._SyS_._gettime SyS_._gettime clockid_to_k.posix_._realtime_get getnstimeofday64.u getnstimeofday64.u arch_._read_._put_timespec

这与进程调度有关:

cpufreq_sched_irq_work wake_up_process try_to_wake_up _raw_spin_lock_irqsave do_raw_spin_lock _raw_spin_lock do_raw_spin_lock walt_ktime_clock ktime_get arch_counter_read walt_update_task_ravg exiting_task

能够看到所有这些函数调用非常酷,即使我不完全理解。

”函数图示踪

还有一个跟踪模式function_graph。这含义是函数示踪是一样的除了仪器进入退出功能。这是输出的示踪剂

sudo trace-cmd记录-p function_.-P 25314

再一次,这里有一个片段(这次来自futex代码)

|futex_wake(){get_futex_key(){get_get_user_pages_.(){1.458us|get_get_user_pages_.();4.375我们| } | __might_sleep(){ 0.292我们| ___might_sleep();2.333us|}0.584us|get_futex_key_refs();| | unlock_page(){0.291我们page_waitqueue ();0.583us|_wake_up_bit();5.250us|}0.583us|put_page();+ 24.208我们|}

我们看到在这个例子get_futex_key被调用后futex_wake。这些是真实发生在源代码中?我们可以检查!!!这是在Linux 4.4 futex_wake的定义(我的内核版本)。

我帮你省去点击:看起来是这样的:

静态intfutex_wake(u32_user*uaddr,无符号整数标志,int nr_wake,u32 bitset){ struct futex_hash_bucket * hb;构造futex_q*this,*下一步;联合futex_key=FUTEX_KEY_INIT;国际直拨电话;Wakayq(Wakayq);如果(!)位集)返回-EINVAL;ret=get_futex_key(uaddr,旗& FLAGS_SHARED的关键,VelIFY-YEAD);;

所以第一个函数调用futex_wake真的是get_futex_key!整洁!读取函数跟踪绝对比读取内核代码更容易发现这一点,和很高兴看到所有functionstook多久。

如何知道函数你可以跟踪

如果你运行sudo trace-cmd列表-f您将得到一个可以跟踪的所有函数的列表。这很简单,但是很重要。

最后一件事:事件!betway菲律宾!

所以,现在我们知道如何在内核跟踪功能!那是非常酷的!!

不过我们还有一类东西可以追踪!有些事件不betway菲律宾对应超级函数调用。例如,你可能想清楚程序将打开或关闭CPU !你可以弄清楚凝视在函数调用,但我肯定不能。

因此,内核还为您提供了一些事件,以便您可以看到何时发生了一些重要的事情betway菲律宾。您可以通过betway菲律宾sudo猫/ sys /内核/调试/跟踪/ available_eventsbetway菲律宾

我看着所有的sched_switch事件。betway菲律宾我不确定sched_switch是什么,但我猜它与日程安排有关。

sudo cat/sys/kernel/debug/tracing/._eventssudbetway菲律宾o trace-cmd记录-e sched:sched_switchsudo trace-cmd报告

输出是这样的:

16169.62486262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262铬:1561[112]S=>铬:15144[120]

所以你可以看到它从内核PID - > 15144 - > 24817 - > 24817 - > 1561 - > 15114。(所有的这些事件都是在同一个betway菲律宾CPU)

ftrace是如何工作的呢?吗?

ftrace是一个动态跟踪系统。这意味着当我开始处理内核函数时,这个函数的代码被更改。所以,假设我跟踪多帕格日断层功能从前。内核将在程序集中为该函数插入一些额外的指令,以便在每次调用该函数时通知跟踪系统。它可以添加extrainstructions的原因是,Linux将几个额外的NOP指令编译为everyfunction,有空间,在需要的时候添加跟踪代码。

这太棒了,因为它意味着当我不使用ftrace来跟踪我的内核时,它根本不影响性能。当我开始跟踪,morefunctions我跟踪,会有更多的开销。

(也许这是错误的,但这就是我认为ftrace作品)

使用更容易ftrace:丹& kernelshark格雷格的工具

正如我们所看到的在这篇文章中,你需要很多思考如何直接使用ftrace individualkernel函数/事件。betway菲律宾这是很酷的,但是工作量也很大!!

Brendan Gregg(我们的linux调试工具英雄)拥有工具库,这些工具库用于提供关于各种事情的信息,比如IO延迟。他们真的在PERP工具repositoryon GitHub。

这里的折衷在于它们更容易使用,但是,布莱登·格雷格所想到的,以及决定为之制作工具的东西有限。这是很多事情!:)

另一个更好地可视化ftrace输出的工具是鲨鲨。我没有玩过,但是看起来很有用。你可以安装它sudo apt-get installkernelshark

一个新的超级大国

我很高兴我花时间更多地了解ftrace今天!像任何内核工具一样,它会工作不同的内核版本之间的不同,但我希望有一天你发现它有用。

ftrace文章的索引

最后,这是一个我发现一堆ftrace文章列表。他们中许多人onLWN(Linux每周新闻),这是Linux上非常棒的写作资源。(你可以买一个订阅!)

写下我的事业 我使用的博客原则