我想利用AWS中的所有核心(48)来运行我的工作。我有600万个列表要运行,每个作业运行不到一秒[真正的0m0.004s用户0m0.005s sys 0m0.000s]。我的以下执行使用了所有核心,但不是100%。
gnu_parallel -a list.lst --load 100% --joblog process.log sh job_run.sh {} >>score.out
job_润.是
#!/bin/bash
i=$1
TMP_DIR=/home/ubuntu/test/$i
mkdir -p $TMP_DIR
cd $TMP_DIR/
m=`echo $i|awk -F '-' '{print $2}'`
n=`echo $i|awk -F '-' '{print $3}'`
cp /home/ubuntu/aligned/$m $TMP_DIR/
cp /home/ubuntu/aligned/$n $TMP_DIR/
printf '%s ' "$i"
/home/ubuntu/test/prog -s1 $m -s2 $n | grep 'GA'
cd $TMP_DIR/../
rm -rf $TMP_DIR
exit 0
您的问题是GNU Parallel的开销:启动作业需要5-10毫秒。因此,您可能会看到GNU Parallel在一个内核上以100%运行,但其余内存空闲。
但是你可以运行多个GNU Parallels:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Speeding-up-fast-jobs
因此,将列表拆分为较小的块并并行运行:
cat list.lst | parallel --block 100k -q -I,, --pipe parallel --joblog process.log{#} sh job_run.sh {} >>score.out
这应该运行48 + 1 GNU Parallels所以它应该使用你的所有核心。您的大多数核心都将用于开销,因为您的工作速度非常快。
如果你没有使用process.log
,那么可以用更少的开销完成:
perl -pe 's/^/sh job_run.sh /' list.lst | parallel --pipe --block 100k sh >>score.out
这将在每条线前面加上sh job_run.sh
,并为48个sh
s并行运行提供100kb的线。