620 likes | 912 Views
グローバルスケジューリングのための 計算資源 予約管理機構. 1. 産業技術総合研究所、 2. 数理技研 中田秀基 1 、 竹房 あつ子 1 ,大久保 克彦 1,2 、 工藤 知宏 1 、 田中良夫 1 、関口智嗣 1. スーパスケジューラ. 事前予約. 事前予約. 事前予約. サイト A. サイト B. サイト C. ローカル スケジューラ. ローカル スケジューラ. ローカル スケジューラ. 背景. グリッドによる複数のサイトをまたいだ大規模計算 資源のコアロケーション ( 同時確保 ) が必要
E N D
グローバルスケジューリングのための計算資源予約管理機構グローバルスケジューリングのための計算資源予約管理機構 1.産業技術総合研究所、2.数理技研 中田秀基1、竹房 あつ子1,大久保 克彦1,2、 工藤 知宏1、田中良夫1、関口智嗣1
スーパスケジューラ 事前予約 事前予約 事前予約 サイトA サイトB サイトC ローカル スケジューラ ローカル スケジューラ ローカル スケジューラ 背景 • グリッドによる複数のサイトをまたいだ大規模計算 • 資源のコアロケーション(同時確保)が必要 • 多くのサイトはFCFS(First ComesFirst Served)+優先順位のキューイングシステムで運用
計算資源のコアロケーション (1/2) • FCFS • キューイングされた順番で実行 同時にキューイングしても 同時に実行されるとは限らない サイトA サイトB サイトC
計算資源のコアロケーション (2/2) • 事前予約 • キューとは独立に時間スロットを確保 サイトA サイトB サイトC
コアロケーションに必要な要素技術 SACSIS06 竹房 他 スーパスケジューラ コアロケーション SWoPP06@高知 適切なプロトコル サイトA サイトB サイトC ローカル スケジューラ ローカル スケジューラ ローカル スケジューラ 事前予約機能 事前予約機能 事前予約機能 PluS 事前予約機構 今回の発表
研究の目的 • ローカル予約管理機構 PluSの設計と実装 • 予約機構を既存キューイングシステムに追加 • 2つの実装手法を提案,比較 • スケジューラ置換法 • キュー操作法 • 2相コミットプロトコルに対応
発表の概要 • 事前予約機構 PluSの設計 • キューイングシステムの概要 • 2つの実装法に基づく実装 • 2相コミット • PluSの実装 • for TORQUE • for Grid Engine • 評価:2つの実装法を比較 • コード量の比較 • 実行時間を比較 • おわりに
キューイングシステム とは • 計算機資源へのジョブ投入を管理 • 計算機資源を個々のジョブが占有することが前提 • c.f. time share • 課金のための統計情報も管理 • 大規模な計算資源ではほぼ例外なく利用されている • 代表的な有償実装 • LSF, NQS, PBS Professional, LoadLeveler • 代表的なオープンソース実装 • TORQUE - OpenPBS ベース, Cluster Resources Inc. • Grid Engine - Sun Microsystems.
キューイングシステムの標準的な構成 submit ヘッドノード マスタサーバ スケジューラ 計算ノード 計算ノード 計算ノード 計算サーバ 計算サーバ 計算サーバ
事前予約の実現方法 • スケジューラを改良する • オープンソースであってもコードの細部を完全に把握するのは大変 • スケジューラを置き換える • マスタサーバとのプロトコルが単純であればむしろ簡単 • スケジューラをいじらずに追加だけで済ませる • 「キュー」を制御 • キューイングシステムの構造によっては,可能とは限らない
スケジューラを置換する事前予約の実装 submit reserve ヘッドノード マスタサーバ スケジューラ スケジューラ 計算ノード 計算ノード 計算ノード 計算サーバ 計算サーバ 計算サーバ
キューを外部から制御する事前予約の実装 reserve submit ヘッドノード PluS 予約管理 qconf マスタサーバ スケジューラ 計算ノード 計算ノード 計算ノード 計算サーバ 計算サーバ 計算サーバ
2つの実装方法 TORQUE Grid Engine • スケジューラ置換法 • 心臓部であるスケジューラを置換してしまうので,なんでもできる • 既存のスケジューラとの互換性を保つ場合には,実装コストが大きい • キュー操作法 • キューイングシステムの機能によっては実現不可能 • ex. TORQUE • キュー操作のオーバヘッドが懸念される • 実現できる機能の自由度は低い • 実現可能な場合には実装コストは比較的小さい Grid Engine
コミットプロトコルの必要性 サイトA ローカル スケジューラ 11 12 13 10 スーパ スケジューラ サイトB ローカル スケジューラ 11 12 13 10 サイトC ローカル スケジューラ 11 12 13 10
コミットプロトコル • 分散コアロケーションは本質的に分散トランザクション • 同じ手法で解決が可能 • 2相コミット,3相コミット などなど • 2相コミットを採用 • シンプル • 実装が比較的容易
2相コミットプロトコル • 1度で決めてしまわないで,確認するフェイズを設ける • 1相コミット • 「予約できたらしてください」 • 「はい,予約しました」 • 2相コミット • 「この時間は空いていますか?空いていたら仮押さえしておいてください.」 • 「はい仮押さえしました.」 • 「正式に予約をおねがいします.」 1相 2相
Prepared Commit request Commit 2相コミット サイトA ローカル スケジューラ C I P スーパ スケジューラ サイトB ローカル スケジューラ P I C • I - initial • P- prepared • C- committed • A- aborted サイトC ローカル スケジューラ P I C
Prepared Aborted Commit request Abort 2相コミット サイトA ローカル スケジューラ P A I スーパ スケジューラ サイトB ローカル スケジューラ P A I • I - initial • P- prepared • C- committed • A- aborted サイトC ローカル スケジューラ A A I
PluSの実装 • 3種類の実装 • TORQUE 向け スケジューラ置換法 • Grid Engine 向け スケジューラ置換法 • Grid Engine 向け キュー制御法
PluS予約管理機構の実装 • PluSモジュールはJavaで実装 • データベースにはdb4objectを使用 • コマンドラインインターフェイスはshell script + Java • インターフェイスPluSモジュール間の通信はRMI PluS コマンド RMI PluS 予約管理
予約関連コマンド • plus_reserve • 予約をリクエスト • 入力:開始・終了時刻,ノード数 • 出力:予約ID • plus_cancel • 予約キャンセル • 入力: 予約ID • plus_status • 予約情報取得 • 入力: 予約ID • 出力: 予約状態 • plus_modify • 予約変更 • 入力: 予約 ID, 開始・終了時刻,ノード数
使用シナリオ • まず予約 > plus_reserve –s 12:00 –e 14:00 –n 1 Reserve succeeded: reservation id is 14 • 予約状態の確認 > plus_status id owner start end duration state R14 nakada Feb 20 12:00 Feb 20 14:00 2h00m Confirmed • 予約ID を指定してジョブをサブミット > qsub –q R14 script
スケジューラ置き換えによる事前予約の実現 予約リクエスト PluS 予約管理機能付 スケジューラ マスタサーバ 計算サーバ 計算サーバ 計算サーバ 計算サーバ
キュー制御による事前予約 • キューとは • ジョブをサブミットする抽象的な「口」 • 特定のユーザ群に対して定義される • 特定のノード群に割り当てることもできる • キュー制御による事前予約 • 事前予約をキューとして作成 • キューを特定の時間だけ排他的に使用可能するように制御することで事前予約を実現 • 実装法の特徴 ○実装が容易 ○内部プロトコルに手を触れないため,本体のバージョンアップへの対応が容易 ×キュー操作の外部コマンドを何度も呼び出すことになるので低速
キュー制御による事前予約 予約リクエスト PluS 予約管理 マスタサーバ スケジューラ 計算サーバ 計算サーバ 計算サーバ 計算サーバ
2相コミットの実現 • 予約時 • リクエスト時に予約 • アボートしたら予約をキャンセル • キャンセル時 • リクエスト時にはなにもしない • コミット時にキャンセル • モディファイ時 • リクエスト時にモディファイ前の資源とモディファイ後の資源の双方を確保 • アボート・コミットに応じて不要な資源を解放
コマンドの2相コミットへの対応 • plus_reserve, plus_modify, plus_cancel • オプション ‘-T’を追加 • Two-phased を示す • -T がなければ1相コミット • plus_commit, plus_abort を追加 • 予約IDに対して commit, abort を行う
評価 • 実装の容易性 • キュー制御法のほうが本当に容易か? • コードの量を行数で比較 • 実装の効率 • キュー制御にかかるコストは? • あまり遅いと上位スケジューラのレイテンシに悪影響 • 予約・キャンセルコマンドの実行時間を比較
コマンド実行時間による比較 • 実験環境 • Pentium III 1.4 GHz dual CPU • Memory 2G byte • Linux RedHat 8 • 測定 • time を用いてコマンドの実行時間を測定 • 10回試行,平均値は最大値,最小値を除いて算出 キュー制御法のほうが遅い →キュー操作(qconf)のコスト 実行時間は1-2秒程度 → この程度なら許容範囲
関連研究 • Maui • Cluster Resources 社が無料で提供 • TORQUEのスケジューラを置き換えるスケジューラ • Catalina [Yoshimoto 05] • SDSCで利用されているスケジューラ • Python で実装 • TORQUEのスケジューラを置換して事前予約機能を提供 • すべてのジョブが予約ベースで稼動 • 事前予約は他のジョブがないときのみ可能
おわりに • 事前予約管理機構PluS • スケジューラ置換法とキュー操作法の2種を実装 • TORQUEとGrid Engine の双方に対応 • スケジューラ置換法は自由度が高いが実装が煩雑 • キュー操作法は実装は容易だが,自由度が低く,オーバヘッドもある • オーバヘッドは許容範囲内.
今後の課題 • 事前予約のポリシ • 現状:事前予約が常に最優先 • 実システムでの運用には不適 • 事前予約許可のポリシを宣言的な言語で設定 • CondorのclassAd を検討 • 各サイト管理者が独自に設定 • 他のキューイングシステムへの適用 • キュー操作法は理論的には可搬性に優れる • 実際に移植して確認 • Load Leveler • Condor
謝辞 本研究の一部は,文部科学省科学技術振興調整費 「グリッド技術による光パス網提供方式の開発」による. http://www.g-lambda.net/plus
2相コミット の状態遷移 ローカルスケジューラ スーパスケジューラ I1 Ii Commit_request received Commit_request received Commit_request To all cohorts Agree sent Abort sent Abort received P1 Pi - Ai One or more cohorts Replied abort All cohorts Replied agreed Send abort msg To all cohorts Send commit msg To all cohorts Commit received A1 C1 Ci
事前予約機能を持つローカルスケジューリングシステムの設計と実装事前予約機能を持つローカルスケジューリングシステムの設計と実装 1.産業技術総合研究所、2.東京工業大学、3.数理技研、4.エス・エフ・シー 中田秀基1,2、竹房 あつ子1,大久保 克彦1,3、岸本 誠1,4、 工藤 知宏1、田中良夫1、関口智嗣1
スーパスケジューラ 事前予約 事前予約 事前予約 サイトA サイトB サイトC ローカル スケジューラ ローカル スケジューラ ローカル スケジューラ 背景 • グリッドによる複数のサイトをまたいだ大規模計算 • 資源のコアロケーション(同時確保)が必要 • 多くのサイトはFCFS(First ComesFirst Served)+優先順位のキューイングシステムで運用
計算資源のコアロケーション (1/2) • FCFS • キューイングされた順番で実行 同時にキューイングしても 同時に実行されるとは限らない サイトA サイトB サイトC
計算資源のコアロケーション (2/2) • 事前予約 • キューとは独立に時間スロットを確保 サイトA サイトB サイトC
FCFSと事前予約の関係はどうなるの? • 事前予約だけ,というわけにはいかない • 各サイトのユーザはFCFSになれている • 実行時間の正確な見積もりは難しい • FCFSジョブの実行中に予約時間がきたら? • 実行中のジョブを殺す? • 終了するまで待つ? • 予約は早い者勝ち? • フェアシェアは? • ユーザの優先順位は? FCFSと整合性を持つ事前予約機能の検討が必要 ⇒ スケジューリングポリシを自由に変更できる環境がほしい
事前予約をサポートするローカルスケジューラ事前予約をサポートするローカルスケジューラ • 有料のものにはいくつかある • PBS Professional, LSF • スケジューリングポリシを変更できないため検討の環境としては不適 • フリーのスケジューラもある • OpenPBSと協調動作するMaui Scheduler • ソースの改変によるポリシ変更も可能 • APIが切られているわけではないので,実際には難しい
研究の目的 • 事前予約ポリシを検討するテストベットを構築 • 既存ローカルスケジューラ TORQUE に対してスケジューリングAPIを整備 • そのAPIを用いて,事前予約機能をテスト実装 • 上位レイヤであるスーパースケジューラとの連携のためのインターフェイスを整備 • WSRF 標準に基づく予約インターフェイス • Globus Toolkit 4 (GT4) を用いた認証 • 予約スロットを指定してのGRAMからのジョブ投入
発表の概要 • TORQUEの概要 • システムの提案 • Java API • 事前予約可能スケジューラの実装 • 連携インターフェイス • WSRFによる予約インターフェイス • GRAMからのジョブ投入 • 予備評価 • 結論と今後の課題
TORQUEの概要 OpenPBSの一種 c.f. OpenPBS: メンテナンスされていない 改変,再配布が可能 3つのデーモンから構成 PBS Server セントラルサーバ キュー・計算ノードを管理 スケジューラモジュール PBS Server からのリクエストでジョブを計算機に配置 PBS Mom 計算ノード上で機能 ジョブの起動・モニタリング ヘッドノード PBS Server スケジューラ モジュール 計算ノード 計算ノード 計算ノード PBS mom PBS mom PBS mom
スケジューラAPI 通信ライブラリ 提案アーキテクチャ • スケジューラを独自実装 • デフォルトスケジューラを置換 • Javaで実装 • 開発用API を整備 • PBS Server との通信 • 通信プロトコル • 比較的シンプルなテキストプロトコル • 認証 • 特権ポートを利用 スケジューラ コード ヘッドノード スケジューラ モジュール PBS Server スケジューラ モジュール 計算ノード 計算ノード 計算ノード PBS mom PBS mom PBS mom
スケジューリングAPI • PBSの内部状態を示すJava のクラスを提供 • ServerStatus • QueStatus • PBSの状態取得と制御を行うインターフェイスを提供 • PBSInteface
PBSInterface の概要 public interface PBSInterface { void setSocket(Socket socket); Socket getSocket(); void authenticateUser(String userName, int localPort); void disconnect(); ServerStatus statusServer(); BatchReplyStatusNode statusNode(); BatchReplyStatusQueue statusQueue(); BatchReplyStatusSelect selectStatus(String queueName); void runJob (String jobId, String destination); void runJob (String jobId, Collection<NodeInfo> nodes); void deleteJob(String jobId); void holdJob (String jobId, HoldJobType holdType); void rerunJob (String jobId); void modifyJob(String jobId, String attr, String value); } 接続関連 情報取得 操作
public class SimpleFifoScheduler { public static void main(String[] args) { // start scheduling server PBSServerConfig servConf = new PBSServerConfig(); ScheduleStarter starter = new ScheduleStarter(servConf); PBSInterface pbs = new TorqueImpl(); // get scheduling order, and run ScheduleOrder order; PBSSchedulerCommandType cmd = PBSSchedulerCommandType.NULL; do { order = starter.waitOrder(); Socket socket = order.getPBSServerSocket(); pbs.setSocket(socket); cmd = order.getSchedulerCommand(); if (cmd.mustRunSchedule()) { try { schedule(pbs); } catch (PBSException e) {} } socket.close(); } while (cmd != PBSSchedulerCommandType.QUIT); } private static void schedule(PBSInterface pbs) throws PBSException { ServerStatus server = pbs.statusServer(); if (!server.isReadyToUse() || server.getQueuedJobs() == 0) return; // no jobs to schedule Collection<NodeStatus> nodes = pbs.statusNode().getAllStatus(); for (QueueStatus queue : pbs.statusQueue()) { if (!queue.isReadyToRun() || queue.getQueuedJobs() == 0) continue; // no jobs to run for (JobStatus job : pbs.selectStatus(queue.getName())) { if (!job.isReadyToRun()) continue; // cannot run now for (NodeStatus node : nodes) { if (!job.isRunnableOn(node)) continue; // node is down String jobId = job.getJobId(); String destination = node.getName(); pbs.modifyJob(jobId, "comment", "Job started on " + new Date()); pbs.runJob(jobId, destination); return; } } } } } 簡単なスケジューラの実装 計算ノード 情報を取得 キューからジョブを取得 ジョブをノードに割り当て
ヘッドノード キュー操作コマンド 予約関連コマンド qsub,qdel, qstat pbs_reserve, pbs_cancel, pbs_modify PBS Server スケジューラ モジュール 予約機構の実現 • スケジューラモジュールに予約テーブル管理機構を導入 • スケジュール時にテーブルを参照 • 予約コマンドを提供 • スケジューラモジュールにアクセス • RMIで通信 • 予約テーブルを永続化 • db4objects を使用