我有一个构建脚本,它运行得非常慢,特别是在Solaris上。我希望通过在多个作业中运行来提高性能。我怎么能这样做?
答案 0 :(得分:6)
试试GNU Parallel,它很容易使用:
GNU parallel是一个shell工具,用于使用一台或多台计算机并行执行作业。作业可以是单个命令,也可以是必须为输入中的每一行运行的小脚本。典型的输入是文件列表,主机列表,用户列表,URL列表或表列表。作业也可以是从管道读取的命令。然后,GNU parallel可以拆分输入并将其并行输入命令。
如果今天使用xargs和tee,你会发现GNU parallel非常容易使用,因为GNU parallel被编写为具有与xargs相同的选项。如果你在shell中编写循环,你会发现GNU parallel可以替换大多数循环并通过并行运行多个作业来使它们运行得更快。
GNU parallel确保命令的输出与您按顺序运行命令时的输出相同。这使得可以使用GNU parallel的输出作为其他程序的输入。
对于每行输入,GNU parallel将以行作为参数执行命令。如果没有给出命令,则执行输入行。几行将并行运行。 GNU parallel通常可以用作xargs或cat的替代品bash中。
您提到它是一个构建脚本。如果您使用命令行实用程序make
,则可以使用make's -j<N>
option并行构建版本:
GNU make知道如何一次执行多个食谱。通常,make一次只执行一个配方,等待它在执行下一个配方之前完成。但是,' - j'或'--jobs'选项告诉make同时执行许多配方。
此外,还有distcc
可与make
一起使用,以便将编译分发到多个主机:
export DISTCC_POTENTIAL_HOSTS='localhost red green blue'
cd ~/work/myproject;
make -j8 CC=distcc
答案 1 :(得分:2)
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