web-dev-qa-db-ja.com

Sun Grid Engineで完全なノードを予約するにはどうすればよいですか?

SGEを使用して、クラスター上の完全なノードをどのように予約しますか?

1つのマシンから2つのプロセッサ、別のマシンから3つのプロセッサなどは必要ありません。クアッドコアクラスターがあり、それぞれに4つのスロットがある4つの完全なマシンを予約したいと思います。 16台のスロットが必要だと指定することはできません。これは、4台のマシンにそれぞれ4つのスロットがあるとは限らないためです。

割り当てルールをFILL_UPに変更するだけでは不十分です。完全にアイドル状態のマシンがない場合、SGEは、4台のアイドル状態のマシンを待つのではなく、最も負荷の少ないマシンを可能な限り「埋める」だけですその後タスクのスケジュール。

これを行う方法はありますか?この質問をするのに良い場所はありますか?

6
artif

SGEはこれに不思議であり、私はこれを一般的なケースで行うための良い方法を見つけていません。必要なノードのメモリサイズがわかっている場合に実行できることの1つは、ノードの全容量にほぼ等しいメモリ量を予約しながらqsubを実行することです。これにより、他で何も実行されていないシステムを確実に取得します。

2
jgoldschrafe

私は方法を見つけたと思いますが、おそらく私のような古いSGEでは機能しません。 SGEの新しいバージョンには排他的スケジューリングが組み込まれているようです。

https://web.archive.org/web/20101027190030/http://wikis.Sun.com/display/gridengine62u3/Configure+Exclusive+Scheduling

私が検討したもう1つの可能性は、エラーが発生しやすいことですが、qsubの代わりにqloginを使用し、目的の各クアッドコアマシンで4つのスロットを手動で予約することです。当然のことながら、これを自動化することは特に簡単でも楽しいことでもありません。

最後に、おそらくこれはホストグループを使用できる状況です。たとえば、4つのクアッドコアマシンを含むホストグループを作成し、キューのこの特定のサブセットにqsubbingして、グループ内の最大合計数と同じ数のプロセッサを要求します。残念ながら、これはハードコーディングのようなもので、多くの欠点があります。たとえば、特定のハードコーディングされたホストグループを空けるまで待たなければならず、4台ではなく8台に切り替える場合は変更が必要です。

6
artif

追加する次の隠されたコマンドラインリクエストがあるようです:

-l excl=true

ただし、複雑な値のリストに追加し(qconf -mc)、個々のホストを有効にして(qconf -me hostname)、SGEまたはOpenGridSchedulerに構成する必要があります。

詳細については、次のリンクを参照してください: http://web.archive.org/web/20130706011021/http://docs.Oracle.com/cd/E24901_01/doc.62/e21978/management.htm#autoId61

要約すれば:

タイプ:

qconf -mc

次の行を追加します。

exclusive    excl      BOOL      EXCL   YES          YES          0        1000

次に:

qconf -me <Host_name>

次に、complex_values行を編集して読み取ります。

complex_values        exclusive=true

ホスト固有のcomplex_valueがすでにある場合は、それらをカンマで区切るだけです。

3
OttoV

PE構成の割り当てルールを$ pe_slotsとして指定します

これにより、すべてのスロットが単一のホストに割り当てられます

1

ほぼ同じことをしようとしていて、アイデアを探しています。 pe_hostsfileが最良のオプションだと思いますが、私はSGEシステムのマネージャーではなく、hostsファイルが設定されていないため、すぐに回避する必要があります。排他的スケジュールの構成リンクをチェックアウトし、管理権限も必要であることを確認してください...

ラッパースクリプトでそれができると思います。マシンに残っている利用可能なコアの数を把握するために、bashワンライナーを作成しました(以下)。私たちのグリッドは異種混合であり、1つのノードが24コア、約8コア、大部分が4コアしかないため、少し厄介です。

とにかく、これがそのバッシュワンライナーです。

n_processors=`qhost | awk 'BEGIN{name="'\`hostname\`'"} ; {if($1==name){print int($3)-int($4+0.99)}}'`

問題は、このbash変数をSGE起動スクリプトの前処理ディレクティブに取り込む方法ですか? pvm環境にはSGEが付属しているので、シェルスクリプトで以下の引数を指定するだけかもしれません。ただし、設定されているわけではありません...

#$ -pe pvm 24-4

並列環境の管理に関するSunのページ は非常に役立ちますが、ここでも説明は主に管理者を対象としています。

1
Alex Leach

割り当てルールをノードで使用可能なスロットの数(この場合は4)に設定します。これは、n * 4 CPUでのみジョブを開始できることを意味しますが、望ましい結果が得られます。16CPUは、それぞれ4 CPUの4ノードとして割り当てられます。

1
Ansgar

ようやくこれに対する答えを見つけました。最初、私は上記の-l excl=True設定を上記のように使用しました。しかし、これは問題を完全には解決しません。

この問題を完全に解決するには、追加のpe_environmentを設定する必要がありました。私のクラスターには、12個のコアノードがあります。これを例として使用します。

Mpich2_12という追加の環境を作成しました。下に貼り付けました。

pe_name            mpich_12
slots              999
user_lists         sge_user
xuser_lists        NONE
start_proc_args    /opt/gridengine/mpi/startmpi.sh -catch_rsh $pe_hostfile
stop_proc_args     /opt/gridengine/mpi/stopmpi.sh
allocation_rule    12
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary TRUE

ここで、allocation_ruleが12に設定されていることに注意してください。これは、ジョブがノードで12コアを使用する必要があることを意味します。 48個のCPUを要求するジョブを送信すると、4つのフルノードが使用可能になると待機して取得します。

私はまだ-l excl=Trueオプションを使用していますが、これは今は無関係だと思います。

1つのCPUのみを必要とするジョブがある場合(そして私はそうします)、それらを同じキューに送信しますが、-l exel=Trueオプションは使用せず、pe_environmentを持つ元のallocation_rule = 'fillup'を使用します。mpich_12環境で送信されたジョブはすべてそこまで待機します完全なノードフリーです。私のクラスターは今ではとてもうまく機能しています。

0
Simon