[英]Linux Performance Monitoring, any way to monitor per-thread?
我正在使用Linux Ubuntu,并使用C ++进行编程。 我已经能够使用perf_event(实际上使用此链接中的程序: https : //github.com/castl/easyperf )访问性能计数器(指令计数,高速缓存未命中等)。
但是,现在我正在使用pthreads运行多线程应用程序,并且需要单独的指令计数和周期来完成每个线程。 关于如何解决这个问题的任何想法?
谢谢!
perf是您可以使用的系统配置工具。 它不像https://github.com/castl/easyperf ),它是一个库,您可以在代码中使用它。 按照以下步骤并使用它来配置您的程序:
在Ubuntu上安装perf
。 在不同的Linux发行版中,安装可能会完全不同。 您可以找到安装教程行。
只需运行您的程序并获取程序的所有线程ID:
ps -eLf | grep [application name]
打开单独的终端,并根据手册页以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
请在此处查看perf
工具文档,它支持您要分析的一些事件(例如: instructions
和cache-misses
)。 从上面链接的Wiki页面中提取:
perf工具可用于在每个线程,每个进程,每个cpu或系统范围内对事件进行计数。 在单线程模式下,计数器仅监视指定线程的执行。 线程被调度后,监视将停止。 当线程从一个处理器迁移到另一个处理器时,计数器将保存在当前处理器上,并在新的处理器上恢复。
您可以使用标准工具访问perf_event
- perf
(来自linux-tools)。 它可以与程序的所有线程一起使用,并可以报告摘要概要文件和每个线程(每个pid /每个tid)概要文件。
此配置文件不是精确的硬件计数器,而是每N个事件采样的结果,其中N调整为达到99 Hz(每秒的次数)左右。 您也可以尝试使用-c 2000000
选项来获取每2百万个硬件事件的样本。 例如,cycles事件(完整列表perf stat ./program
perf list
或尝试一些perf stat ./program
列出的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
您可以将样本计数乘以-c 2000000
万来估算该线程的硬件事件计数)
perf report -n -s pid | cat
或类似ncurses的交互式变量,您可以在其中选择任何线程并查看其自己的配置文件:
perf report -n -s pid
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.