4

我正在尝试找到一种在集群上执行 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 --sshloginfile <(./build_sshlogin.sh) --workdir $PWD command args {1} :::  $(seq $runs) 

这种技术的问题是,如果有人在集群中的服务器上启动另一个 CPU 密集型作业,而不检查 CPU 使用情况,那么脚本最终会将作业调度到正在使用的核心。此外,如果在第一个作业完成时 CPU 使用率发生了变化,那么新释放的内核将不会被 GNU 并行调度用于剩余作业。

所以我的问题如下:有没有办法让 GNU 在调度每个作业之前并行重新计算空闲内核/服务器?欢迎任何其他解决问题的建议。

注意:在我的集群中,所有核心都具有相同的频率。如果有人可以概括以解释不同的频率,那也是受欢迎的。

4

2 回答 2

6

看看--load哪个是针对这种情况的。

不幸的是,它不查看 CPU 利用率,而是查看平均负载。但是,如果您的集群节点没有大量的磁盘 I/O,那么 CPU 利用率将非常接近负载平均值。

由于平均负载变化缓慢,您可能还需要使用新--delay选项给平均负载上升时间。

于 2012-12-27T11:41:31.500 回答
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

有很多选项,这两个给出了一个简单的实际 %idle per cpu。检查手册页。

于 2012-12-26T23:32:13.970 回答