4

在我的工作场所,有一个共享的强大的 24 核服务器,我们在其上运行我们的工作。为了利用多核 CPU 的全部功能,我编写了一个多线程版本的长时间运行程序,这样每个内核上同时运行 24 个线程(通过threading库中的库Jython)。

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

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

谢谢。

4

1 回答 1

1

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

为了在 CPU 之间保持平衡的工作负载,可以重新分配工作,从过载的 CPU 中获取工作并将其分配给负载不足的 CPU。Linux 2.6 调度程序通过使用负载平衡来提供此功能。每 200 毫秒,处理器检查一次 CPU 负载是否不平衡;如果是,则处理器执行跨 CPU 的任务平衡。

这个过程的一个不利方面是新 CPU 的缓存对于迁移的任务来说是冷的(需要将其数据拉入缓存中)。

看起来 Linux 已经在内核之间平衡线程一段时间了。

但是,假设 Linux 负载立即平衡(事实并非如此),您的问题仍然会减少到您有 23 个内核和 24 个任务的问题。在最坏的情况下(所有任务花费相同的时间),这需要的时间是只有 23 个任务的两倍,因为如果它们都花费相同的时间来完成,那么最后一个任务仍然需要等待另一个任务运行完成之前有一个免费的核心。

如果程序的挂钟时间减慢了大约 2 倍,这可能就是问题所在。

如果它比 2 倍差很多,那么您可能使用的是旧版本的 Linux 调度程序。

于 2013-09-22T22:48:03.440 回答