【发布时间】: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