【问题标题】:What timeframe does the "perf sched record" use?“perf sched 记录”使用什么时间范围?
【发布时间】:2021-07-02 13:54:12
【问题描述】:

我一直在尝试分析perf sched record 的输出,但我不明白我应该使用什么参考框架来理解“20624.983302 秒”。现在肯定不是 Unix 时间,那是什么时候呢?我将如何将其转换为 Unix 时间?

*A0                               20624.983302 secs A0 => migration/0:12
*.                                20624.983311 secs .  => swapper:0
*B0                               20624.983318 secs B0 => IPC I/O Child:33924
*.                                20624.983355 secs 
*C0                               20624.983485 secs C0 => WRScene~lder#15:39974
*.                                20624.983581 secs 
*D0                               20624.983972 secs D0 => IPC I/O Parent:33780

【问题讨论】:

  • 自启动后会是几秒钟吗?即与您在来自dmesg 的内核日志消息中找到的时间相同?

标签: linux performance scheduler perf


【解决方案1】:

这些时间戳是使用内核调度程序时钟捕获的,该时钟自启动以来以纳秒为单位。确切的细节取决于为构建特定 Linux 发行版和目标架构而选择的编译时参数。

一般来说,样本的时间戳在记录时大约在同一时间被捕获。只要内核保持活动状态,就保证同一内核上的时间戳单调递增。您显示的样本都在同一个核心上捕获,并且核心从第一个样本到最后一个样本都保持活动状态。因此,在这种情况下,无论平台和分布如何,都保证时间戳是单调的。在多个内核上进行分析时,不能保证所有内核上的时钟都是同步的。

所有perf 工具都使用相同的时钟来捕获时间戳,但它们的时间戳打印方式可能不同,并且两个工具可能会以不同的方式打印来自同一示例文件的时间戳。这取决于内核版本。

可以在调用perf_event_open() 时指定时钟源,方法是将use_clockid 设置为1,并将clockid 设置为linux/time.h 中定义的时钟源之一,例如CLOCK_MONOTONICperf record 提供-k--clockid 选项来指定捕获时间戳的时钟源。

x86 上的现代发行版通常使用 TSC 作为调度程序时钟的来源(请查看 /sys/devices/system/clocksource/clocksource0/current_clocksource)。因此,如果您使用的是 x86 处理器,则很可能已分析内核的 TSC 用于捕获 TSC 周期的当前值,该值在内部转换为纳秒。打印时间戳时,它可能会转换为不同的单位。在这种情况下,时间戳以“seconds.microseconds”格式打印。有关英特尔处理器上 TSC 行为的摘要,请访问:Can constant non-invariant tsc change frequency across cpu states?

【讨论】:

  • Linux 是否纯粹使用 TSC 来长期计数这个时钟?对于一天中的时间的东西,最后我读到 Linux 用一个由定时器中断更新的粗略时间值和一个 TSC 偏移/比例因子作为它的校正来实现它,以获得clock_gettime(CLOCK_REALTIME)。我猜你说的时钟是CLOCK_BOOTTIME
  • @PeterCordes sched 时钟是一个内部时钟,它与任何 POSIX 时钟之间不一定存在相关性。我认为在现代 x86 平台上它与 CLOCK_MONOTONIC_RAW 相同,但我宁愿在不先检查源代码的情况下做出明确的声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多