定期在Linux中读取性能计数器

7

有没有一种在Linux中定期读取性能计数器的方法?

我正在寻找类似于perf stat的东西,具有每X个周期采样的能力。

基本上,我想要能够每X个cpu周期读取一次某个程序的指令计数器(执行的指令数量)。

3个回答

8

好消息:在下一个内核版本(Linux 3.9)中,perf stat 将有一个选项 -I 毫秒数 以定期时间间隔打印事件差异。

https://patchwork.kernel.org/patch/2004891/

$ perf stat -I 1000 -e cycles noploop 10
noploop for 10 seconds
1.000086918         2385155642 cycles                    #    0.000 GHz
2.000267937         2392279774 cycles                    #    0.000 GHz
3.000385400         2390971450 cycles                    #    0.000 GHz
4.000504408         2390996752 cycles                    #    0.000 GHz
5.000626878         2390853097 cycles                    #    0.000 GHz

http://man7.org/linux/man-pages/man1/perf-stat.1.html

-I msecs, --interval-print msecs

Print count deltas every N milliseconds (minimum: 10ms)


选项是 -I 1000,用于每秒打印:http://man7.org/linux/man-pages/man1/perf-stat.1.html - -I msecs, --interval-print msecs "每N毫秒打印计数增量(最小值:10ms)"。 - osgx

5
在Linux中,perf工具似乎是通过在计数器达到特定值时记录事件来工作,而不是按照固定时间间隔进行采样。
命令perf record -e cycles,instructions -c 10000会在每10000个周期和每10000条指令时存储一个事件。它可以针对新命令或现有pid运行。它将记录到当前目录下的perf.data文件中。
分析数据是另一回事。使用perf script可以让你接近结果。
ls 16040 2152149.005813: cycles:          c113a068  ([kernel.kallsyms])
ls 16040 2152149.005820: cycles:          c1576af0  ([kernel.kallsyms])
ls 16040 2152149.005827: cycles:          c10ed6aa  ([kernel.kallsyms])
ls 16040 2152149.005831: instructions:          c1104b30  ([kernel.kallsyms])
ls 16040 2152149.005835: cycles:          c11777c1  ([kernel.kallsyms])
ls 16040 2152149.005842: cycles:          c10702a8  ([kernel.kallsyms])
...

你需要编写一个脚本,它可以从输出中获取一堆行,并计算该集合中的“周期”和“指令”事件的数量。你可以通过更改记录命令中的参数-c 10000来调整分辨率。
我通过对ls /运行perf statperf record进行验证分析。统计报告了2,634,205个周期和1,725,255条指令,而脚本输出则有410个周期事件和189个指令事件。 -c值越小,在读取循环中的开销就越大。 perf record 还有一个-F选项,可以按定期间隔采样。但是,我找不到在使用此选项时检索计数器值的方法。 编辑:perf stat 显然也适用于进程 ID,并在按下 ctrl-c 之前捕获数据。将其修改为始终捕获 N 秒并在循环中运行应该非常容易。

你如何运行perf脚本? 我尝试运行perf record -e cycles,instructions -c 10000 -R ls;``perf script,但是我遇到了一个致命错误:没有事件列表! - Ben J
@Skim 奇怪,对我来说只需键入 perf script 即可。perf report 对你是否有效,即 perf.data 文件是否记录正常? - jpa
原来我正在使用一个较旧的perf版本(2.6)。 perf 3.0.38就像你上面所说的那样工作。 当我有足够的声望时,我会回来给你点赞的。 谢谢! - Ben J

0

你可以轻松地修改perf stat来实现这个功能。

事实上,我已经实现了一个简单的修改,并很乐意与你分享这个改变。

我所做的更改主要在while(!done)循环内的run_perf_stat函数中。

只需将while(!done) {sleep(1);}下面的代码移动到循环内部,并将sleep更改为带有所需采样时间间隔的nanosleep即可。

这样就可以使perf在STDOUT(或STDERR)上打印输出。

如果您想存储这些值,建议您创建一个类型为struct stats的二维数组,每次采样时更新它,并定期写入文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接