はじめに (対象読者・この記事でわかること)

この記事は、Qsubを使って計算クラスターでジョブを管理している方々、特に科学技術計算や大規模シミュレーションなどを日常的に行っている研究者やエンジニアを対象としています。

この記事を読むことで、Qsubでジョブを投入する際に、意図的に特定のホスト(計算ノード)を除外してジョブを実行する方法を理解し、実践できるようになります。これにより、特定のノードに負荷が集中するのを防いだり、メンテナンス中のノードを避けたりするなど、より柔軟で効率的なリソース管理が可能になります。

計算クラスターの運用において、リソースの有効活用はパフォーマンス向上に直結します。特定のホストを避けるという選択肢を知っておくことで、予期せぬトラブルを回避し、ジョブの実行をスムーズに進めるための強力な武器となります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 * Qsubの基本的な使い方(qsubコマンドによるジョブ投入、qstatによるジョブ確認など) * Qsubのジョブスケジューリングの基本的な概念 * Linux/Unixコマンドラインの基本的な操作

Qsubにおけるリソース指定の基本

Qsubでジョブを投入する際、リソースの指定は非常に重要です。CPUコア数、メモリ、時間といった一般的なリソース指定に加え、特定のホストやキューにジョブを割り当てるためのオプションも存在します。

ジョブスケジューラは、投入されたジョブのリソース要求と、クラスター上で利用可能なリソースを照合し、最適なノードにジョブを配置します。この配置を制御するために、qsubコマンドには様々なオプションが用意されています。

例えば、特定のキューにジョブを投入したい場合は -q オプションを使用し、特定のノードで実行したい場合は -l オプションと組み合わせて hostname などのリソース名を指定します。しかし、ここからが本題ですが、「特定のホストで実行したくない」 という要求は、直接的なオプションとしては用意されていません。

では、どのようにして特定のホストを避けるのでしょうか? 次のセクションで、そのための具体的な方法を見ていきましょう。

特定のホストを避けるためのQsubテクニック

Qsubにおいて、直接的に「このホスト以外で実行せよ」というオプションはありません。しかし、ジョブスケジューリングの仕組みを理解し、いくつかのテクニックを組み合わせることで、実質的に特定のホストを避けることが可能です。ここでは、最も一般的で効果的な方法として、qsub-l exclhostオプションと、ホストグループの活用について詳しく解説します。

1. exclhostオプションによるホストの除外

exclhostオプションは、ジョブが 排他的に 使用するホストを指定するオプションです。これは、指定されたホストを他のジョブと共有したくない場合に使用されます。しかし、このオプションの応用として、「ここに指定したホスト以外で実行せよ」 という意図で利用することもできます。

exclhostオプションの基本的な使い方

exclhostオプションは、-l オプションと組み合わせて使用します。

Bash
qsub -l exclhost=hostname1 job_script.sh

このコマンドは、hostname1 という名前のホストを 排他的に 使用するようにジョブに要求します。つまり、hostname1 が他のジョブに使われている場合、あるいはジョブが hostname1 を利用したい場合、hostname1 が空くまで待機することになります。

特定のホストを避けるためのexclhostの活用

「特定のホストを避けたい」という場合、このexclhostオプションを巧妙に利用します。例えば、avoidhost1 というホストを避けたい場合、以下のようにコマンドを実行します。

Bash
qsub -l exclhost=avoidhost1 job_script.sh

このコマンドを実行すると、ジョブスケジューラはavoidhost1排他的に 使用することを試みます。しかし、もしavoidhost1が既に他のジョブで使用されている場合、exclhostオプションの性質上、ジョブは avoidhost1 が空くのを待ちます。

しかし、ここで重要なのは、exclhostオプションは「指定されたホストを他のジョブと共有したくない」という意図が主であることです。 したがって、もしavoidhost1が他のジョブで使用されている場合、ジョブはavoidhost1が空くまで待機しますが、最終的にはavoidhost1以外で、かつジョブの他のリソース要求(CPU、メモリなど)を満たすノードが利用可能であれば、そこに配置される可能性があります。

より確実な方法として、避けたいホストを複数指定したり、あるいは、利用可能なホスト群から除外したいホストを除いたグループを作成し、そのグループに対してジョブを投入する方法が推奨されます。

複数のホストを避ける場合

避けたいホストが複数ある場合は、カンマ区切りで指定します。

Bash
qsub -l exclhost=avoidhost1,avoidhost2 job_script.sh

これにより、avoidhost1avoidhost2の両方、いずれか一方でも使用されている場合は、それらのホストでの実行を避けるようになります。

2. ホストグループの活用

多くの計算クラスターでは、管理者がホストを論理的なグループにまとめる機能を提供しています。例えば、「GPUノード」や「高メモリノード」といったグループです。このホストグループ機能は、特定のホストを避けるためにも非常に強力です。

ホストグループの概念

ホストグループとは、複数のホストをまとめた論理的な単位です。例えば、highmem というホストグループに node1, node2, node3 が含まれているとします。

特定のホストを避けるためのホストグループ作成

もし、avoidhost1 というホストを避けたい場合、以下のような手順でホストグループを作成し、それを利用することが考えられます。

  1. 利用可能なホストリストの取得: まず、クラスター上で利用可能なホストのリストを取得します。これは、管理者権限が必要な場合もありますが、通常はqhostコマンドなどで確認できます。

  2. 避けたいホストを除外したホストグループの作成: 例えば、allhosts というグループから avoidhost1 を除外した available_hosts というグループを作成することを考えます。 これは、qconf コマンドなどの設定ファイルを手動で編集することで実現できます。

    例えば、/etc/gridengine/hostgroups のような設定ファイルに以下のような記述を追加することを想定します。 ```

    利用可能なホストグループ

    @available_hosts allhosts=!avoidhost1 `` この記述は、「allhostsグループからavoidhost1を除外したものが@available_hosts` グループである」という意味になります。 (注:具体的な設定方法は、利用しているジョブスケジューラ(SGE, PBS Pro, Slurmなど)によって異なります。上記はSGEを例とした概念的な説明です。)

  3. 作成したホストグループへのジョブ投入: 作成したホストグループを指定してジョブを投入します。

    bash qsub -l hostname=@available_hosts job_script.sh これにより、ジョブは @available_hosts グループに含まれるホストでのみ実行が許可されるようになります。

ハマった点やエラー解決

  • exclhostオプションの誤解: 初めはexclhostオプションが「指定したホスト以外で実行する」という直接的な意味合いだと誤解しがちです。しかし、実際は「排他的に使用する」という性質があり、指定したホストが使用されている場合は待機状態になります。そのため、単に避けたいだけの場合は、他のホストグループを利用する方が意図通りに動作する可能性が高いです。
  • ホストグループ設定の難しさ: ホストグループの作成や編集は、管理者権限が必要な場合が多く、また設定ファイルの記法もジョブスケジューラによって異なります。もし自身で設定できない場合は、クラスター管理者やサポートに相談する必要があります。
  • ノードの動的な変更: クラスターのノード構成は動的に変更されることがあります。定期的に利用可能なノードリストやホストグループの設定を確認することが重要です。
  • ジョブがキューに入り続ける場合: exclhostオプションやホストグループの指定によって、ジョブが実行可能なノードを見つけられず、長時間キューに入ったままになることがあります。この場合、指定したホストグループに実行可能なノードが存在しないか、あるいは指定したホストが常に利用されている可能性があります。qstat -f コマンドなどでジョブのステータスやキューの状況を詳細に確認しましょう。
  • リソース競合: 特定のホストを避けることで、結果的に利用可能なノードが少なくなり、CPUやメモリといった他のリソースで競合が発生する可能性があります。ジョブの投入時に、必要なリソースを過不足なく指定することが重要です。

解決策

  • exclhostオプションは、避けたいホストが一時的に利用できない場合に、そのホストを避けるための「一時的な」対策として利用し、恒久的な除外にはホストグループの利用を検討する。
  • ホストグループの設定が難しい場合は、qsub-qオプションで、避けたいホストが含まれていない特定のキューを指定する。
  • クラスター管理者に相談し、専用のホストグループを作成してもらう。
  • qhostqstatコマンドを駆使して、ノードの利用状況を常に把握する。
  • ジョブ投入時には、qsub -o <output_file> -e <error_file> -l cpu=X,mem=YG,time=H:M:S job_script.sh のように、必要なリソースを明示的に指定する。

3. その他の考慮事項

メンテナンス中のホスト

計算クラスターでは、定期的なメンテナンスやハードウェアの故障により、一部のホストが一時的に利用できなくなることがあります。このような場合、ジョブスケジューラは通常、メンテナンス中のホストにはジョブを割り当てませんが、念のため、qhostコマンドなどでノードの状態を確認しておくと安心です。

特定のジョブタイプへの影響

GPUノードや高メモリノードなど、特定のハードウェアリソースを要求するジョブの場合、それらのリソースを持つホストを避けることは、ジョブの実行可能性そのものに影響を与えます。このような場合は、避けるべきホストが要求リソースと一致しないか、慎重に確認する必要があります。

ジョブスケジューラのバージョンによる違い

ここで紹介した方法は、一般的に広く使われているジョブスケジューラ(SGE, PBS Pro, Slurmなど)で利用可能な機能ですが、具体的なコマンドオプションや設定方法は、利用しているジョブスケジューラのバージョンや環境によって若干異なる場合があります。不明な点があれば、必ず利用しているクラスターのドキュメントを参照するか、管理者にお問い合わせください。

まとめ

本記事では、Qsubを使ってジョブを投げる際に、特定のホストを避けるための方法について解説しました。

  • exclhostオプション は、指定したホストを排他的に使用するオプションであり、間接的にホストを避けるために利用できます。
  • ホストグループの活用 は、より恒久的かつ柔軟にホストの除外・利用を管理するための強力な方法です。
  • ホストグループの作成・管理は、ジョブスケジューラの設定に依存するため、必要に応じて管理者に相談することが重要です。

この記事を通して、計算リソースのより細やかな制御が可能になり、ジョブの効率的な実行や、クラスター環境の安定稼働に貢献できることを願っています。

今後は、ジョブの依存関係設定や、より高度なリソース要求についてもお伝えする予定です。

参考資料