【问题标题】:Timing the Linux Kernel boot-time optimisation定时 Linux 内核启动时优化
【发布时间】:2014-09-24 17:49:06
【问题描述】:

我正在尝试优化嵌入式设备(不是 PC)上 linux 的启动时间

目前要分析启动顺序,
我已在 printk 日志中启用计时信息

这是最理想的方式吗?
如果没有,我如何以最小的开销来分析启动序列(包括时间)?

PS:
我有一个通过串行连接的终端(设备的)&
我使用 TeraTerm over windows-XP 来访问它。

【问题讨论】:

    标签: linux optimization linux-kernel kernel


    【解决方案1】:

    printk 计时信息的开销非常小。但是,这些信息并不总是有用的,因为它不会告诉您用户空间中发生了什么。

    您可能想尝试 Bootchart。它是一个在引导期间在后台运行并从 /proc 收集数据的 shell 脚本。虽然它比 printk 计时信息有更大的开销,但它更详细,并允许您分析进程启动和磁盘利用率。

    http://www.bootchart.org/

    【讨论】:

    • @Krzysztof 我确实尝试过 Bootchartd。但是,它只是给了我进程开始结束的时间等。我如何为特定的“代码部分”计时......你知道的任何其他工具吗??......
    • 您可以尝试使用通常的方式进行分析:使用 -pg 编译,然后在输出上使用 gprof。但是,开销相当大。
    【解决方案2】:

    久违了,在这里更新答案以供参考。

    这是我最终做的:

    1. 在我的 PC 上的串行终端客户端 (TeraTerm) 上启用时间戳。

      实际上启用了将日志捕获到磁盘上的文件&
      为每行添加时间戳的选定选项。

    2. 在内核中添加了 printk() 语句。

      • 第一个在我试图分析的块的开头。
      • 第二个在我试图分析的块的末尾。

    虽然在设备上发生事件与通过串行在主机 PC 上接收日志之间存在轻微延迟,但在给定的硬件设置上这是相当恒定的。因此,两个时间戳之间的差异与生成这些日志的设备上的事件之间的实际时间差异是准确的。 2 个printk 语句的开销/副作用也很小。


    更新: 2 年后,以及数百小时后的内核调试,我建议使用 function tracers。不过,这需要一些努力来学习。正如 here 所解释的那样,需要:

    • .config 中启用CONFIG_FUNCTION_TRACER
    • 使用trace_printk() 而不是printk()
    • 检查cat /sys/kernel/debug/tracing/trace的输出日志

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多