在我的工作场所,有一个共享的强大的24核服务器,我们可以在其上运行我们的工作。为了充分利用多核CPU,我编写了一个长期运行程序的多线程版本,以便同时在每个核心上运行24个线程(通过threading
中的Jython
库。 / p>
如果没有其他工作正在运行,程序将快速运行。但是,我在一个核心上同时运行一个大工作,因此在该特定核心上运行的线程花费了很长时间,从而减慢了整个程序的速度(因为线程需要在最后加入数据)。然而,其他CPU上的线程已经很久完成执行 - 所以我基本上有23个核心空闲,1个核心运行线程和繁重的工作,或者至少这是我的诊断。通过查看time
命令的输出进一步证实了这一点,系统时间与用户时间相比非常低(这意味着有很多等待)。
如果加载了一个CPU而其他CPU处于空闲状态,操作系统(在这种情况下为Linux
)是否不将作业切换到不同的CPU?如果没有,我可以在我的程序中执行此操作(在Jython
中)。偶尔查询不同的CPU负载并切换到相对空闲的CPU负载应该不难。
感谢。
答案 0 :(得分:1)
来源http://www.ibm.com/developerworks/linux/library/l-scheduler/:
为了在CPU之间保持平衡的工作负载,工作可以 重新分配,从过载的CPU中获取工作并将其提供给 欠载了一个。 Linux 2.6调度程序提供此功能 通过使用负载平衡。每隔200ms,一个处理器检查一下 CPU负载是否不平衡;如果是,处理器 执行任务的跨CPU平衡。
此过程的一个消极方面是新CPU的缓存很冷 对于迁移的任务(需要将其数据提取到缓存中)。
看起来Linux已经在核心之间平衡了一段时间的线程。
但是,假设Linux负载平衡立即(它没有),您的问题仍然会减少到有23个核心和24个任务的问题。在最糟糕的情况下(所有任务都需要相同的时间),这只需要23个任务的两倍,因为如果它们都需要相同的时间来完成,那么最后一个任务仍然需要等待另一个任务运行完成有一个免费的核心。
如果程序的挂钟时间受到约2倍的减速影响,这可能就是问题所在。
如果它大大超过2倍,那么您可能使用旧版本的Linux调度程序。