Linux内核去除定时器滴答声是否会引入基准测试时间变化?

8
我正在运行一些基准测试,想知道是否使用“无滴答”(即CONFIG_NO_HZ_FULL_ALL)Linux内核对基准测试有利还是有害。
我将重复运行许多次基准测试,每次都使用新的进程。我希望尽可能控制尽可能多的变化源。
我在互联网上阅读了一些资料:

我从这些来源中了解到:

  • 在默认配置(CONFIG_NO_HZ=y)下,只有非空闲CPU会接收时钟中断。因此,在此模式下,我的基准测试将始终接收时钟中断。

  • 在“无时钟中断”模式(CONFIG_NO_HZ_FULL_ALL)下,除了一个CPU(引导处理器)之外的所有CPU都处于“自适应时钟中断”模式。当CPU处于自适应时钟中断模式时,仅在调度队列中存在多个作业时才会接收时钟中断。其想法是,如果队列中只有一个进程,则不可能发生上下文切换,因此不需要发送时钟中断。

一方面,不让基准测试接收时钟中断似乎是个好主意,因为我们排除了时钟例程作为变化源(我们不知道时钟例程需要多长时间)。另一方面,我认为无时钟中断模式可能会引入基准测试时间的变化。

考虑在无时钟中断内核上运行我的基准测试场景。假设我们重复两次基准测试。

  • 假设第一次运行非常幸运,能够被调度到一个先前空闲的自适应时钟CPU上。 因此,这个基准测试将不会被时钟中断。

  • 当基准测试第二次运行时,也许就没有那么幸运了,可能会被放在已经安排了一些进程的CPU上。这次运行将被定期中断以决定是否应该切换到其他进程。

我们知道时钟中断会对性能造成影响(上下文切换加上运行例行程序所需的时间)。因此,第一次基准测试运行具有不公平的优势,并且似乎运行得更快。

还要注意的是,最初具有自适应时钟CPU的基准测试可能会发现,在基准测试的中间阶段,另一个进程被抛到同一个CPU上。 在这种情况下,基准测试最初不会接收时钟中断,然后稍后开始接收它们。 这意味着基准测试的性能随时间而变化。

因此,我认为无时钟中断模式(至少在我的基准测试场景下)引入了时间变化。 我的推理正确吗?

一个解决方案是为基准测试使用独立的自适应时钟CPU(isolcpus + taskset),但是我们已经排除了独立的CPU,因为这会在多线程基准测试中引入人为的减速。

谢谢

1个回答

6
对于你所提到的“不幸”情况,必须在相同处理器上预定一个活动作业。假设你有多个处理器,这种情况在其他情况下通常不太可能发生。即使在一两次情况下发生了这种情况,也意味着你的基准测试可能会受到一两个滴答的影响 - 这似乎并不成问题。
另一方面,如果这种情况发生得更多,这将是高处理器负载的普遍指示 - 这种情况对于运行基准测试来说也不是理想的情况。
然而,我认为“滴答”不太可能是你基准测试时间变化的重要来源。调度程序应该是O(1)的。我怀疑你不会看到tickless和non-tickless模式之间的变化差异很大。

关于您的回答有几个问题:1)如果我的基准测试与几个未准备运行的进程(例如在IO上被阻塞)共享CPU,那么我的基准测试会收到时钟节拍吗?查看我们的一个基准测试机器,所有CPU都有许多进程。大多数是等待的守护程序。2)据我所知,时钟节拍发生在“每秒100到1000次之间”(请参见上面链接的LWN文章),因此如果我的基准测试正在接收时钟节拍,我认为它会超过几个,对吗? - Edd Barrett
  1. 我不这么认为,否则它就不是真正的无滴答系统了...(正如您所指出的,通常会为每个处理器分配进程 - 其中一些进程可能正在睡眠,等待网络I/O等 - 无滴答系统的整个重点在于当您不需要它们时不要有滴答声)。
  2. 只有当处理器上有2个或更多活动进程调度时,它才会接收到滴答声,对吗?如果这种情况发生超过几次,您的系统将负载过重。如果您正在进行基准测试,则不应该出现这种情况。
- davmac
我不确定阻塞的进程是否会引起时钟中断。可能会使用时钟中断来判断这些阻塞的进程是否已准备好。但是我并不确定。 - Edd Barrett
让我这样说吧 - 按照你提出的方式,只有当处理器的调度队列中仅有一个进程(无论是活动的还是非活动的)时,才能从去除滴答操作中获得任何好处。为了达到这个目标,运行进程的数量必须小于处理器数量的两倍。否则这将毫无意义。 - davmac
很好 :) 正如您在问题中发布的第一个链接所述,“无滴答”模式被完整地描述为“省略仅有一个可运行任务的CPU的调度时钟滴答”(这里的关键词是可运行 - 如果进程处于空闲等待状态,则它不可运行)。我认为这是很好的证据。 - davmac
显示剩余2条评论

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