标签:bash linux parallel-processing cluster-computing gnu-parallel
我试图找到一种方法来在群集上执行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并行重新计算免费核心/服务器?欢迎任何其他解决问题的建议.
注意:在我的群集中,所有核心具有相同的频率.如果有人可以推广以考虑不同的频率,那也是受欢迎的.
解决方法:
看看–load就是针对这种情况的.
不幸的是,它没有考虑CPU利用率而是负载平均值.但是,如果您的群集节点没有繁重的磁盘I / O,那么CPU利用率将非常接近平均负载.
由于负载平均值变化缓慢,您可能还需要使用新的–delay选项来平均加载平均时间.
标签:bash,linux,parallel-processing,cluster-computing,gnu-parallel 来源: https://codeday.me/bug/20190826/1724703.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。