クラスタ上で 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 に並列に空きコア/サーバーを再計算させる方法はありますか? 問題を解決するための他の提案は大歓迎です。
注: 私のクラスターでは、すべてのコアの周波数が同じです。誰かが異なる周波数を説明するために一般化できる場合は、それも歓迎します.