【问题标题】:Retrieve Program Execution Time in Perf Sampling Mode在 Perf 采样模式下检索程序执行时间
【发布时间】:2020-08-24 04:10:15
【问题描述】:

我正在使用Perf 来检测工作负载中 DRAM 访问的数量位置。对于位置,我需要在采样模式中进行追踪。因此,我以采样模式进行跟踪,为了得到访问次数,我将访问事件次数乘以采样周期(即number 个指令每个样本之间)。

我还需要总时间应用程序在 CPU 上。换句话说,我需要一个类似于top 报告的值。因为我需要知道单个应用程序中每个 DRAM 访问之间的 idle 时间段(在此期间应用程序也 on CPU)。这在采样模式下没有报告,我不能同时使用两种模式(即perf recordperf stat)。有什么机制可以实现吗?

【问题讨论】:

  • 记录一个单独的事件,比如task-clock,然后看看它的总数?我认为从 L3 未命中样本推断时间不会得到好的结果。但如果你真的想知道 L3-miss 事件之间的时间,我认为每个事件都应该加上时间戳。
  • 谢谢@PeterCordes。我只想要进程在处理器上 on 的 DRAM 空闲时间。换句话说,处理器空闲或正在运行一些其他进程的时间段不是预期的。我编辑了问题。
  • 好的,这样就排除了我猜想只对现有事件使用时间戳? task-clock 仅当任务的线程在内核上处于活动状态时才计数。
  • 对不起,@PeterCordes。你的意思是我应该同时采样两个事件(L3-missestask-clock)?如果task-clock 占处理器上某个进程的时间,则可以。那么我应该将样本数乘以周期(即连续样本之间的事件数),对吧?
  • 我不确定您能否轻松获得perf report 向您展示您想知道的内容;你真正想要的是perf stat -e task-clock 以及来自perf record 的样本,用于L3 未命中。但是,是的,内核确实会跟踪它何时调度/取消调度任务,因此某个进程已经运行了多少 CPU 纳秒的确切信息就在某个地方。这只是以某种方式记录下来的问题。

标签: linux trace sampling perf utilization


【解决方案1】:

Ftrace 转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。 Ftrace 过滤器只能在 PIDs 上工作。但我需要进程名称(又名,comms)。所以这是我可以在不重新编译内核的情况下做的最好的事情。

我将Systemtap 与以下脚本一起使用:

sudo stap -e 'probe scheduler.process_exit {if (execname() == "evince"){printf("%s, %lu\n", execname(), task_current()->se->sum_exec_runtime)}}'

scheduler.process_exit() 是来自Systemtap tapset 库的探测点,它在内部挂钩do_exit() 内核函数(我使用前者,因为它看起来更便携)。 execname() 返回进程名称,task_current() 返回当前上下文的任务。 se(调度程序的可调度实体)是task_struct(与Linux中的进程或线程相关的数据结构)中的一个字段,sum_exec_runtime 显示可调度实体的总物理运行时间

所以,这就是脚本的作用:

在每个进程(或线程)退出时,它检查进程(或线程)的名称是否 是evince。如果是这种情况,将显示 evince总执行时间(以纳秒为单位)(因为我们处于 evince 的上下文中退出前处理)。

显然,这不是最便携的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多