据我了解,Linux的Performance Counters子系统使用perf record
命令对CPU和硬件计数器执行基于样本的分析(例如缓存未命中)。
如何指定perf record
的采样率?我从手册页中看到的最接近的是一些有点神秘的选项“ - c, - count =要抽样的事件期间”,但不清楚这是指这段时间是持续时间还是逆速率周期(如果是后者,它预期的单位)。
在移动Android设备上为应用程序采样的“良好”采样率是多少?什么比率太低而无用,什么比率过高?
答案 0 :(得分:4)
首先,您需要获取perf list
的事件列表。我没有使用android的经验,所以,如果可以,请展示这个列表中最有趣的部分。
1)-c
是将采集样本之间的事件计数。 (仅对第一个事件进行采样,1个采样全部,100000个采样每第100000个事件)例如。如果有一个cpu tick事件(像TSC那样smth),那么count是ticks的数量,我建议你设置的采样时间不要超过1毫秒。要获得滴答计数,请使用公式:CPU_Freq_in_MHz * 1000
。这是每毫秒获取样本的事件计数,例如对于800 MHz CPU和tick事件使用-c 800000
。
对于其他事件,您应该估计,他们会做多少次。如果您不知道,您可以从计数值开始计算,然后检查是否收集了足够的样本。如果没有,请将计数降低十次并再次检查。刻度的计数将是安全的,因为刻度线是任何CPU中最常见的事件之一。
2)对于各种PMU,良好的速率是不同的,使用“-e”或“--event =”选项进行选择。如果事件很少,每秒不超过1000,您甚至可以对每个事件进行采样。如果事件就像缓存未命中,您应该尝试几种变体,因为良好的值取决于采样的代码。采样率太低会使您获得少量样本,结果将不可靠且噪声很大。但是对于太高的速率,结果也会被噪声化,因为每个PMU都会影响跟踪的程序。我建议你平均每秒使用不超过1000个事件。