4

クラスタ上で CPU を集中的に使用する並列ジョブを実行する方法を見つけようとしています。私の目標は、コアごとに 1 つのジョブをスケジュールすることです。これにより、スケジュールが設定されると、すべてのジョブが 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

多くのオプションがあり、これら 2 つは CPU あたりの単純な実際の %idle を提供します。マンページを確認してください。

于 2012-12-26T23:32:13.970 に答える