GNU Parallel 可以执行更多的并行进程吗?

Dom*_*que 6 linux gnu-parallel

例如,我可以执行:

parallel -j 200 < list0
Run Code Online (Sandbox Code Playgroud)

其中“列表”有:

nice -n -20 parallel -j 100 < list2
nice -n -20 parallel -j 100 < list1
Run Code Online (Sandbox Code Playgroud)

这是否可行/可能?

Ole*_*nge 13

不仅是可能的;在某些情况下也建议这样做。

GNU Parallel 需要大约 10 毫秒来运行一个作业。因此,如果您有 8 个内核并且您运行的作业花费的时间少于 70 毫秒,那么您将看到 GNU Parallel 使用 100% 的单个内核,但其他内核上会有空闲时间。因此,您不会使用 100% 的所有内核。

推荐的另一种情况是,如果您想运行更多的作业-j0。目前-j0将并行运行大约 250 个作业,除非您调整一些系统限制。如果作业不受 CPU 和磁盘 I/O 的限制,那么运行超过 250 个作业是非常有意义的。例如,如果网络延迟是限制因素,情况就是如此。

但是,不推荐使用 2 个列表来拆分作业。推荐的方式是使用 GNU Parallel 调用 GNU Parallel:

cat list0 | parallel -j20 --pipe parallel -j100
Run Code Online (Sandbox Code Playgroud)

这将并行运行 2000 个作业。多跑调整-j。建议外部(20)至少是内核数,这样每个内核上至少会有一个 GNU Parallel 进程。

使用这种技术,您应该可以并行启动 20000 个作业;当您处理超过 32000 个进程时,事情就开始起作用了。

首先运行:

echo 4194304 | sudo tee /proc/sys/kernel/pid_max
Run Code Online (Sandbox Code Playgroud)

我能够运行:

seq 1000000 2000000000 |
  parallel -j16 --roundrobin --pipe parallel -j0 --pipe parallel -j0 sleep
Run Code Online (Sandbox Code Playgroud)

这将并行启动 100 万个进程(在我的系统上需要 300 G RAM)。


gol*_*cks 3

我不明白为什么它不可能——系统当然可以同时处理 200 个并行任务。

但是,这几乎肯定是不可取的,除非有某些特定原因需要并行运行确切数量的任务。这似乎不太可能;我能看到的唯一原因是因为您需要它们同时存在,因为它们需要交换信息,或者以混乱和不确定的方式与其他东西交换信息(例如,用于测试服务器程序)。

之所以不希望这样做,是因为就效率而言,理想状态是系统运行的进程数量等于可用处理器核心的数量。由于进程在某种程度上经常涉及 CPU 外部的瓶颈(例如磁盘 I/O),因此这个广义的理想数字范围从核心数 + 1 到核心数 * 2。

这是理想状态效率的原因是,如果任务本身消耗 100 万单位的处理器时间,则顺序运行同一任务 10 次将消耗 1000 万单位,并行运行同一任务将消耗 1000 万单位。然而,在后一种情况下,如果 CPU 数量少于 10 个,则会产生额外成本,因为系统必须不断地从一个任务来回切换到另一个任务。

这也是为什么通常具有 2 x 2 Ghz 核心的系统比具有 4 x 1 Ghz 核心的系统更快的原因。多核系统发展的主要原因是制造速度越来越快的CPU变得越来越困难,超过某个相对较低的点就不可能了。因此,解决方案是制造具有更多处理器内核的系统。

简而言之,如果你需要尽快做 20 件事,并且你有 4 个核心,那么最快的方法就是 5 组 4 组,或者 4 组 5 组,以留出等待的空闲时间。输入/输出。parallel允许您向其提供不定长度的列表,但限制一次运行的作业数量(请注意,该数量的默认值是核心数量)。

对此有一种例外,尽管它通常与某些类型的单一多线程程序相关(即,不是一堆单独的程序,而是一个占用多个内核的程序)。这是因为当一个程序可以通过相对独立的分支来完成某件事,而这些分支只需要偶尔进行协调(“偶尔”可能仍然是每秒 10 或 20 次)时,它会更容易,而且通常更灵活,将程序设计为在独立线程中执行此操作,而不是将其设计为以任意(异步)方式循环任务。视频游戏和 CAD 系统等图形密集型和/或交互式程序就属于这一类。

  • @Dominique也许整个事情都在等待您“wget”的服务器响应?如果是这种情况,您的 CPU 和系统的其余部分不太可能被征税。 (3认同)