python - 线程可以切换CPU吗?

标签 python multithreading jython cpu-usage multicore

在我的工作场所,有一个共享的强大的 24 核服务器,我们可以在上面运行我们的工作。为了充分利用多核 CPU,我编写了一个长时间运行的程序的多线程版本,每个内核同时运行 24 个线程(通过 Jython< 中的 threading)。

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

如果一个 CPU 加载而其他 CPU 空闲,操作系统(在本例中为 Linux)是否不会将作业切换到不同的 CPU?如果没有,我可以在我的程序中这样做吗(在 Jython 中)。偶尔查询一次不同的 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 倍,这可能就是问题所在。

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

关于python - 线程可以切换CPU吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901975/

相关文章:

c++ - 在线程退出时重生线程

python - boolean 标识 == True vs 是 True

python - 结合 Tkinter (Python) 和 Swing (Jython)

python - 使用 Bokeh 将图例定位在绘图区域之外

Python 可以导入未安装的模块

python - 我安装了 python 3.7.4 但无法安装 dolfin 包

C++ WIN32 : Short multitasking example

c# - 多线程 WPF Application : Dispatcher Invoke. 更高效的方法?

java - 使用 java eclipse 执行 Jython 脚本

python - 如何在Python中用ASCII字符(\u9078)分割行