我正在尝试找到一种在群集上执行CPU密集型并行作业的方法。我的目标是为每个核心安排一个作业,以便每个作业有望在计划后获得100%的CPU利用率。这是迄今为止所提出的:
FILE build_sshlogin.sh
#!/bin/bash
serverprefix="compute-0-"
lastserver=15
function worker {
server="$serverprefix$1";
free=$(ssh $server /bin/bash << 'EOF'
cores=$(grep "cpu MHz" /proc/cpuinfo | wc -l)
stat=$(head -n 1 /proc/stat)
work1=$(echo $stat | awk '{print $2+$3+$4;}')
total1=$(echo $stat | awk '{print $2+$3+$4+$5+$6+$7+$8;}')
sleep 2;
stat=$(head -n 1 /proc/stat)
work2=$(echo $stat | awk '{print $2+$3+$4;}')
total2=$(echo $stat | awk '{print $2+$3+$4+$5+$6+$7+$8;}')
util=$(echo " ( $work2 - $work1 ) / ($total2 - $total1) " | bc -l );
echo " $cores * (1 - $util) " | bc -l | xargs printf "%1.0f"
EOF
)
if [ $free -gt 0 ]
then
echo $free/$server
fi
}
export serverprefix
export -f worker
seq 0 $lastserver | parallel -k worker {}
此脚本由GNU parallel使用,如下所示:
parallel --sshloginfile <(./build_sshlogin.sh) --workdir $PWD command args {1} ::: $(seq $runs)
此技术的问题在于,如果有人在群集中的服务器上启动另一个CPU密集型作业,而不检查CPU使用情况,则脚本将最终将作业调度到正在使用的核心。此外,如果在第一个作业完成时,CPU使用率已经改变,那么新释放的核心将不会被包括在内,以便通过GNU并行计划剩余的作业。
所以我的问题如下:有没有办法让GNU并行在重新计算每个作业之前重新计算免费核心/服务器?欢迎任何其他解决问题的建议。< / p>
注意:在我的群集中,所有核心都具有相同的频率。如果有人可以推广以考虑不同的频率,那也是受欢迎的。
答案 0 :(得分:5)
请看--load
,这正是针对这种情况的。
不幸的是,它没有考虑CPU利用率而是负载平均值。但是,如果您的群集节点没有繁重的磁盘I / O,那么CPU利用率将非常接近平均负载。
由于平均负载变化缓慢,您可能还需要使用新的--delay
选项来平均加载平均时间。
答案 1 :(得分:1)
尝试mpstat
mpstat
Linux 2.6.32-100.28.5.el6.x86_64 (dev-db) 07/09/2011
10:25:32 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
10:25:32 PM all 5.68 0.00 0.49 2.03 0.01 0.02 0.00 91.77 146.55
这是基于每个核心的整体快照
$ mpstat -P ALL
Linux 2.6.32-100.28.5.el6.x86_64 (dev-db) 07/09/2011 _x86_64_ (4 CPU)
10:28:04 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:28:04 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.99
10:28:04 PM 0 0.01 0.00 0.01 0.01 0.00 0.00 0.00 0.00 99.98
10:28:04 PM 1 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 99.98
10:28:04 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:28:04 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
有很多选项,这两个选项给出了每个cpu的简单实际%idle。检查联机帮助页。