linux - GNU 并行负载均衡

标签 linux bash parallel-processing cluster-computing gnu-parallel

我正在尝试找到一种在集群上执行 CPU 密集型并行作业的方法。我的目标是为每个核心安排一个作业,以便每个作业在安排后有望获得 100% 的 CPU 使用率。这是到目前为止已经提出的:

文件 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 选项来为平均负载提供上升时间。

关于linux - GNU 并行负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039403/

相关文章:

mysql - mysql 5.4 有 linux 32 位版本吗?

linux - 如何 sed 或 grep 2 个特殊字符之间的内容并修改输出

c - 重定向错误仅发生在 "ls"命令上。其他命令重定向得很好。我的代码有什么问题吗?

c# - 用 Parallel.ForEach 替换顺序 foreach

c - 获取程序传输的总 MPI 字节数

regex - 如何在复制 vfat 期间重命名文件

linux - 使用终端 linux mint 查找并复制目录中的所有图像,尝试理解语法

linux - Bash - 通过用户输入打破 while 循环

regex - Bash 正则表达式向后计数连字符

c++ - MPI 分布层