【问题标题】:What is lockstep sampling?什么是锁步采样?
【发布时间】:2023-04-06 23:30:01
【问题描述】:

我在几篇关于分析应用程序的帖子中看到了这个术语,但我不明白它的实际含义以及它如何影响分析结果。

我看过here for dtrace:

速率也增加到 199 赫兹,因为捕获内核堆栈是 比用户级堆栈便宜得多。奇数费率,99 和 199,用于避免与其他活动同步采样 并产生误导性的结果。

Here for perf:

-F 99:以 99 赫兹采样(每秒采样数)。我有时会比这更快(高达 999 赫兹)采样,但这也需要开销。 99 赫兹应该可以忽略不计。此外,值 '99' 而不是 '100' 是 避免锁步采样,这会产生偏斜的结果。

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

【问题讨论】:

  • 整个采样点是在与被分析的代码相关的不可预测的时间发生的。

标签: linux profiling perf


【解决方案1】:

锁步采样是指分析样本以与应用程序中的循环相同的频率出现。这样做的结果是样本经常出现在循环中的同一位置,因此它会认为该操作是最常见的操作,并且可能是瓶颈。

如果您试图确定道路是否出现拥堵,并且您每 24 小时对其进行一次采样,就可以类比。该样本可能与流量变化保持同步;如果是在早上 8 点或下午 5 点,将与高峰时间相吻合,并得出道路非常繁忙的结论;如果是凌晨 3 点,它将得出结论,实际上根本没有交通。

为了使采样准确,需要避免这种情况。理想情况下,样本应该比应用程序中的任何周期或随机间隔更频繁,以便它在任何特定操作中发生的机会与操作所花费的时间量成正比。但这通常是不可行的,因此下一个最好的办法是使用与可能的程序周期频率不一致的采样率。如果程序中有足够多的循环,这应该确保样本发生在每个循环开始的许多不同偏移处。

为了将其与上述类比联系起来,每 23 小时或每天随机时间采样将导致样本最终遇到一天中的所有时间;每 23 天的样本周期将包括一天中的所有时间。这样可以更全面地了解流量水平。每小时采样一次,只需几周即可提供完整的图片。

我不确定为什么奇数频率可能会确保这一点。它似乎是基于这样一个假设,即程序操作存在固有频率,而且这些频率是均匀的。

【讨论】:

  • 样本不需要频繁。如果某个“瓶颈”花费了 30% 的时间,那么即使只随机抽取 20 个样本,它在其中两个或更多样本上暴露的机会也是 99.2% Check here.
  • @MikeDunlavey 对于一个巨大的瓶颈来说确实如此,但这是一个非常不寻常的情况。您需要更频繁的样本来检测使用 1-10% 的事物。另外,请注意样本不是随机的,它们的频率一致。这样做的重点是避免它与正在分析的代码处于相同的频率(您可能会一直错过 30% 的部分)。
  • 谢谢,主要问题是什么采样可以重合?在 linux 上,我怀疑它可能是默认以 1000Hz 运行的 linux 内核计时器,但我不确定。
  • @Barmar:好吧,经验的长短并不重要,但是当人们告诉我他们正在寻找 10% 或更少范围内的东西时,他们真的是在说他们认为代码是非常接近最佳状态,他们肯定没有什么更大的潜伏(因为如果有的话会让他们看起来很糟糕)。我所看到的更典型的是,是的,可能存在可见的问题 A,即 10%,但也可能存在隐藏的问题 B,即 50%。如果他们能找到并修复 B,那会使 A 占 20%,所以更容易找到。总而言之:程序员自欺欺人。
  • @MikeDunlavey 在任何情况下,如果采样处于锁定步骤,​​它可能会完全扭曲结果。如果应用程序在一个块中花费 90% 的时间,在另一个块中花费 10%,并且样本与循环同步,则它可能总是在小块中进行采样。您需要随机或高频采样来确保避免这种情况。
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2012-05-10
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多