细长问题:
当拥有更多阻塞线程然后CPU内核时,线程数量和线程阻塞时间之间的平衡是通过减少上下文切换开销来最大化CPU效率的吗?
我需要在Windows 7上控制各种各样的IO设备,使用x64多核处理器:PCI设备,网络设备,保存到硬盘驱动器的东西,要复制的大块数据,......最常见的政策是:“给它上线!”。几十个线程之后,这开始感觉像是一个坏主意。
我的核心都没有被100%使用,并且有几个内核仍处于空闲状态,但是在10到100毫秒的范围内出现延迟,无法通过IO阻塞或CPU密集型使用来解释。其他过程似乎也不需要资源。我怀疑上下文切换开销。
我有很多可能的解决方案:
非常感谢任何处理类似问题的案例研究。
答案 0 :(得分:3)
首先,听起来这些任务应该使用异步I / O(最好是IO完成端口),而不是使用单独的线程。阻塞线程通常是执行I / O的错误方法。
其次,被阻塞的线程不应该影响上下文切换。调度程序必须处理所有活动线程,因此,运行大量线程(未阻塞)可能会减慢上下文切换的速度。但是只要大多数线程被阻塞,它们都不应该影响那些没有的线程。
答案 1 :(得分:1)
10-100ms,其中一些核心空闲:它本身不是上下文切换开销,因为即使有核心交换和缓存刷新,交换机也比这些延迟快几个数量级。
Async I / O在这里没有多大帮助。实现ASIO的内核线程池也必须进行调度/交换,尽管这比用户空间线程更快,因为Wagnerian环周期更少。如果CPU负载成为一个问题,我肯定会前往ASIO,但事实并非如此。
你不缺CPU,那它是什么?是否有很多骚乱 - 内存不足?过多的分页肯定会导致大的延迟。你的页面文件在哪里?我把驱动器C推到了另一个快速SATA驱动器上。
PCI带宽?那里有几张电视卡?
磁盘控制器刷新活动 - 你有一个接近容量的SSD吗?对于无法解释的暂停,这总是很好的。即使我的128G SSD只有2/3满,我也会得到奇怪的停顿。
我从未遇到过与上下文交换时间特别相关的问题,而且我几十年来一直在编写multiThreaded应用程序。 Windows操作系统时间表&将准备好的线程快速地发送到核心上。 “几十个线程”本身,(即并非所有运行!),并不是一个远程问题 - 现在看看我的TaskManger /性能,我已经加载了1213个线程,并且没有任何性能问题,CPU使用率约为6%, (app在测试中运行在后台,bitTorrent等)。 Firefox有30个主题,VLC媒体播放器27,我的测试应用23.完全没问题写这篇文章。
考虑到10-100ms延迟的问题,如果摆弄线程优先级和/或改变你的工作加载到线程的方式提供任何改进,我会感到惊讶 - 其他东西填满了你的系统,(你还没有我编码的任何司机,你呢?:)。
perfmon能给出任何线索吗?
RGDS, 马丁
答案 2 :(得分:0)
我认为没有确凿的答案,这可能取决于 在你的操作系统上;有些人比其他人更好地处理线程仍然, 10到100 ms范围内的延迟不是由于上下文切换本身 (虽然它们可能是由于调度的特征 算法)。我在Windows下的经验是I / O非常好 效率低下,如果您正在进行任何类型的I / O,您将会阻止。和 一个进程或线程的I / O最终会阻塞其他进程 或线程。 (例如,在Windows下,可能没有任何意义 有多个线程处理硬盘驱动器。你无法阅读或 同时写几个部门,我的印象是 Windows不像其他系统那样优化访问。)
关于您的确切问题:
“如果我在一个线程中将20MB保存到硬盘驱动器,并且在一个线程中保存10MB 将其全部发布到同一个地方不是更好吗?“:这取决于 操作系统。通常情况下,使用时间或延迟不应减少 单独的线程,并取决于其他活动和操作系统 可能是一种改进。 (如果有多个磁盘请求) 例如,大多数操作系统将优化访问,重新排序请求 减少头部运动。)最简单的解决方案是尝试两者, 并查看哪个系统更好用。
“在多个硬盘驱动器的情况下如何工作?”:操作系统应该 如果请求不同,则能够并行执行I / O. 驱动器。
关于增加一个或多个theads的优先级,它是非常OS 依赖,但可能值得尝试。除非有重要的CPU 在具有较高优先级的线程中使用的时间,它不应该影响 用户界面 - 这些线程主要被I / O阻塞, 记住。
答案 3 :(得分:0)
好吧,我的Windows 7目前正在运行950个线程。我不认为再增加几打会产生重大影响。但是,你绝对应该看一个线程池或其他工作窃取设备 - 你不应该让新线程让它们阻塞。如果Windows默认提供异步I / O,则使用它。