perf中的时间戳是什么意思?

What is meaning of timestamp in perf?

我想使用 'perf' 来测量函数的实际执行时间。 'perf script'命令在调用函数时给出时间戳。

Xorg  1523 [001] 25712.423702:    probe:sock_write_iter: (ffffffff95cd8b80)

时间戳字段的格式为 X.Y。我如何理解这个值?是X.Y秒吗?

X.Y 是日期的原始格式。 perf 的时间函数以纳秒为单位运行,需要转换为人类可读的格式。使用此网站将其转换为日期 http://www.timestamp.fr/ ,或使用 bash

date -d @25712

X.Y是以seconds.microseconds为单位的时间戳。

这个值是如何显示的可以看here。您可以将开关 --ns 传递给 perf script 以显示 seconds.nanoseconds 格式的时间戳。

要理解这个值,你需要理解perf模块是如何计算时间戳的。您可以将每个事件与不同的时钟函数相关联以计算时间戳。默认情况下,perf 使用 sched_clock 函数计算事件的时间戳,更多详细信息 here

event->clock = &local_clock;

但您可以使用 -k 开关和 perf record 命令将事件与各种时钟标识相关联。

-k, --clockid
           Sets the clock id to use for the various time fields in the
           perf_event_type records. See clock_gettime(). In particular
           CLOCK_MONOTONIC and CLOCK_MONOTONIC_RAW are supported, some
           events might also allow CLOCK_BOOTTIME, CLOCK_REALTIME and
           CLOCK_TAI.

-k开关添加到perf record命令将启用各种时钟功能,具体取决于您使用的clockid,可以看出here

sched_clock 函数应 return 自系统启动以来的纳秒数。特定的体系结构可能会也可能不会单独提供 sched_clock() 的实现。如果未提供本地实现,系统 jiffy 计数器将用作 sched_clock()

请注意,以上所有代码片段均适用于 Linux 内核 5.6.7.