【问题标题】:can't align perf timestamp with system epoch time无法将性能时间戳与系统纪元时间对齐
【发布时间】:2019-12-14 21:51:02
【问题描述】:

我正在使用 perf 进行一些优化工作。通过使用perf script 显示我的性能记录并获得如下结果:

   MyServer 13631 [015] 2611179.755027: probe_app:stat_timer: (52bbe0)
   ......

我写了一个脚本来分析结果,需要把时间戳改成纪元时间戳(至少精确到秒)。

为此,我首先获取主机启动纪元时间戳

    $ date -d "`uptime -s`" +%s
    1562557105

并通过添加正常运行时间进行验证

    $ cat /proc/uptime
    2612552.50 36615651.34

起始纪元时间戳是正确的。

但是我发现 perf 时间戳 211179.755027 并不是文档中说的系统启动后经过的秒数,大约 100s+ 有一些错误。如何在执行“性能记录”时获得准确的时间戳?我试过“-T”,但它似乎不起作用。

【问题讨论】:

  • 请在您的问题中包含perf / kernel 版本。

标签: linux performance perf


【解决方案1】:

perf(或底层perf_event_open)使用的默认时钟实际上并没有记录——所以我不一定会依赖它作为任何特定的时钟。幸运的是,perf 允许您使用-k 选项选择特定时钟。一般支持CLOCK_MONOTONICCLOCK_MONOTONIC_RAW。其他时钟可能可用,具体取决于事件和版本。

如果您选择特定时钟,则可以使用clock_gettime 获取匹配的时间戳。我不知道有什么简单的方法可以做到这一点from command line,但是一个 C 程序就可以了。

【讨论】:

  • 感谢@Zulan 提供信息。我已经尝试过 CLOCK_MONOTONIC,并编写了一个简单的测试代码来检查它:“clock_gettime(CLOCK_MONOTONIC, &ts); printf("sec=%d nsec=%d\n", ts.tv_sec, ts.tv_nsec);", CLOCK_MONOTONIC 时间与 /proc/uptime 具有相同的值,perf 时间戳仍然比 clock_gettime 结果有大约 100s+ 的误差。看起来“-k CLOCK_MONOTONIC”不适用于我的情况。
  • 很好奇...在我的系统上(来自 Arch 的 Linux/perf 5.2.5),/proc/uptimeCLOCK_MONOTONIC* 之间存在很大差异(几十秒)。而两者CLOCK_MONOTONIC*之间的细微差别(数百毫秒)。性能时钟完美匹配。
  • 我所做的是:运行“sudo perf record sleep 1; ./test”,./test 是我获取 CLOCK_MONOTONIC 的测试应用程序,之后,运行“sudo pref script”检查性能时间戳,我从 ./test 得到“sec=2626411 nsec=206691096”,从 perf 脚本得到 2626311.114567。我的系统(Linux 版本 3.10.0-514.26.1.el7.x86_64,CentOS Linux 版本 7.6.1810,性能 3.10.0)
  • 恐怕6岁的Linux版本不支持perf时钟ID。这是在 Linux 4.1 (2015) 中引入的。我无法评论这些定制的古老 Linux 内核中向后移植的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2021-01-18
  • 1970-01-01
  • 2018-08-03
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多