在 Perf 采样模式下检索程序执行时间

Retrieve Program Execution Time in Perf Sampling Mode

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

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

Ftrace 转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。 Ftrace 过滤器只能在 PID 上工作。但我需要进程名称(a.k.a、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() returns 进程名称和 task_current() returns 当前上下文的任务。 se(调度程序的可调度实体)是task_struct中的一个字段(与[=52中的进程或线程关联的数据结构=]) 和 sum_exec_runtime 显示可调度实体的总 物理运行时间

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

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

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