【问题标题】:Are there any guidelines to follow when choosing number of processes with multiprocessing?在选择具有多处理的进程数量时,是否有任何指导方针可以遵循?
【发布时间】:2012-02-20 02:26:44
【问题描述】:

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

另一个问题,我知道如果我添加的太少(程序很慢)会发生什么,但是如果我添加“太多”呢?

谢谢!

【问题讨论】:

    标签: python parallel-processing multiprocessing


    【解决方案1】:

    如果您的所有线程/进程确实受 CPU 限制,则您应该运行与 CPU 报告内核一样多的进程。由于HyperThreading,每个物理CPU内核可能能够呈现多个虚拟内核。调用multiprocessing.cpu_count获取虚拟核心数。

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

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

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

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

    【讨论】:

    • 感谢您的出色回答。这一切都不知道。如果应用程序中有一些非 cpu 绑定部分怎么办。例如,很多 cpu 计算,但最终结果被保存到文件或数据库中。这是否意味着我应该创建更多进程,因为有些必须等待最终的网络(数据库)或磁盘写入(文件写入)?
    • @Lostsoul 一般来说,如果磁盘绑定活动的份额很大,则可以。如果您正在编写一个简短的求和文件(例如,光线追踪复杂场景后的图像),则此效果可以忽略不计。如果您的应用程序读取和写入大量数据,您确实应该增加进程数。用一段更新了答案:如果您不确定,请尝试一下!
    • 只是添加到观察部分:您显然希望避免由于同步开销而增加 CPU 利用率。因此,在进行实验时,您应该同时测量系统负载和应用程序吞吐量。
    【解决方案2】:

    这绝对取决于应用程序的功能。如果它是 CPU 密集型的,那么内核数量是一个合理的起点。如果它是 IO 繁重的,那么多个进程无论如何都不会提高性能。如果它主要是带有偶尔 IO 的 CPU(例如 PNG 优化),则您可以运行比核心数量更多的进程。

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

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2013-03-29
      • 2013-07-05
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多