什么是锁步采样?

21

我在几篇关于应用程序性能分析的帖子中看到了这个术语,但我不知道它实际上是什么意思以及它如何影响性能分析结果。

我在这里看到了dtrace的内容:

由于捕获内核堆栈要比用户级堆栈更便宜,因此速率也增加到199赫兹。使用奇数速率99和199可避免与其他活动同步取样并产生误导性结果。

这里是perf

-F 99:以99赫兹(每秒采样次数)进行采样。有时我会采样得更快(高达999赫兹),但这也会增加开销。99赫兹应该可以忽略不计。此外,值为“99”而不是“100”,是为了避免同步采样,从而产生偏斜的结果。

从我所见,所有性能分析器都应该避免同步采样,因为结果可能是“偏斜的”和“误导性的”,但我不明白为什么。我猜这个问题适用于所有分析器,但我对linux上的perf感兴趣。


采样的整个目的是在与被分析的代码不可预测的时间发生。 - Mike Dunlavey
1个回答

22
锁步采样是指分析采样与应用程序中的循环频率相同。这将导致采样经常发生在循环中的同一位置,因此它将认为该操作是最常见的操作并成为可能的瓶颈。
类比一下,就好像您想确定一条道路是否经常拥堵,而您每24小时采样一次。这个采样可能会与交通变化同步; 如果在早上8点或下午5点,它将会与高峰期重合,并得出道路非常繁忙的结论; 如果在凌晨3点,它将得出基本没有交通的结论。
为了使采样准确,需要避免这种情况。理想情况下,采样频率应该比应用程序的任何循环周期频率要高得多,或者以随机间隔进行采样,以使其发生在任何特定操作中的机会与该操作所需的时间成比例。但这通常不可行,因此下一个最好的方法是使用不与程序周期的可能频率重合的采样频率。如果程序中有足够的周期,则应确保采样发生在从每个循环开始的许多不同偏移量处。
与以上类比相关的是,每23小时或每天以随机时间采样将导致采样最终遇到一天中的所有时间;每个23天周期的采样将包括一天内的所有小时。这将产生一个更完整的交通水平图像。而每个小时进行采样将在短短几周内提供完整的图片。
我不确定为什么奇数频率可能会确保这一点。它似乎基于这样一个假设,即程序操作具有固有的频率,并且这些频率是偶数的。

样本不需要频繁。如果某个“瓶颈”占用了30%的时间,即使只取20个随机样本,它在这些样本中被暴露的概率也是99.2%。在此处查看 - Mike Dunlavey
@MikeDunlavey 这对于一个巨大的瓶颈来说是正确的,但这是一个相当不寻常的情况。您需要更频繁的样本来检测使用1-10%的东西。此外,请注意样本不是随机的,它们以一致的频率出现。整个重点是避免它与正在进行性能分析的代码具有相同的频率(您可能会持续错过那30%的部分)。 - Barmar
谢谢,主要问题是采样可以与什么相符?在Linux上,我怀疑它可能是默认运行在1000Hz的Linux内核定时器,但我对此不确定。 - ks1322
@Barmar:嗯,经验的长度并不重要,但当人们告诉我他们正在寻找10%或更少的东西时,他们实际上是在说他们认为代码非常接近最优,并且他们确信没有更大的问题潜藏着(因为如果有,那会让他们看起来很糟糕)。我看到的更典型的情况是,是的,可能存在可见的10%问题A,但也可能存在隐藏的50%问题B。如果他们能够找到并解决B,那么就可以将A变成20%,这样更容易找到。长话短说:程序员自欺欺人。 - Mike Dunlavey
1
@MikeDunlavey 无论如何,如果采样是同步的,它可能会完全扭曲结果。如果应用程序在一个块中花费了90%的时间,在另一个块中花费了10%的时间,并且采样与循环同步,那么它可能总是在小块中进行采样。您需要随机或高频采样以确保避免这种情况。 - Barmar

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