我打算收集一个linux应用程序的统计信息,用于其程序执行的一小部分。该子集可以定义为前n个指令,或前n个循环。
对于定义的子集,我们对分支预测准确性,缓存命中率和核心的IPC等统计信息感兴趣。
perf工具看起来是这种监控的最佳选择。但是,在perf中指定子集的方法是运行一个给出子集信息的命令。
示例:如果我想在前n秒收集数据,我必须运行以下命令。
perf stat -p PID sleep n
在这里,我必须运行程序,然后使用其PID将perf附加到此程序。 perf使用pid PID 收集进程的数据,直到sleep命令运行。 但是,从我的程序开始执行的时间到附加到进程的perf的时间, x 指令的数量可能已被执行。由于x是随机的,因此绝对无法知道哪些指令是由perf分析的。
我会帮助我监控程序执行的建议
答案 0 :(得分:1)
我们使用简单的黑客作为此问题的解决方法。
让我们调用受监控的程序M,x秒是需要收集性能统计信息的时间。
我们编写了一个程序P,它会分叉M,然后睡眠x秒。从睡眠中醒来后,程序P会杀死自己及其所有后代。
if(fork()!=0)
then
sleep x seconds
kill me
else
execute monitored program
endif
在程序P上运行perf(性能收集实用程序)。统计数据反映了程序P和M的特性。由于程序P没有进行任何繁重的操作,因此不会对性能统计产生太大影响。
必须注意的是,程序的监控持续时间必须足够大,以掩盖程序P的统计数据。