Linux性能监控,任何监控每个线程的方法?

时间:2015-01-21 02:39:54

标签: c++ linux multithreading performance perf

我正在使用Linux Ubuntu,并使用C ++编程。我已经能够使用perf_event访问性能计数器(指令计数,缓存未命中等)(实际上使用来自此链接的程序:https://github.com/castl/easyperf)。

但是,现在我正在使用pthreads运行多线程应用程序,需要指令计数和循环来分别完成每个线程。关于如何解决这个问题的任何想法?

谢谢!

3 个答案:

答案 0 :(得分:3)

perf是您可以使用的系统分析工具。它不像https://github.com/castl/easyperf),它是一个库,你可以在你的代码中使用它。按照步骤使用它来分析您的程序:

  1. 在Ubuntu上安装perf。在不同的Linux发行版中,安装可能会大不相同。您可以找到安装教程。

  2. 只需运行您的程序并获取程序的所有线程ID:

    ps -eLf | grep [application name]

  3. 根据手册页打开单独的终端并以perf stat -t [threadid]运行perf:

    usage: perf stat [<options>] [<command>]

    -e, --event <event>   event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid <n>         stat events on existing process id
    -t, --tid <n>         stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose (show counter open errors, etc)
    -r, --repeat <n>      repeat command and print average + stddev (max: 100)
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
    
  4. 有一个关于perf的{​​{3}},您可以对它有所了解。

答案 1 :(得分:1)

请查看perf工具文档here,它支持您要查看的一些事件(例如:instructionscache-misses)轮廓。从上面链接的Wiki页面中提取:

  

perf工具可用于计算每线程,每进程,每个CPU或系统范围内的事件。在每线程模式下,计数器仅监视指定线程的执行。线程计划完毕后,监视将停止。当一个线程从一个处理器迁移到另一个处理器时,计数器将保存在当前处理器上并在新处理器上恢复。

答案 2 :(得分:1)

您可以使用标准工具访问perf_event - perf(来自linux-tools)。它可以与程序的所有线程一起使用,并报告摘要配置文件和每个线程(每个pid / per-tid)配置文件。

此配置文件不是精确的硬件计数器,而是每N个事件采样的结果,N调整到大约99 Hz(每秒时间)。您还可以尝试使用-c 2000000选项来获取每两百万次硬件事件的样本。例如,周期事件(完整列表 - perf list或尝试perf stat ./program中列出的一些)

perf record -e cycles -F 99 ./program
perf record -e cycles -c 2000000 ./program

所有主题的摘要。 -n将显示样本总数

perf report -n

每个pid(实际上这里使用了tid,所以它允许你选择任何线程)。

文本变体将列出使用摘要样本计数记录的所有线程(使用-c 2000000,您可以将样本计数乘以200万来估计线程的hw事件计数)

perf report -n -s pid | cat

或类似ncurses的交互式变体,您可以在其中选择任何线程并查看其自己的配置文件:

perf report -n -s pid