系统相关
首页 > 系统相关> > linux – GNU并行负载均衡

linux – GNU并行负载均衡

作者:互联网

我试图找到一种方法来在群集上执行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