【问题标题】:perf stat for part of program部分程序的性能统计
【发布时间】:2014-12-03 17:51:47
【问题描述】:

是否可以使用 perf 仅收集程序执行部分的硬件计数器统计信息?如果有,怎么做?

likwid 提供了能够定义命名区域的功能,但如果这在只安装 perf 的系统上是可能的,那就太好了。

之前的一些问题已经返回了相关答案,但还是有一些不足:

  • Using probe 我得到了同样的错误,我使用的是一个稍新的内核(3.13)。这些修复程序是否在更新的版本中可用?
  • Using perf_event_open 我想保持在命令行上定义事件的灵活性。我还查看了 perf stat itself 的代码,但它似乎没有通过调用 perf_event_open 进行设置。

【问题讨论】:

  • 是的,您可以使用 perf_event_open 来完成。 perf stat 确实调用它(run_perf_stat → __run_perf_stat → create_perf_stat_counter → perf_evsel__open_per_thread → __perf_evsel__open)。
  • Perf 没有库可以将计数器集成到程序中或在程序中定义区域(它只是最近才获得普通的 JIT 代理接口 lwn.net/Articles/633846 优于 /tmp/perf-$pid.map 文件)。您可以尝试使用诸如libpfm4PAPI(可能使用libpfm4)之类的库来从您的程序中计算硬件性能。他们会为您编写 perf_event_open,libpfm4 也有事件名称表,并且有一些编程方法可以使用 env vars/cmdline args 来指定事件名称。

标签: linux perf likwid


【解决方案1】:

生成一个子进程来运行 perf stat。
perf stat 附加到父级。
在需要时从父进程中终止子进程。

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

int main()
{

    int pid= getpid();
    int cpid = fork();


    if( cpid == 0)
    {
        // child process .  Run your perf stat
        char buf[50];
        sprintf(buf, "perf stat -p %d   > stat.log 2>&1",pid);
        execl("/bin/sh", "sh", "-c", buf, NULL);

    }
    else
    {
        // set the child the leader of its process group
        setpgid(cpid, 0);

        //////////////////////////////////////////////
        // part of program you wanted to perf stat
        sleep(3);
        ////////////////////////////////////////////////


        ////////////////////////////////////////////////////////////////
        // stop perf stat by killing child process and all its descendants(sh, perf stat etc )
        kill(-cpid, SIGINT);
        ////////////////////////////////////////////////////////////////////


        // rest of the program
        sleep(2);
     }
}

【讨论】:

    【解决方案2】:

    您可以使用libpfcjevents,它们都是Linux 兼容的库,允许通过rdpmc 在用户程序中的任意点编程和读取性能计数器。

    这不会直接帮助您请求在命令行上指定事件,但您可以基于 ocperf.py 代码或 libpfm4 一起支持某些内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2015-08-21
      • 1970-01-01
      • 2018-03-09
      • 2012-04-08
      相关资源
      最近更新 更多