有没有办法在
Linux中定期读取性能计数器?
像perf stat这样能够对每个X周期进行采样的东西就是我正在寻找的东西.
基本上我希望能够为某些程序每X量的cpu周期读取指令计数器(执行的指令数).
解决方法
似乎Linux中的perf工具通过在计数器达到特定值时记录事件而不是定期采样来工作.
命令perf记录-e周期,指令-c 10000每10000个周期和每10000个指令存储一个事件.它可以针对新命令或现有pid运行.它记录到当前目录中的perf.data.
分析数据是另一回事.使用perf脚本让你非常接近:
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记录来验证分析. Stat报告了2 634 205个周期,1 725 255个指令,而脚本输出具有410个周期事件和189个指令事件. -c值越小,循环读取中的开销就越大.
还有一个-F选项来执行记录,定期采样.但是,在使用此选项时,我找不到检索计数器值的方法.
编辑:perf stat显然也适用于pids,并捕获数据直到按下ctrl-c.修改源应该非常容易,因此它总是捕获N秒,然后在循环中运行它.