0

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

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

4

1 回答 1

0

Ftrace转储很大。它转储每个进程的日志,而我只需要我的程序及其线程的信息。Ftracefilter 只能对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(调度程序的可调度实体)是(与Linuxtask_struct中的进程或线程关联的数据结构)中的一个字段,显示可调度实体的总物理运行时间sum_exec_runtime

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

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

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

于 2020-05-09T13:51:15.293 回答