【问题标题】:What can cause the Windows scheduler to ignore a high priority thread when CPU cores are available?当 CPU 内核可用时,什么会导致 Windows 调度程序忽略高优先级线程?
【发布时间】:2020-01-30 20:35:52
【问题描述】:

我有一个多线程应用程序,其中一个线程具有时间紧迫的工作。此时间关键线程在启动时设置为“时间关键”优先级。此外,应用程序中的其他线程具有处理器关联掩码集,因此这个时间关键线程始终可以完全访问八个 CPU 内核(两个 Xeon 共 12 个内核)。服务器上没有运行其他应用程序(除了 Windows 自己运行的任何服务)。

尽管如此,即使采取了所有这些预防措施,我仍会记录时间关键线程一次没有运行 80-100 毫秒的事件。我的日志显示它有时会在任务中停止,并在 80-100 毫秒的时间间隔后再次恢复。

我的问题是:什么可能导致这些 80-100 毫秒的线程中断和/或我如何找出导致它们的原因?

其他一些可能相关的信息:

  • 中断与 其他 应用程序线程上的大量活动密切相关,但我正在监视资源监视器中的 CPU 使用情况图表,可以看到专用于时间关键任务的 CPU 少得多超过 100%(但在此期间拥有完全访问权限的 4 个通常是 100%)
  • 在这些性能高峰期也有大量的网络活动,在这些期间往往会发生停电。
  • 时间紧迫的任务是通过 PCIe 通信与硬件进行交互,但与此设备通信时不一定会发生“中断”事件。
  • 当一切正常时,时间关键线程只花费大约 1-2 毫秒来完成工作,然后在繁忙的循环中等待大约 30 毫秒。
  • 时间关键任务确实与一些其他线程共享资源,但它受到自旋锁的保护,并且日志记录表明在等待锁定时不会发生中断。此外,我可以看到这些其他线程没有保持自旋锁超过几微秒。
  • 通过任务管理器将应用程序优先级更改为“高”不会提高性能
  • 我有运行 Win7 和 Win10 的测试服务器,都显示问题。

【问题讨论】:

  • 我现在找不到源,但我记得亲和力掩码不是您想在生产中使用的东西。不过,我对此一无所知。
  • Here 是一个关于高频交易的非常好的 cppcon 演讲,它具有许多相同的特征。演讲者的建议可能会对您有所帮助。一个主要的收获是时间关键代码应该在它自己的 CPU 上运行,或者更好的是它自己的机器,这样你就可以控制处理器。
  • @MaxLanghof 我们没有在生产环境中运行亲和掩码,但我现在正在对它们进行试验,看看它们是否能解决这个问题。
  • @NathanOliver 那个谈话似乎很有趣,但演示者对延迟感兴趣,比我的情况要短一个数量级。 100 毫秒对于处理器来说是很长的时间,我还无法解释为什么会发生这种情况。此外,我为这个关键线程分配了多个 CPU 内核,因此 CPU 可用性似乎不是问题。
  • 你如何控制关键循环的时间? (睡眠、条件变量等)

标签: c++ multithreading windows-7 windows-10 scheduler


【解决方案1】:

过去几天我进行了一些测试,并且能够收集到一些有趣的数据,我将在下面总结。

  1. 当 CPU 大部分空闲时,几乎不会出现此问题
  2. 我可以很容易地通过从另一个进程中爆破 CPU 来导致故障,而该进程只是使用许多线程来消耗它
  3. 我认为我可以通过进程关联掩码限制大多数线程并将时间关键线程留在它们自己的专用 CPU 上来减少问题。然而,事实证明这不是一个完整的解决方案,因为存在一些导致争​​用问题的共享锁(用于传递信息和日志工具)。短暂持有关键锁的高争用但低优先级线程将在持有锁时进入休眠状态,让我的高优先级线程(在空闲 CPU 上,请注意)等待。
  4. 到目前为止,我运行的最有趣的测试是采用具有高故障率的特定 Windows 7 测试系统,我在完全相同的硬件上安装了一个全新的 Windows 10 副本并运行完全相同的软件。在完全相同的操作条件下,这极大地降低了故障率。

归根结底,我认为问题归结于 Windows 没有很好地处理 1) 线程优先级,一般和 2) 优先级反转问题尤其如此。令人惊讶的是,Windows 10 似乎比 Windows 7 能更好地处理这些问题。

Microsoft 有一个简短的article 关于操作系统如何处理优先级反转,但似乎当 CPU 被多个线程重载时,这种策略似乎不足以防止关键线程的长时间延迟,尤其是在 Windows 7 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2017-05-04
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多