我有一个构建脚本,它运行得很慢,尤其是在 Solaris 上。我想通过在多个作业中运行它来提高它的性能。我怎样才能做到这一点?
2 回答
试试GNU Parallel,它很容易使用:
GNU 并行是一个 shell 工具,用于使用一台或多台计算机并行执行作业。作业可以是单个命令,也可以是必须为输入中的每一行运行的小脚本。典型的输入是文件列表、主机列表、用户列表、URL 列表或表列表。作业也可以是从管道读取的命令。然后 GNU 并行可以拆分输入并将其并行传输到命令中。
如果您今天使用 xargs 和 tee,您会发现 GNU parallel 非常易于使用,因为 GNU parallel 被编写为具有与 xargs 相同的选项。如果您在 shell 中编写循环,您会发现 GNU 并行可能能够通过并行运行多个作业来替换大多数循环并使其运行得更快。
GNU 并行确保命令的输出与按顺序运行命令时的输出相同。这使得使用 GNU 并行的输出作为其他程序的输入成为可能。
对于输入的每一行,GNU 并行将使用该行作为参数执行命令。如果没有给出命令,则执行输入行。多条生产线将并行运行。GNU 并行通常可以用作 xargs 或 cat | 的替代品。重击。
您提到它是一个构建脚本。如果您使用的是命令行实用程序,则可以使用make 的选项make
并行化构建:-j<N>
GNU make 知道如何一次执行多个配方。通常,make 一次只执行一个配方,等待它完成后再执行下一个。但是,'-j' 或 '--jobs' 选项告诉 make 同时执行许多配方。
此外,还有distcc
一个可用于make
将编译分发到多个主机:
export DISTCC_POTENTIAL_HOSTS='localhost red green blue'
cd ~/work/myproject;
make -j8 CC=distcc
GNU 并行非常好。@Maxim - 好建议+1。
一次性,如果您无法安装新软件,请尝试这个必须运行多次的慢命令,运行 slowcommand 17 次。更改内容以满足您的需求:
#!/bin/bash
cnt=0
while [ $cnt -le 17 ] # loop 17 times
do
slow_command &
cnt=$(( $cnt + 1 ))
[ $(( $cnt % 5 )) -eq 0 ] && wait # 5 jobs at a time in parallel
done
wait # you will have 2 jobs you di not wait for in the loop 17 % 5 == 2