有没有一种在Linux中定期读取性能计数器的方法?
我正在寻找类似于perf stat
的东西,具有每X个周期采样的能力。
基本上,我想要能够每X个cpu周期读取一次某个程序的指令计数器(执行的指令数量)。
好消息:在下一个内核版本(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)
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 stat
和perf record
进行验证分析。统计报告了2,634,205个周期和1,725,255条指令,而脚本输出则有410个周期事件和189个指令事件。 -c
值越小,在读取循环中的开销就越大。
perf record
还有一个-F
选项,可以按定期间隔采样。但是,我找不到在使用此选项时检索计数器值的方法。
编辑:perf stat
显然也适用于进程 ID,并在按下 ctrl-c 之前捕获数据。将其修改为始终捕获 N 秒并在循环中运行应该非常容易。perf record -e cycles,instructions -c 10000 -R ls;``perf script
,但是我遇到了一个致命错误:没有事件列表! - Ben Jperf script
即可。perf report
对你是否有效,即 perf.data 文件是否记录正常? - jpa你可以轻松地修改perf stat来实现这个功能。
事实上,我已经实现了一个简单的修改,并很乐意与你分享这个改变。
我所做的更改主要在while(!done)循环内的run_perf_stat函数中。
只需将while(!done) {sleep(1);}下面的代码移动到循环内部,并将sleep更改为带有所需采样时间间隔的nanosleep即可。
这样就可以使perf在STDOUT(或STDERR)上打印输出。
如果您想存储这些值,建议您创建一个类型为struct stats的二维数组,每次采样时更新它,并定期写入文件。
-I 1000
,用于每秒打印:http://man7.org/linux/man-pages/man1/perf-stat.1.html --I msecs, --interval-print msecs
"每N毫秒打印计数增量(最小值:10ms)"。 - osgx