在 Perf 采样模式下检索程序执行时间
Retrieve Program Execution Time in Perf Sampling Mode
我正在使用 Perf
检测工作负载中 DRAM 访问的 数量 和 位置 。对于位置,我需要在 采样模式 中进行追踪。因此,我在采样模式下跟踪,为了得到总的访问次数,我乘以访问事件的次数乘以采样周期(即, 条指令 在 每个样本之间)。
我还需要总时间 申请在CPU。换句话说,我需要一个类似于 top
报告的值。因为我需要知道在这个单一的每个 DRAM 访问之间的 idle 期间(在此期间应用程序也是 on CPU)应用。这在采样模式中没有报告,我不能同时使用两种模式(即 perf record
和 perf stat
)。有什么机制可以实现吗?
Ftrace
转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。 Ftrace
过滤器只能在 PID
上工作。但我需要进程名称(a.k.a、comm
s)。所以这是我在不重新编译内核的情况下能做的最好的事情。
我将 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 退出前处理).
显然,这不是最便携的解决方案。
我正在使用 Perf
检测工作负载中 DRAM 访问的 数量 和 位置 。对于位置,我需要在 采样模式 中进行追踪。因此,我在采样模式下跟踪,为了得到总的访问次数,我乘以访问事件的次数乘以采样周期(即, 条指令 在 每个样本之间)。
我还需要总时间 申请在CPU。换句话说,我需要一个类似于 top
报告的值。因为我需要知道在这个单一的每个 DRAM 访问之间的 idle 期间(在此期间应用程序也是 on CPU)应用。这在采样模式中没有报告,我不能同时使用两种模式(即 perf record
和 perf stat
)。有什么机制可以实现吗?
Ftrace
转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。 Ftrace
过滤器只能在 PID
上工作。但我需要进程名称(a.k.a、comm
s)。所以这是我在不重新编译内核的情况下能做的最好的事情。
我将 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 退出前处理).
显然,这不是最便携的解决方案。