"perf sched record" 使用什么时间范围?

What timeframe does the "perf sched record" use?

我一直在尝试分析 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

这些时间戳是使用内核调度程序时钟捕获的,自启动以来以纳秒为单位计数。确切的细节取决于为构建特定 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 行为的摘要:.