python – 线程可以切换CPU吗?

在我的工作场所,有一个共享的强大的24核服务器,我们在其上运行我们的工作.为了充分利用多核CPU,我编写了一个长期运行程序的多线程版本,以便在每个核心上同时运行24个线程(通过Jython中的线程库).

如果没有其他工作正在运行,程序将快速运行.但是,我在一个核心上同时运行一个大工作,因此在该特定核心上运行的线程花费了很长时间,从而减慢了整个程序的速度(因为线程需要在最后加入数据).然而,其他CPU上的线程已经很久完成执行 – 所以我基本上有23个核心空闲,1个核心运行线程和繁重的工作,或者至少这是我的诊断.通过查看time命令的输出进一步证实了这一点,sys时间与用户时间相比非常低(这意味着有很多等待).

如果一个CPU加载而其他CPU空闲,操作系统(在这种情况下为Linux)是否不将作业切换到不同的CPU?如果没有,我可以在我的程序中(在Jython中)这样做.偶尔查询不同的CPU负载然后切换到相对空闲的CPU负载应该不难.

谢谢.

解决方法:

来源http://www.ibm.com/developerworks/linux/library/l-scheduler/

To maintain a balanced workload across CPUs, work can be
redistributed, taking work from an overloaded CPU and giving it to an
underloaded one. The Linux 2.6 scheduler provides this functionality
by using load balancing. Every 200ms, a processor checks to see
whether the CPU loads are unbalanced; if they are, the processor
performs a cross-CPU balancing of tasks.

A negative aspect of this process is that the new CPU’s cache is cold
for a migrated task (needing to pull its data into the cache).

看起来Linux已经在核心之间平衡了一段时间的线程.

但是,假设Linux负载平衡(它没有),你的问题仍然减少到你有23个核心和24个任务的问题.在最糟糕的情况下(所有任务都需要相同的时间),这只需要23个任务的两倍,因为如果它们都需要相同的时间来完成,那么最后一个任务仍然需要等待另一个任务运行完成有一个免费的核心.

如果程序的挂钟时间受到大约2倍的减速影响,这可能就是问题所在.

如果它大大超过2倍,那么您可能使用旧版本的Linux调度程序.

上一篇:了解多核SMP系统[已关闭]


下一篇:使用四个CPU来运行python脚本