选择多处理的进程数时是否有任何指导原则?

时间:2012-02-20 02:26:45

标签: python parallel-processing multiprocessing

我只是在多处理(而且它非常棒!),但是我想知道是否有任何指导来选择进程数量?它只是基于服务器上的核心数量?它是以某种方式基于应用程序运行(循环次数,它使用了多少cpu等)?等...我如何决定产生多少个进程?现在,我只是猜测并添加/删除流程,但如果有某种指导方针或最佳实践,那将会很棒。

另一个问题,我知道如果我添加太少会发生什么(程序是懒散的)但是如果我添加'太多'会怎么样?

谢谢!

2 个答案:

答案 0 :(得分:12)

如果所有线程/进程确实都是CPU绑定的,那么您应该运行与CPU报告核心一样多的进程。由于HyperThreading,每个物理CPU核心可能能够呈现多个虚拟核心。请致电multiprocessing.cpu_count以获取虚拟核心数。

如果只有1个线程的 p 受CPU限制,则可以通过乘以 p 来调整该数字。例如,如果一半的进程受CPU限制( p = 0.5),并且您有两个CPU,每个CPU有4个内核和2x超线程,则应该启动0.5 * 2 * 4 * 2 = 8个进程。

如果您的进程太少,您的应用程序将比预期的运行速度慢。如果您的应用程序完美地扩展并且仅受CPU限制(即,当以10倍的内核数量执行时速度快10倍),这意味着您的速度相对较慢。例如,如果您的系统需要8个进程,但只启动4个进程,那么您将只使用一半的处理能力并且需要两倍的时间。请注意,在实践中,没有应用程序可以完美地扩展,但有些(光线跟踪,视频编码)非常接近。

如果进程太多,则同步开销会增加。如果您的程序几乎没有同步开销,这不会影响整个运行时,但可能会使其他程序看起来比它们慢,除非您将进程设置为较低的优先级。如果您的操作系统具有良好的调度程序,理论上过多的进程(例如,10000)就可以了。实际上,几乎任何同步都会使开销难以忍受。

如果您不确定您的应用程序是否受CPU限制和/或完美缩放,只需观察具有不同线程数的系统负载。您希望系统负载略低于100%,或者更精确uptime为虚拟核心数。

答案 1 :(得分:2)

这绝对基于应用程序的功能。如果它的CPU很重,核心数量是一个明智的起点。如果IO很重,那么多个过程无论如何都无法提高性能。如果它主要是偶尔使用IO的CPU(例如PNG优化),则可以运行比核心数更多的进程。

唯一可以确定的方法是使用一些实际输入运行应用程序并检查资源利用率。如果您有足够的CPU时间,请添加更多工作进程。