0

我试图弄清楚为什么在后台处理 Bash 脚本中的许多进程时,我会看到速度回报递减。就像是:

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 左右建立后台进程的速度。例如,计数打印到屏幕的速度会减慢一个看似线性的量,具体取决于总数。

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

4

2 回答 2

0

答案是使用 Linux 内置的等待命令:

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

现在,该脚本通常会一致且更快地生成流程。

于 2020-12-03T22:30:40.360 回答
0

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

如编码(在 OPs 回答中):

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

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

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

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

使用的几个例子wait -nherehere - 请参阅答案的第二部分

bash如果使用不支持该-n标志的旧版本,则使用轮询过程的示例

于 2020-12-04T22:40:45.307 回答