为什么我看到 Bash 中后台进程的速度在下降 returns?

Why do I see diminishing returns on speed of backgrounding processes in Bash?

我想弄清楚为什么在 Bash 脚本中对大量进程进行后台处理时速度会下降 returns。类似于:

function lolecho() {
    echo "lol" &> /dev/null
}
c=0
while true; do
    for i in $(seq 1 1000); do
        lolecho &
        ((c+=1))
        if [[ $((c%1000)) -eq 0 ]]; then
            echo "Count $c"
        fi
    done
    sleep .1
done

它尖叫着高达 10,000、20,0000...但随后它开始放慢它可以在 70,000...80,0000 左右建立后台进程的速度。就像这样,计数打印到屏幕的速度会以看似线性的量减慢,具体取决于总数。

机器 运行 后台作业基本上立即完成的速度不应该是一致的,无论添加和关闭了多少?

答案是使用 Linux 内置 wait 命令:

function lolecho() {
    echo "lol" &> /dev/null
}
c=0
while true; do
    for i in $(seq 1 1000); do
        lolecho &
        ((c+=1))
        if [[ $((c%1000)) -eq 0 ]]; then
            echo "Count $c"
        fi
    done
    wait   # <------------
done

该脚本现在生成的进程总体上一致且更快。

评论有点长……OP 使用 wait 命令的解决方案很好,但可能需要稍微调整一下……

编码(在 OP 答案中):

  • 生成了 1K 个后台进程(可能会引起一些系统资源争用)
  • 我们等待所有 1K 个进程完成,然后我们...
  • 启动一组新的 1K 进程

为了获得更一致的吞吐量,我想:

  • 考虑限制并发后台进程的数量(例如,50?100?);将需要 运行 在您的特定系统上进行一些测试)以减少系统资源争用,然后 ...
  • 使用wait -n在一个进程完成后立即启动一个新进程

诚然,对于这个简单的示例 (lolecho()),这可能不会产生太大影响,但如果进行一些实际工作,您应该会发现您保持了相当稳定的工作量。

几个使用 wait -n 的例子: and

如果使用不支持 -n 标志的旧版本 bash