(57)【特許請求の範囲】
【請求項１】
データを蓄積するファイルシステムと、
前記ファイルシステムにアクセスするＩ／Ｏノードと、
ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、前記Ｉ／ＯノードにＩ／Ｏ要求を発行する計算ノードと、
ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、前記Ｉ／Ｏノードの数と、Ｉ／Ｏノードで生成可能なＩ／Ｏスレッド数の最大値を示すＩ／Ｏノードの最大Ｉ／Ｏスレッド数に対して、ジョブが占有可能な最大のＩ／Ｏスレッド数を示すジョブ最大Ｉ／Ｏスレッド数の割合を示すＩ／Ｏノードの占有率を動的に割り当てるジョブサーバーとを具備し、
前記ジョブサーバーは、
あるジョブを起動するときに、そのジョブが要求する前記Ｉ／Ｏノードの占有率に見合った数のＩ／Ｏスレッドを占有できない場合には、そのジョブに前記Ｉ／Ｏノードの占有率を確保できる値まで縮小したＩ／Ｏノードの占有率を満たすように前記Ｉ／ＯノードのＩ／Ｏスレッドを占有させるＩ／Ｏノードスケジューラを備える
Ｉ／Ｏノード制御方式。
【請求項２】
前記Ｉ／Ｏノードスケジューラは、
あるジョブが終了したときには、そのジョブが使用していた前記Ｉ／ＯノードのＩ／Ｏスレッドを解放すると共に、他のジョブが、前記Ｉ／Ｏノードの占有率を確保できる値まで縮小したＩ／Ｏノードの占有率を満たすように前記Ｉ／ＯノードのＩ／Ｏスレッドを占有していた場合には、開放された前記Ｉ／Ｏスレッドを前記他のジョブに割り当てることで、前記他のジョブの前記Ｉ／Ｏノードの占有率の不足分を減算する
請求項１記載のＩ／Ｏノード制御方式。
【請求項３】
前記Ｉ／Ｏノードスケジューラは、
ジョブごとに、そのジョブを実行する一つ又は複数の計算ノードの計算ノード番号と、前記一つ又は複数の計算ノードそれぞれに割り当てられる一つ又は複数のＩ／ＯノードのＩ／Ｏノード番号と、前記一つ又は複数のＩ／Ｏノードそれぞれについて確保した前記Ｉ／Ｏノードの占有率とを保存するジョブ管理テーブルを有する
請求項２記載のＩ／Ｏノード制御方式。
【請求項４】
前記ジョブ管理テーブルは、
前記一つ又は複数のＩ／Ｏノードそれぞれについて、確保できなかった前記Ｉ／Ｏノードの占有率不足分を更に保存し、
前記Ｉ／Ｏノードスケジューラは、
あるジョブを起動するときに、そのジョブに対して、そのジョブが要求する前記Ｉ／Ｏノードの占有率を満たすように前記Ｉ／ＯノードのＩ／Ｏスレッドを占有できなかった場合には、前記ジョブ管理テーブルに、確保できなかった前記Ｉ／Ｏノードの占有率不足分を保存する
請求項３記載のＩ／Ｏノード制御方式。
【請求項５】
前記Ｉ／Ｏノードスケジューラは、
あるジョブが終了したときには、そのジョブが使用していた前記Ｉ／ＯノードのＩ／Ｏスレッドを解放すると共に、前記ジョブ管理テーブルから終了した前記ジョブのエントリを削除し、前記ジョブ管理テーブルの前期Ｉ／Ｏノードの占有率不足分を参照し、他のいずれかのジョブが、要求した前記Ｉ／Ｏノードの占有率を満たすように前記Ｉ／ＯノードのＩ／Ｏスレッドを占有できていなかった場合には、当該ジョブに対して、解放されたＩ／ＯノードのＩ／Ｏスレッドを割り当てる
請求項４記載のＩ／Ｏノード制御方式。
【請求項６】
前記ジョブ管理テーブルは、
ジョブ開始時刻を更に保存し、
前記Ｉ／Ｏノードスケジューラは、
あるジョブが終了し、そのジョブが占有していた前記Ｉ／ＯノードのＩ／Ｏスレッドを解放したときに、他のジョブであって、前記Ｉ／Ｏノードの占有率を確保できる値まで縮小したＩ／Ｏノードの占有率を満たすように前記Ｉ／ＯノードのＩ／Ｏスレッドを占有していたジョブが複数あった場合には、前記ジョブ管理テーブルを参照し、前記ジョブ開始時刻と現在時刻から、ジョブが起動してからの経過時間を計算すると共に、前記Ｉ／Ｏノードの占有率の不足分と、ジョブ起動時に要求した前記Ｉ／Ｏノードの占有率の比を占有率不足比として計算し、前記経過時間と前記占有率不足比に基づいて、解放されたＩ／Ｏノード各々のＩ／Ｏスレッドが占めていた前記Ｉ／Ｏノードの占有率を動的に割り当てることにより最適なジョブを選択する
請求項５記載のＩ／Ｏノード制御方式。
【請求項７】
前記Ｉ／Ｏノードスケジューラは、
前記Ｉ／Ｏノードごとに、各ジョブに対して割り当てられている前記Ｉ／Ｏノードの占有率の合計を示すＩ／Ｏノードの利用率と、前記最大Ｉ／Ｏスレッド数とを保存するＩ／Ｏノード管理テーブルを更に有すると共に、
前記ジョブ管理テーブルに保存された前記Ｉ／Ｏノードの占有率と、前記Ｉ／Ｏノード管理テーブルに保存された前記最大Ｉ／Ｏスレッド数とを用いて、前記ジョブ最大Ｉ／Ｏスレッド数を算出し、前記ジョブ最大Ｉ／Ｏスレッド数を、それぞれのＩ／Ｏノードへ通知する
請求項６記載のＩ／Ｏノード制御方式。
【請求項８】
前記Ｉ／Ｏノードスケジューラは、
あるジョブの終了により、前記Ｉ／Ｏノードの利用率が変化したときに、変化後の前記Ｉ／Ｏノードの利用率を前記Ｉ／Ｏノード管理テーブルに保存すると共に、この前記Ｉ／Ｏノードの利用率の変化に起因して、前記ジョブ管理テーブルに保存した他のジョブの前記Ｉ／Ｏノードの占有率を変更した場合には、変更された前記Ｉ／Ｏノードの占有率と、前記Ｉ／Ｏノードの最大Ｉ／Ｏスレッド数に基づいて変更した前記他のジョブのジョブ最大Ｉ／Ｏスレッド数を、該当するＩ／Ｏノードへ通知する
請求項７記載のＩ／Ｏノード制御方式。
【請求項９】
前記Ｉ／Ｏノードは、
前記ファイルシステムに対するＩ／Ｏ処理を実行する前記Ｉ／Ｏスレッドと、
前記Ｉ／Ｏノードスケジューラから通知される前記ジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのジョブに割り当てる前記Ｉ／Ｏスレッドを生成するスレッド生成部を有するＩ／Ｏデーモンとを備える
請求項８記載のＩ／Ｏノード制御方式。
【請求項１０】
前記Ｉ／Ｏデーモンは、
前記Ｉ／Ｏノードスケジューラから通知される前記ジョブ最大Ｉ／Ｏスレッド数を保存するＩ／Ｏスレッド管理テーブルを更に有すると共に、前記Ｉ／Ｏノードスケジューラから、前記ジョブ最大Ｉ／Ｏスレッド数の変更が通知されたときには、前記Ｉ／Ｏスレッド管理テーブルの前記ジョブ最大Ｉ／Ｏスレッド数を変更し、
前記スレッド生成部は、
前記Ｉ／Ｏスレッドを生成しようとするときには、前記Ｉ／Ｏスレッド管理テーブルを参照して、前記ジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのジョブに割り当てる前記Ｉ／Ｏスレッドを生成する
請求項９記載のＩ／Ｏノード制御方式。
【請求項１１】
前記Ｉ／Ｏノードは、
前記計算ノードと前記Ｉ／Ｏノード間のＩ／Ｏデータを保持するＩ／Ｏバッファを更に備え、
前記Ｉ／Ｏデーモンは、
前記Ｉ／Ｏバッファを管理するＩ／Ｏバッファ管理テーブルを更に有し、
前記スレッド生成部は、
前記Ｉ／Ｏスレッド管理テーブルが更新されて、前記ジョブ最大Ｉ／Ｏスレッド数が増大したときに、前記Ｉ／Ｏバッファ管理テーブルにＩ／Ｏ待ち状態のＩ／Ｏバッファがある場合には、前記ジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのＩ／Ｏバッファの個数分だけ、そのジョブに新たに割り当てるＩ／Ｏスレッドを生成する
請求項１０記載のＩ／Ｏノード制御方式。
【請求項１２】
前記Ｉ／Ｏバッファは、
前記Ｉ／Ｏデーモンと、前記Ｉ／Ｏスレッドとに共用される
請求項１１記載のＩ／Ｏノード制御方式。
【請求項１３】
前記ジョブサーバーは、
あるジョブを起動するときに、そのジョブが必要とするＩ／Ｏノードの数とＩ／Ｏノードの占有率の指定をユーザから受け付けると共に、前記指定に基づいて、そのジョブに対して、前記Ｉ／Ｏノードの数とＩ／Ｏノードの占有率を動的に割り当てる
請求項１２記載のＩ／Ｏノード制御方式。
【請求項１４】
Ｉ／Ｏノードで生成可能なＩ／Ｏスレッド数の最大値を示すＩ／Ｏノードの最大Ｉ／Ｏスレッド数に対して、ジョブが占有可能な最大のＩ／Ｏスレッド数を示すジョブ最大Ｉ／Ｏスレッド数の割合を示すＩ／Ｏノードの占有率を要求する一のジョブを起動するときに、前記一のジョブが要求したＩ／Ｏノードの占有率に見合った数のＩ／Ｏスレッドを占有できない場合に、前記Ｉ／Ｏノードの占有率を確保できる値まで縮小したＩ／Ｏノードの占有率を満たすように、前記Ｉ／ＯノードのＩ／Ｏスレッドを確保して、前記一のジョブに対して、前記要求したＩ／Ｏノードの占有率を満たすＩ／Ｏスレッドの一部を割り当てることと、
他のジョブが終了したときに、前記他のジョブが使用していたＩ／ＯノードのＩ／Ｏスレッドを解放すると共に、前記一のジョブに対して、ジョブを起動するときに前記要求したＩ／Ｏノードの占有率を満たすために必要なＩ／Ｏスレッドの不足分を、前記一のジョブの実行を停止することなく動的に割り当てることとを具備する
Ｉ／Ｏノード制御方法。
【請求項１５】
ジョブごとに、そのジョブを実行する一つ又は複数の計算ノードと、前記一つ又は複数の計算ノードそれぞれに割り当てられる一つ又は複数のＩ／Ｏノードと、前記一つ又は複数のＩ／Ｏノードそれぞれについて確保したＩ／Ｏノードの占有率とを保存するジョブ管理テーブルを設けることを更に具備し、
前記一部を割り当てることは、
前記ジョブ管理テーブルに、前記一のジョブが要求したＩ／Ｏノードの占有率ではなく、前記Ｉ／Ｏノードの占有率を確保できる値まで縮小した値を保存することを含み
前記動的に割り当てることは、
前記縮小した値を、前記一のジョブが要求したＩ／Ｏノードの占有率にまで拡大した値を、前記ジョブ管理テーブルに保存することを含む
請求項１４記載のＩ／Ｏノード制御方法。
【請求項１６】
前記設けることは、
前記一つ又は複数のＩ／Ｏノードそれぞれについて、確保できなかった前記Ｉ／Ｏノードの占有率不足分を更に保存するジョブ管理テーブルを設けることを含み、
前記一部を割り当てることは、
前記一のジョブを起動するときに、前記ジョブ管理テーブルに、確保できなかった前記Ｉ／Ｏノードの占有率不足分を保存することを含む
請求項１５記載のＩ／Ｏノード制御方法。
【請求項１７】
前記動的に割り当てることは、
前記他のジョブが終了したときに、前記他のジョブが使用していたＩ／ＯノードのＩ／Ｏスレッドを解放すると共に、前記ジョブ管理テーブルから前記他のジョブのエントリを削除することと、
前記他のジョブのエントリを削除したジョブ管理テーブルに基づいて、前記一のジョブに対して、解放されたＩ／ＯノードのＩ／Ｏスレッドの動的な割り当てを行うこととを更に含む
請求項１６記載のＩ／Ｏノード制御方法。
【請求項１８】
前記設けることは、
ジョブ開始時刻を更に保存するジョブ管理テーブルを設けることを含み、
前記動的に割り当てることは、
前記他のジョブが終了し、前記他のジョブが使用していたＩ／ＯノードのＩ／Ｏスレッドを解放したときに、要求するＩ／Ｏノードの占有率に不足分を生じているものが複数あった場合には、前記ジョブ管理テーブルを参照し、前記ジョブ開始時刻と、現在時刻から、ジョブが起動してからの経過時間を計算すると共に、前記Ｉ／Ｏノードの占有率の不足分と、ジョブ起動時に要求した前記Ｉ／Ｏノードの占有率の比を占有率不足比として計算し、前記経過時間と前記占有率不足比に基づいて、解放されたＩ／Ｏノード各々のＩ／Ｏスレッドが占めていた前記Ｉ／Ｏノードの占有率を動的に割り当てることを更に含む
請求項１７記載のＩ／Ｏノード制御方法。
【請求項１９】
Ｉ／Ｏノードごとに、各ジョブに対して割り当てられている前記Ｉ／Ｏノードの占有率の合計を示すＩ／Ｏノードの利用率と、前記最大Ｉ／Ｏスレッド数とを保存するＩ／Ｏノード管理テーブルを作成することを更に具備し、
前記一部を割り当てることは、
前記ジョブ管理テーブルに保存された前記Ｉ／Ｏノードの占有率と、前記Ｉ／Ｏノード管理テーブルに保存された前記最大Ｉ／Ｏスレッド数とを用いて、前記ジョブ最大Ｉ／Ｏスレッド数を算出し、前記ジョブ最大Ｉ／Ｏスレッド数を、それぞれのＩ／Ｏノードへ通知することを更に含む
請求項１８記載のＩ／Ｏノード制御方法。
【請求項２０】
前記動的に割り当てることは、
あるジョブの終了により、前記Ｉ／Ｏノードの利用率が変化したときに、変化後の前記Ｉ／Ｏノードの利用率を前記Ｉ／Ｏノード管理テーブルに保存すると共に、この前記Ｉ／Ｏノードの利用率の変化に起因して、前記ジョブ管理テーブルに保存した他のジョブの前記Ｉ／Ｏノードの占有率を変更することと、
変更された前記Ｉ／Ｏノードの占有率と、前記Ｉ／Ｏノードの最大Ｉ／Ｏスレッド数に基づいて変更した前記他のジョブのジョブ最大Ｉ／Ｏスレッド数を、該当するＩ／Ｏノードへ通知することとを更に備える
請求項１９記載のＩ／Ｏノード制御方法。
【請求項２１】
前記該当するＩ／Ｏノードへ通知することは、
通知を受けるＩ／Ｏノードにおいて、前記ジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのジョブのＩ／Ｏ処理を実行するＩ／Ｏスレッドを生成することを含む
請求項２０記載のＩ／Ｏノード制御方法。
【請求項２２】
前記該当するＩ／Ｏノードへ通知することは、
通知を受けるＩ／Ｏノードにおいて、ジョブ起動時に通知されたジョブ最大Ｉ／Ｏスレッド数を、ジョブサーバーから通知されるジョブ最大Ｉ／Ｏスレッド数に増大し、増大したジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのジョブに割り当てるＩ／Ｏスレッドを生成することを含む
請求項２１記載のＩ／Ｏノード制御方法。
【請求項２３】
前記該当するＩ／Ｏノードへ通知することは、
通知を受けるＩ／Ｏノードにおいて、ジョブ最大Ｉ／Ｏスレッド数が増大したときに、Ｉ／Ｏ待ち状態のＩ／Ｏバッファがある場合には、前記増大したジョブ最大Ｉ／Ｏスレッド数を超えない範囲内で、そのＩ／Ｏバッファの個数分だけ、そのジョブに新たに割り当てるＩ／Ｏスレッドを生成することを更に含む
請求項２２記載のＩ／Ｏノード制御方法。
【請求項２４】
前記一部を割り当てることは、
前記一のジョブが必要とするＩ／Ｏノードの数とＩ／Ｏノードの占有率の指定をユーザから受け付けることを更に含む
請求項２３記載のＩ／Ｏノード制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｉ／Ｏノード制御方式及び方法に関する。
【背景技術】
【０００２】
最近のＣＰＵの高速化や、メモリの大容量化とメモリバンド幅の向上などにより、Ｉ／Ｏデータ量もまた大規模化している。一方、特にＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）の分野では、大規模ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）環境をベースとした高速ファイル共有システムや、複数のファイルサーバーを使用するクラスタファイルシステムなど大規模ファイルシステムが提供されており、これらの利用が一般化している。さらに、ＭＰＩ−２（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｔｅｒｆａｃｅ−２）では、並列Ｉ／Ｏのためのユーザインターフェースとして、ＭＰＩ−ＩＯが定義されており、利用者側から見た利便性も向上している。このため、ＨＰＣ分野におけるＩ／Ｏの重要度は今まで以上に増大していると考えられ、並列計算機上で動作する各ジョブが必要とするＩ／Ｏ資源の利用形態をジョブ管理の面からも無視できなくなってきている。
【０００３】
しかし、ジョブスケジューラは、各ジョブから要求される資源として、主にＣＰＵ数や計算ノード数、及びメモリ容量を対象としており、Ｉ／Ｏ資源をジョブスケジューリングの対象とはしていなので、効率的なＩ／Ｏ資源の利用ができていない場合があった。また、ジョブスケジューラは、要求された資源を確保した後にそのジョブの実行を開始することを前提としている。従って、要求量まで資源を確保しなくても動作可能である場合でも、それらの資源を確保できるまで、ジョブは、実行の開始を待たされることがあった。
【０００４】
資源を動的に割り当てる機能を提供するものが、特開２００７−１１５２４６号公報（特許文献１参照）、及び、特開２００３−３１６７５２号公報（特許文献２参照）に記載されている。特許文献１の発明は、アプリケーションＡが資源を解放する前に、アプリケーションＢに資源を割り当てる場合の問題を解決するものである。しかし、要求されたＩ／Ｏ資源が不足する場合には、処理が待たされてしまう。
【０００５】
特許文献２の発明は、各ノードにＣＰＵ、メモリ、Ｉ／Ｏブリッジを切り替え可能かどうかの判断を行って、稼働中にノード間で割り当てを変更する機能を持つ。しかし、ジョブ毎の必要量に従って資源を確保するものではない。また、Ｉ／Ｏブリッジなどハードウェアとして存在する単位でしか動的割り当てが行えない。また、同一ハードウェアをソフトウェア的に分割利用して、きめ細かい資源の割り当てをすることはできない。さらに、要求されたＩ／Ｏ資源が不足する場合には、処理が待たされてしまう。
【０００６】
Ｉ／Ｏノード制御方法の一例が、電気通信回線を通じて、ｈｔｔｐ：／／ｓｃ０６．ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ．ｏｒｇ／ｓｃｈｅｄｕｌｅ／ｐｄｆ／ｐａｐ１７８．ｐｄｆ（非特許文献１参照）に、利用可能になっている。非特許文献１は、『Ｊｏｓｅ  Ｍｏｒｅｉｒａ  ｅｔ  ａｌ．，  ”Ｄｅｓｉｇｎｉｎｇ  ａ  Ｈｉｇｈｌｙ−Ｓｃａｌａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ：  Ｔｈｅ  Ｂｌｕｅ  Ｇｅｎｅ／Ｌ  Ｓｔｏｒｙ”，  Ｉｎ  ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＩＥＥＥ／ＡＣＭ  Ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ  ＳＣ’０６，  Ｔａｍｐａ，  Ｎｏｖｅｍｂｅｒ  ２００６．』を電子化したものである。計算ノード上で要求されたＩ／Ｏ処理を決められたＩ／Ｏノードへ送信し、Ｉ／Ｏノード上でファイルシステムに対してＩ／Ｏを発行する。
【０００７】
非特許文献１におけるＩ／Ｏノード制御方法は、次のように動作する。即ち、３．３節に説明されているように、Ｉ／Ｏノードから対象とするファイルシステムを使用可能にしておく。そして、計算ノード上で呼び出されたＩ／Ｏを要求するシステムコールに基づくＩ／Ｏ要求を、ネットワークを経由して決められたＩ／Ｏノードへ送信する。Ｉ／Ｏノード上でＣＩＯＤと呼ばれるデーモンを用いて、そのＩ／Ｏを該当するファイルシステムに対して実行する。Ｉ／Ｏノード上でのＩ／Ｏ処理が終了すると、ＣＩＯＤが要求元の計算ノードにＩ／Ｏ処理の結果を返送する。
【０００８】
非特許文献１の発明には、次のような問題点がある。その問題点は、当該システムで動作するジョブが必要とするＩ／Ｏ資源に依存することなく、与えられるＩ／Ｏ資源は常に一定であるため、効率的なＩ／Ｏ資源の割り当てができない点である。その理由は、３．１節に記載の通り、１台のＩ／Ｏノードと複数の計算ノードをｐｓｅｔｓと呼ばれる集合と定義しているため、Ｉ／Ｏノードを計算ノードに動的に割り当てることができないからである。
【０００９】
特開２００１−１９５２６８号公報（特許文献３参照）には、サービスレベルによる資源割当方式の発明が記載されている。このサービスレベルによる資源割当方式は、ＡＰサービスレベル付与手段と、資源量決定手段と、資源割当手段と、ＡＰ実行手段と、資源解放手段と、ＡＰ実行待ち合わせ手段とを有する。ＡＰサービスレベル付与手段は、ＡＰにＡＰサービスレベルを付与して実行を要求する。資源量決定手段は、ＡＰサービスレベル付与手段により実行要求対象のＡＰに付与されたＡＰサービスレベルに基づいて実行要求対象のＡＰに割り当てる各資源の資源量を決定する。資源割当手段は、資源量決定手段により決定された各資源の資源量の空きがあるかどうかを判定し、各資源の資源量の空きあれば各資源の資源量を実行要求対象のＡＰに割り当てる。ＡＰ実行手段は、資源割当手段により割り当てられた各資源の資源量でＡＰを実行する。資源解放手段は、ＡＰの実行終了時にＡＰに割り当てられていた各資源の資源量を解放する。ＡＰ実行待ち合わせ手段は、資源量決定手段により決定された各資源の資源量の空きがない場合に実行要求対象のＡＰを実行待ち合わせ中とする。
【００１０】
特開平８−１４７２３４号公報（特許文献４参照）には、ストリーム処理装置の発明が記載されている。このストリーム処理装置は、外部入出力装置と、記憶装置と、バッファメモリと、スケジュール作成部と、ストリーム割当部とを備える。外部入出力装置は、外部に対するストリームの入出力要求を複数受け、要求されたストリームの送受信を所定の基準速度又はその所定倍数の速度で並列的に行う。記憶装置は、ストリームを格納し、ストリームのリード又はライトを、基準速度のＮ倍のアクセス速度により所定データ長のブロック単位で行う。バッファメモリは、外部入出力装置と記憶装置の間に設けられ、ストリームをブロック単位で一時的に記憶する。スケジュール作成部は、基準速度で同時に供給可能な複数の単位ストリームを定め、全ての単位ストリームに対して記憶装置、入出力装置、バッファメモリの時間的な使用を割り当てる。ストリーム割当部は、ストリームの入出力要求時に、要求速度に応じて未使用の単位ストリームを必要な個数割り当て、割り当てた単位ストリームのスケジュールに従って要求ストリームを供給する。
【００１１】
特開平１０−３０３９３２号公報（特許文献５参照）には、通信装置の発明が記載されている。この通信装置は、転送する手段と、判別する手段と、割り当てる手段とを具備する。転送する手段は、通信路に通信情報を転送する。判別する手段は、転送する通信情報の内容を判別する。割り当てる手段は、判別された内容に応じて、通信情報を転送するための通信路の帯域を割り当てる。
【００１２】
図１Ａ、図１Ｂは、非効率的なＩ／Ｏ資源の利用方法の説明図である。これらは、あるＩ／Ｏノードについて、ジョブ＃１が６６％の占有率を確保して先に実行されている時、占有率７５％を要求するジョブ＃２を投入する場合における占有状況を表している。図１Ａは、ジョブ＃２が要求する資源を確保できるまで、つまりジョブ＃１の実行が終了するまで、ジョブ＃２の実行を開始しないようなジョブスケジューリングである。図１Ｂは、要求する占有率７５％は確保できないが３３％まで確保してジョブの実行を開始するようなジョブスケジューリングである。図１Ａの例では、３３％の資源が空いているにもかかわらず、ジョブ＃１の実行が終わるまでジョブ＃２は待たされる。また、図１Ｂの例では、確保できる３３％の占有率でジョブの実行を開始できるが、ジョブ＃１が終了してもその空いた資源を利用することができないという問題がある。
【００１３】
【特許文献１】特開２００７−１１５２４６号公報
【特許文献２】特開２００３−３１６７５２号公報
【特許文献３】特開２００１−１９５２６８号公報
【特許文献４】特開平８−１４７２３４号公報
【特許文献５】特開平１０−３０３９３２号公報
【非特許文献１】ｈｔｔｐ：／／ｓｃ０６．ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ．ｏｒｇ／ｓｃｈｅｄｕｌｅ／ｐｄｆ／ｐａｐ１７８．ｐｄｆ
【発明の開示】
【発明が解決しようとする課題】
【００１４】
本発明の課題は、Ｉ／Ｏノードを使用して計算ノードがファイルシステムへアクセスするコンピュータシステムにおいて、Ｉ／ＯノードをＩ／Ｏ資源と捉えるとした場合、ジョブ毎に、当該ジョブの実行を停止させることなく、Ｉ／Ｏノードを動的に割り当てる機能を提供し、Ｉ／Ｏ資源を効率的に利用することである。
【課題を解決するための手段】
【００１５】
本発明の一つのアスペクトによるＩ／Ｏノード制御方式は、ファイルシステムと、Ｉ／Ｏノードと、計算ノードと、ジョブサーバーとを具備する。ファイルシステムは、データを蓄積する。Ｉ／Ｏノードは、ファイルシステムにアクセスする。計算ノードは、ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、Ｉ／ＯノードにＩ／Ｏ要求を発行する。ジョブサーバーは、ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、Ｉ／Ｏノードの資源量を動的に割り当てる。ジョブサーバーは、あるジョブを起動するときに、そのジョブが必要とするＩ／Ｏノードの資源量の全てを確保できない場合には、必要とするＩ／Ｏノードの資源量の一部を確保して、そのジョブに対して、必要とするＩ／Ｏノードの資源量の一部を割り当てる。
【００１６】
本発明の二つ目のアスペクトによるＩ／Ｏノード制御方法は、一部を割り当てることと、動的に割り当てることとを具備する。一部を割り当てることは、一のジョブを起動するときに、一のジョブが必要とするＩ／Ｏノードの資源量の全てを確保できない場合に、必要とするＩ／Ｏノードの資源量の一部を確保して、一のジョブに対して、必要とするＩ／Ｏノードの資源量の一部を割り当てる。動的に割り当てることは、他のジョブが終了したときに、他のジョブが使用していたＩ／Ｏノードの資源量を解放すると共に、一のジョブに対して、必要とするＩ／Ｏノードの資源量の不足分を、前記一のジョブの実行を停止することなく動的に割り当てる。
【発明の効果】
【００１７】
本発明によれば、Ｉ／Ｏノードを使用して計算ノードがファイルシステムへアクセスするコンピュータシステムにおいて、Ｉ／ＯノードをＩ／Ｏ資源と捉えるとした場合、ジョブ毎に、当該ジョブの実行を停止させることなく、Ｉ／Ｏノードを動的に割り当てる機能を提供し、Ｉ／Ｏ資源を効率的に利用することができる。
【発明を実施するための最良の形態】
【００１８】
＝＝＝＝＝実施の形態＝＝＝＝＝
本発明を実施するための最良の形態の一つについて、図面を参照して詳細に説明する。図２に、本発明の一つの実施の形態におけるＩ／Ｏノード制御方式を備えた並列計算機システムの構成図を示す。図２の並列計算機システム７０は、ファイルシステム６０に接続された複数のＩ／Ｏノード２０−１〜２０−ｍと、制御ネットワーク５０に接続された複数の計算ノード３０−１〜３０−ｎと、Ｉ／Ｏノード２０−１〜２０−ｍと計算ノード３０−１〜３０−ｎとを接続する相互結合ネットワーク４０と、投入されるジョブの制御を行うジョブサーバー１０とを備えている。ファイルシステム６０は、並列ファイルシステムを含む任意のファイルシステムである。並列計算機システム７０は、並列Ｉ／Ｏにも対応できるＩ／Ｏ資源の割り当てを行うためのＩ／Ｏノードの制御方法を使用する。
【００１９】
図２において、任意の１つの計算ノードは、全てのＩ／Ｏノード２０−１〜２０−ｍと通信が可能であり、その計算ノードは、どのＩ／Ｏノードを使用したとしても同じファイルシステム６０へアクセス可能である。よって、任意の計算ノードとＩ／Ｏノードとの組み合わせが可能である。このため、ジョブ実行開始時点で空きのあるＩ／Ｏノードをそのジョブが使用する計算ノードに割り当てることが可能なシステム構成である。
【００２０】
並列計算機システム７０は、Ｉ／Ｏノード２０−１〜２０−ｍをジョブ毎に動的に割り当てる。動的な割り当ては、ジョブ投入時にユーザが、必要とするＩ／Ｏ資源（具体的には、Ｉ／Ｏノード数とＩ／Ｏノードの占有率）を宣言するか、またはそのジョブが使用する計算ノード数と確保するメモリ量との関係から必要なＩ／Ｏ資源の量を推定することなどによって、可能である。本実施の形態においては、ジョブスケジューラから呼び出されるＩ／Ｏノードスケジューラが、そのジョブに使用させるＩ／Ｏノードそれぞれの占有率を割り当てる。
【００２１】
さらに、他のジョブがＩ／Ｏノードを使用しているために、要求しただけのＩ／Ｏノード数、および占有率を確保できない場合には、要求値を、占有率を確保できる値まで一旦縮小してそのジョブの実行を開始する。後刻、当該他のジョブが終了し利用率に空きが生じた時点で、実行中の当該ジョブを停止させることなく、動的に当初要求した要求値まで占有率を拡大する制御を行う。
【００２２】
本願において記述するＩ／Ｏノードとは、ネットワークファイルシステムなどのサーバー、クライアントの関係があるファイルシステムのクライアントとなり得るコンピュータである。図２の場合、計算ノードは、Ｉ／Ｏ要求をＩ／Ｏノードへ転送し、実際のＩ／Ｏ処理をＩ／Ｏノードへ依頼するという仕組みを前提としている。
【００２３】
本実施の形態では、図２に示すような複数のＩ／Ｏノード２０−１〜２０−ｍをＩ／Ｏ資源と捉えている。この場合、計算ノードは複数必要だがＩ／Ｏノードは１台のみで十分なジョブもある。一方で、計算ノードと同数のＩ／Ｏノードを必要とするジョブもある。つまり、ジョブによってＩ／Ｏ資源の必要量には本来差がある。
【００２４】
例えば、計算ノード数やメモリ容量などの資源は、要求量が確保できなければ実行を開始できない場合もある。しかし、本実施の形態のように、Ｉ／Ｏノード２０−１〜２０−ｍをＩ／Ｏ資源と捉える場合、ジョブ開始時に要求したＩ／Ｏ資源の全てを確保できなかったとしても、そのジョブを開始することは可能である。そのジョブの実行時間が延びることはあっても実行不可能な訳ではないからである。本実施の形態では、ジョブスケジューラは、ジョブが要求したＩ／Ｏ資源を要求量まで確保できない場合でも、そのジョブの実行を開始するというジョブスケジューリングを行う。それから、Ｉ／Ｏ資源が不足したまま実行されているジョブに対して、同Ｉ／Ｏ資源に空きができた時点で、動的に追加のＩ／Ｏ資源を割り当て、Ｉ／Ｏ資源を要求値まで拡大するような処理を行う。
【００２５】
＝＝＝＝＝構成＝＝＝＝＝
図３に、本実施の形態におけるＩ／Ｏノード制御方式の詳細構成図を示す。図３に示すように、ジョブサーバー１０と、計算ノード３０とは、制御ネットワーク５０によって接続されている。また、計算ノード３０と、Ｉ／Ｏノード２０とは、相互結合ネットワーク４０によって接続されている。図３では、計算ノード３０を一つのみ示しているが、通常は、図２のように、複数台の計算ノード３０が含まれる。同様に、Ｉ／Ｏノード２０も一つのみ示しているが、通常は、図２のように、複数台のＩ／Ｏノード３０が含まれる。以下、図３を参照して、それぞれのブロックについて詳細に説明する。
【００２６】
図３に示すように、本実施の形態におけるジョブサーバー１０は、ジョブスケジューラ１０１を備えている。ジョブサーバー１０は、ユーザが投入したジョブの制御を行う。本実施の形態の場合、ジョブスケジューラ１０１から呼び出されるＩ／Ｏノードスケジューラ１０２は、ジョブサーバー１０上で実行される。また、制御ネットワーク５０を介して、各計算ノード３０と通信が可能である。ジョブスケジューラ１０１は、ジョブスケジューリングの標準的な機能である既存コンポーネント１０３と、Ｉ／Ｏノードスケジューラ１０２とを内包する。Ｉ／Ｏノードスケジューラ１０２は、ジョブスケジューラ１０１から呼び出され、ジョブ毎のＩ／Ｏノード２０の動的な割り当て、解放などに関連した処理を行う。
【００２７】
Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード登録部１０２−１と、Ｉ／Ｏノード管理テーブル１０２−２と、ジョブ管理テーブル１０２−３と、Ｉ／Ｏノード確保／解放部１０２−４と、Ｉ／Ｏノード設定ファイル１０２−５と、占有率マッピング部１０２−６と、Ｉ／Ｏノード情報作成部１０２−７と、Ｉ／Ｏノード情報テーブル１０２−８と、Ｉ／Ｏスレッド数変更部１０２−９と、Ｉ／Ｏノード要求情報作成部１０２−１０とを有している。
【００２８】
Ｉ／Ｏノード登録部１０２−１は、Ｉ／Ｏノード設定ファイル１０２−５から各Ｉ／Ｏノードの番号、最大Ｉ／Ｏスレッド数、ＩＰアドレスを読み出し、Ｉ／Ｏノード管理テーブル１０２−２へ登録する。
【００２９】
Ｉ／Ｏノード管理テーブル１０２−２は、Ｉ／Ｏノード登録部１０２−１により作成され、Ｉ／Ｏノード確保／解放部１０２−４により、Ｉ／Ｏノードの確保及び解放の際に、利用率が更新される。
【００３０】
ジョブ管理テーブル１０２−３は、各ジョブが確保しているＩ／Ｏノードとその占有率、計算ノードとＩ／Ｏノードの対応のために使用する。また、要求した占有率が確保できない場合は、占有率不足分を表示する欄に不足分を記録しておく。後刻、他のジョブが終了してＩ／Ｏ資源を確保できるようになった時点で、占有率不足分を表示する欄とジョブ開始時刻を表示する欄とが参照される。これらは、解放された占有率を割り当てるべきジョブを決めるために使用される。Ｉ／Ｏノード確保／解放部１０２−４により操作される。
【００３１】
Ｉ／Ｏノード確保／解放部１０２−４は、ジョブ起動時において、当該ジョブが要求するＩ／Ｏノード数分のＩ／Ｏノードの選択と、その占有率の確保、また占有率を確保できない場合の占有率の縮小などの処理を行う。また、ジョブ終了時においては、当該ジョブが使用していたＩ／Ｏノードの占有率の解放を行う。その時点で、他のジョブの中で占有率が不足しているジョブがあれば、解放した占有率を他のジョブに割り当てる処理を行う。上記の処理においては、Ｉ／Ｏノード管理テーブル１０２−２及びジョブ管理テーブル１０２−３を検索、更新する。
【００３２】
Ｉ／Ｏノード設定ファイル１０２−５は、各Ｉ／Ｏノードの番号、最大Ｉ／Ｏスレッド数、ＩＰアドレスを記録しておくファイルである。ジョブサーバー１０に直接接続された不図示のディスク装置上に構築されたファイルシステムに保存されている。Ｉ／Ｏノード設定ファイル１０２−５は、システム管理者がＩ／Ｏノードの設定を行う際に作成、変更される。また、ジョブサーバー１０を起動する際に、Ｉ／Ｏノード登録部１０２−１により読み込まれ、Ｉ／Ｏノード管理テーブル１０２−２へ反映される。
【００３３】
占有率マッピング部１０２−６は、要求された各Ｉ／Ｏノードの占有率と最大Ｉ／Ｏスレッド数から、ジョブ最大Ｉ／Ｏスレッド数を計算する。あるジョブのジョブ最大Ｉ／Ｏスレッド数は、Ｉ／Ｏノードごとに与えられ、占有率と最大Ｉ／Ｏスレッド数との積を求めることによって、計算することができる。
【００３４】
Ｉ／Ｏノード情報作成部１０２−７は、Ｉ／Ｏノードの確保後、計算ノード毎にＩ／Ｏノード情報を作成する際に用いる。当該ジョブで使用する計算ノード数分のＩ／Ｏノード情報テーブル１０２−８の領域をメモリ上に確保する。そして、ジョブ管理テーブル１０２−３に登録した当該ジョブについて、計算ノード毎に対応するＩ／Ｏノード番号とそのＩＰアドレスを記録する。
【００３５】
Ｉ／Ｏノード情報テーブル１０２−８は、Ｉ／Ｏノード情報作成部１０２−７により作成される。計算ノード毎に、対応するＩ／Ｏノードの情報を記録する。ジョブ起動時に一時的に作成される表である。
【００３６】
Ｉ／Ｏスレッド数変更部１０２−９は、占有率を要求分まで確保できていないジョブがあった場合において、あるジョブが終了した際に、他のジョブに不足分の占有率を割り当てる際、どのジョブに割り当てるべきかを、ジョブ開始時刻からの経過時間と占有率不足分との関係から決める。そして、Ｉ／Ｏスレッド数変更情報を作成し、当該Ｉ／Ｏノードを使用する計算ノードへ、その変更情報を送信する。
【００３７】
Ｉ／Ｏノード要求情報作成部１０２−１０は、ジョブスケジューラ１０１から渡されたＩ／Ｏノード要求情報を参照する。Ｉ／Ｏノード数が、ユーザによる指定が無いことを示す０の場合に、当該ジョブが必要とするＩ／Ｏ資源量を推定し、Ｉ／Ｏノード数と各Ｉ／Ｏノードの占有率を決める。なお、Ｉ／Ｏノードスケジューラ１０２は、ジョブスケジューラ１０１がＩ／Ｏノードスケジューラ１０２を呼び出す際に、ジョブスケジューラ１０１からＩ／Ｏノード要求情報を渡される。この際、Ｉ／Ｏノード要求情報作成部１０２−１０は、そのＩ／Ｏノード要求情報を参照する。
【００３８】
既存コンポーネント１０３は、ジョブスケジューリングの標準的な機能を持つ。例えば、計算ノードやＣＰＵ数の割り当て、メモリ及びＣＰＵの使用量などの資源管理機能、ジョブの優先度、実行中のジョブを任意の時点で停止させ、当該ジョブ使用のメモリ内容をファイルに記録するチェックポイント、また同ファイルを元にチェックポイント時点から再実行するリスタートなどのジョブ制御の機能と、各計算ノードとの通信機能などを持つ。
【００３９】
図３に示すように、本実施の形態におけるＩ／Ｏノード２０は、通信デーモン２０１と、共通処理デーモン２０２と、共通処理デーモン送信スレッド２０３と、Ｉ／Ｏデーモン２０４と、Ｉ／Ｏスレッド２０５と、Ｉ／Ｏデーモン送信スレッド２０６とを備えている。
【００４０】
通信デーモン２０１は、計算ノードから接続要求があると、接続を確立する。各Ｉ／Ｏノードに１つ存在する。接続要求を送信した計算ノードとの接続が確立すると、共通処理デーモン２０２を１つ生成し、以後、計算ノードとの通信は、その共通処理デーモン２０２が行う。
【００４１】
共通処理デーモン２０２は、計算ノードから接続要求がある毎に、通信デーモン２０１によって生成される。計算ノードからパケットを受信し、及び、Ｉ／Ｏデーモン２０４へ、そのパケットを送信する。
【００４２】
共通処理デーモン送信スレッド２０３は、共通処理デーモン２０２が生成するスレッドである。共通処理デーモン２０２とは独立に動作できるがメモリを共有できる。Ｉ／Ｏ処理の実行結果などを当該計算ノードへ返送するために使用する。
【００４３】
Ｉ／Ｏデーモン２０４は、Ｉ／Ｏスレッド２０５の生成、Ｉ／Ｏバッファの管理、Ｉ／Ｏデーモン送信スレッド２０６の生成などを行うデーモンである。一般に、複数のＩ／Ｏスレッド２０７と１つのＩ／Ｏデーモン送信スレッド２０６とを生成する。ジョブ毎に１つ存在する。
【００４４】
Ｉ／Ｏスレッド２０５は、計算ノードから要求されたＩ／Ｏ処理を実際に実行する。この際、Ｉ／Ｏ対象は、Ｉ／Ｏ待ちフラグが設定されているＩ／Ｏバッファが１つ選択されたときに、そのバッファ内容に応じて決まる。Ｉ／Ｏスレッド２０５は、Ｉ／Ｏデーモン２０４が生成するスレッドであり、Ｉ／Ｏデーモン２０４とは独立に動作できるがメモリを共有できる。また、ジョブ最大Ｉ／Ｏスレッド数まで、ジョブ毎に生成可能である。
【００４５】
Ｉ／Ｏデーモン送信スレッド２０６は、Ｉ／Ｏ処理の終了したＩ／ＯバッファのＩ／Ｏ要求を１つ取り出し、共通処理デーモン送信スレッド２０３へ送信する。
【００４６】
通信デーモン２０１は、接続確立部２０１−１と、プロセス生成部２０１−２とを有している。接続確立部２０１−１は、通信デーモン２０１の接続確立のためのプリミティブである。プロセス生成部２０１−２は、共通処理デーモン２０２を生成するために使用する。オペレーティングシステムが提供するプロセスを生成するためのシステムコールを利用する。
【００４７】
共通処理デーモン２０２は、共通処理デーモン２０２は、受信部２０２−１と、スレッド生成部２０２−２と、ジョブテーブル操作部２０２−３と、通信バッファ２０２−４と、プロセス間通信部２０２−５と、プロセス生成部２０２−６と、ジョブ管理テーブル２０２−７と、Ｉ／Ｏデーモン終了部２０２−８とを有している。
【００４８】
受信部２０２−１は、計算ノードと接続確立した際のソケットを使用し、当該計算ノードから送信されるパケットの受信、待ち合わせを行うプリミティブである。
【００４９】
スレッド生成部２０２−２は、共通処理デーモン送信スレッド２０３を生成する。ＰＯＳＩＸ（Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）スレッドなど、一般に利用可能なスレッドライブラリを利用する。
【００５０】
ジョブテーブル操作部２０２−３は、生成したＩ／Ｏデーモン２０４のプロセスＩＤ（以下、ＰＩＤ）を、対応するジョブＩＤ（以下、ＪＩＤ）のエントリへ登録する。また、受信パケットを送信すべきＩ／Ｏデーモン２０４を特定するために、ＪＩＤをキーとして検索する。
【００５１】
通信バッファ２０２−４は、計算ノードから送信されるパケットを格納する。Ｉ／Ｏデーモン２０４へ送信する際も、同じバッファを使用する。
【００５２】
プロセス間通信部２０２−５は、共通処理デーモン２０２からＩ／Ｏデーモン２０４へＩ／Ｏ要求などを受け渡すために使用する。同じコンピュータ内でのプロセス間の通信のためのプリミティブである。
【００５３】
プロセス生成部２０２−６は、ジョブ起動時において、共通処理デーモン２０２が、計算ノードから初期化情報を受信した際、Ｉ／Ｏデーモン２０４を生成するために使用する。オペレーティングシステムが提供するプロセスを生成するためのシステムコールを利用する。
【００５４】
ジョブ管理テーブル２０２−７は、Ｉ／Ｏデーモン２０４とジョブの対応をとるため、当該ジョブのＪＩＤとＩ／Ｏデーモン２０４のＰＩＤを記録するための対応表である。
【００５５】
Ｉ／Ｏデーモン終了部２０２−８は、ジョブ終了時に、受信部２０２−１が計算ノードからジョブの終了通知を受信した際に、当該ジョブに対応するＩ／Ｏデーモン２０４に終了シグナルを送信する。
【００５６】
共通処理デーモン送信スレッド２０３は、送信部２０３−１と、通信バッファ２０３−２と、プロセス間通信部２０３−３とを有している。送信部２０３−１は、計算ノードと接続確立した際のソケットを使用し、当該計算ノードへパケットを送信するためのプリミティブである。通信バッファ２０３−２は、Ｉ／Ｏデーモン送信スレッド２０６からの受信、及び計算ノードへの送信の際に使用するバッファである。プロセス間通信部２０３−３は、Ｉ／Ｏデーモン送信スレッド２０６から送信されるデータを受信するために使用する。同じコンピュータ内でのプロセス間通信のためのプリミティブである。
【００５７】
Ｉ／Ｏデーモン２０４は、プロセス間通信部２０４−１と、スレッド生成部２０４−２と、Ｉ／Ｏスレッド管理テーブル２０４−３と、Ｉ／Ｏバッファ確保部２０４−４と、Ｉ／Ｏバッファ管理テーブル２０４−５と、Ｉ／Ｏバッファ待ち合わせ部２０４−６と、Ｉ／Ｏスレッド起動部２０４−７と、ファイル管理テーブル２０４−８と、Ｉ／Ｏスレッド数変更部２０４−９とを有している。
【００５８】
プロセス間通信部２０４−１は、共通処理デーモン２０２が計算ノードから受信したＩ／Ｏ要求などのパケットを受信するために使用する。同じコンピュータ内でのプロセス間通信のためのプリミティブである。
【００５９】
スレッド生成部２０４−２は、Ｉ／Ｏスレッド２０５及びＩ／Ｏデーモン送信スレッド２０６を生成する。ＰＯＳＩＸスレッドなど、一般に利用可能なスレッドライブラリを利用する。
【００６０】
Ｉ／Ｏスレッド管理テーブル２０４−３は、ジョブ最大Ｉ／Ｏスレッド数、生成済みのＩ／Ｏスレッド数、現在Ｉ／Ｏ処理実行中のＩ／Ｏスレッド数を管理する。また、当該スレッドが使用中であることを示すためにＩ／Ｏ実行中フラグを用いる。
【００６１】
Ｉ／Ｏバッファ確保部２０４−４は、共通処理デーモン２０２から送信されるＩ／Ｏ要求などのパケットの受信バッファ、及びＩ／Ｏスレッド２０５がＩ／Ｏを発行するためのバッファとして使用する。共通処理デーモン２０２から受信し、Ｉ／Ｏ終了後、Ｉ／Ｏデーモン送信スレッド２０６が共通処理デーモン送信スレッド２０３へ送信するまでの間、同じバッファを使用するので、メモリ間でコピーする必要がない。
【００６２】
Ｉ／Ｏバッファ管理テーブル２０４−５は、Ｉ／Ｏバッファを管理する。Ｉ／Ｏバッファの現在の状態を示すために、受信待ちフラグ、Ｉ／Ｏ待ちフラグ、Ｉ／Ｏ実行中フラグ、返却待ちフラグを用いる。
【００６３】
Ｉ／Ｏバッファ待ち合わせ部２０４−６は、待ち合わせ機能を担う。Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファを確保していく際、Ｉ／Ｏバッファが利用可能な上限値まで確保されてしまい、要求値のＩ／Ｏバッファを完全に確保できない場合がある。この場合、Ｉ／Ｏバッファ待ち合わせ部２０４−６は、他の使用中のＩ／Ｏバッファが空くまで待ち合わせを行う。
【００６４】
Ｉ／Ｏスレッド起動部２０４−７は、Ｉ／Ｏスレッド管理テーブル２０４−３に基づいて、空きＩ／Ｏスレッドがあるかどうかを調べる。空きスレッドがある場合、Ｉ／Ｏスレッド管理テーブル２０４−３から使用中ではない（Ｉ／Ｏで使用中を示すフラグが設定されていない）Ｉ／Ｏスレッドを１つ選び、それにＩ／Ｏ処理中フラグを設定する。
【００６５】
ファイル管理テーブル２０４−８は、計算ノードでオープンされたファイルと、Ｉ／Ｏノードがマウントしているファイルシステム６０上のファイルとの対応を取るために使用する。計算ノードのＩＰアドレス、Ｉ／Ｏを要求したプロセスのＰＩＤ、ファイルディスクリプタ（以下、ＦＤ）と、Ｉ／Ｏノード上でのＦＤの対応を格納する。
【００６６】
Ｉ／Ｏスレッド数変更部２０４−９は、Ｉ／Ｏ資源の占有率が不足していたジョブに対して、Ｉ／Ｏスレッド管理テーブル２０４−３内のジョブ最大Ｉ／Ｏスレッド数に、計算ノードを経由してジョブサーバー１０から受信したパケット内のＩ／Ｏスレッド数変更情報に含まれる「ジョブ最大Ｉ／Ｏスレッド数の増加分」を加算する。そして、Ｉ／Ｏバッファ管理テーブル２０４−５を検索し、Ｉ／Ｏ待ちフラグが設定されているバッファが存在するかどうかを調べる。
【００６７】
Ｉ／Ｏスレッド２０５は、待ち合わせ部２０５−１と、Ｉ／Ｏ部２０５−２とを有している。
【００６８】
待ち合わせ部２０５−１は、計算ノードからＩ／Ｏ要求が来るまで、待ち合わせ行う。Ｉ／Ｏ要求を受信すると、Ｉ／Ｏデーモン２０４がＩ／Ｏスレッド起動部２０４−７により再実行する。Ｉ／Ｏデーモン２０４において、使用中ではないＩ／Ｏスレッドが１つ選ばれ、それにＩ／Ｏ処理中フラグが設定されると、待ち合わせ部２０５−１は、Ｉ／Ｏ要求を待ち合わせているＩ／Ｏスレッド２０５を再実行する処理を行う。
【００６９】
Ｉ／Ｏ部２０５−２は、計算ノードからのＩ／Ｏ要求に基づき、オープン／リード／ライト等々のシステムコールをＩ／Ｏノードがマウントしているファイルシステム６０に対して実行する。実行が終了すると、実行結果を当該Ｉ／Ｏバッファに格納し、Ｉ／Ｏデーモン送信スレッド２０６を再実行する。
【００７０】
Ｉ／Ｏデーモン送信スレッド２０６は、プロセス間通信部２０６−１と、待ち合わせ部２０６−２とを有している。
【００７１】
プロセス間通信部２０６−１は、共通処理デーモン送信スレッド２０３へＩ／Ｏ処理が終了したＩ／Ｏバッファ内のデータを送信する。同じコンピュータ内でのプロセス間通信のためのプリミティブである。
【００７２】
待ち合わせ部２０６−２は、Ｉ／Ｏ処理が終了しＩ／Ｏスレッド２０５から再実行されるまで、待ち合わせを行う。
【００７３】
図３に示すように、本実施の形態における計算ノード３０は、通信部３０１と、ジョブ管理デーモン３０２と、ユーザプロセス３０３と、Ｉ／Ｏリクエスト作成部３０４と、Ｉ／Ｏノード対応テーブル３０５と、マウント部３０６と、マウントポイント対応テーブル３０７とを備えている。
【００７４】
通信部３０１は、ジョブサーバー１０、及び、Ｉ／Ｏノード２０と通信を行う。
【００７５】
ジョブ管理デーモン３０２は、ジョブスケジューラ１０１からの通信を受け取り、計算ノード３０におけるジョブの起動などの制御を行う。
【００７６】
ユーザプロセス３０３は、一般に複数のユーザプロセスからなり、ジョブサーバー１０から起動される特定のジョブに属する。また、これらのユーザプロセスは、ユーザのアプリケーションプログラムを実行し、必要に応じて、システムコールにより割り当てられたＩ／ＯノードへＩ／Ｏを要求する。
【００７７】
Ｉ／Ｏリクエスト作成部３０４は、ユーザプロセス３０３から、Ｉ／Ｏノードがマウントしているファイルシステム６０へリード／ライトやその他のファイル、ファイルシステムに対する操作を行う場合に、その要求を対応するＩ／Ｏノードへ送信するためのリクエストを作成する。
【００７８】
Ｉ／Ｏノード対応テーブル３０５は、計算ノード３０に割り当てられたＩ／Ｏノードの対応表である。ジョブ毎に、対応するＩ／ＯノードのＩＰアドレスや、通信に用いるソケットを記録する。
【００７９】
マウント部３０６は、パス名の対応を記録する。すなわち、計算ノード３０上のユーザプロセス３０３が、オープンなどファイルやディレクトリのパス名を指定するシステムコールを呼び出したとき、そのパス名をＩ／Ｏノードにおけるパス名に変換する必要がある。そのため、マウント部３０６は、マウントコマンドで指定された計算ノード３０のマウントポイントのパス名と、Ｉ／Ｏノード２０でのマウントポイントのパス名の対応をマウントポイント対応テーブル３０７へ記録する。
【００８０】
マウントポイント対応テーブル３０７は、マウントコマンドで指定された計算ノード３０のマウントポイントのパス名と、Ｉ／Ｏノードでのマウントポイントのパス名の対応を保持するためのテーブルである。
【００８１】
図３に示す相互結合ネットワーク４０は、複数の計算ノード３０を使用して並列処理を行うジョブにおいて、計算ノード３０間におけるデータやメッセージの交換、及び計算ノード３０とＩ／Ｏノード２０間におけるＩ／ＯデータとＩ／Ｏのための制御データの通信に用いられる。相互結合ネットワーク４０は、任意の計算ノード３０間、または任意の計算ノード３０とＩ／Ｏノード２０間において、高速に通信が可能なネットワークとするのが好適である。ただし、一般に利用可能な、イーサネット（Ｅｔｈｅｒｎｅｔ：登録商標）やインフィニバンド（ＩｎｆｉｎｉＢａｎｄ）などでもよい。
【００８２】
図３に示す制御ネットワーク５０は、ジョブサーバー１０と計算ノード３０間において、ジョブの起動、終了時において必要な通信行う。イーサネット（登録商標）など、一般に利用可能なネットワークを利用することができる。
【００８３】
図３に示すファイルシステム６０は、Ｉ／Ｏノード２０からアクセス可能であり、ＰＯＳＩＸなどの一般的に知られたインターフェースを提供する任意の並列ファイルシステム、ネットワークファイルシステム、クラスタファイルシステムなどを対象とする。また、ファイルシステム６０は、システム管理者によって、Ｉ／Ｏノード起動時に各Ｉ／Ｏノードから同じパス名をマウントポイントとしてマウントされていることを前提とする。なお、複数のファイルシステムをマウントする場合は、ファイルシステム毎にマウントポイントのパス名を変更する必要があるが、各Ｉ／Ｏノードからはファイルシステム毎に同じパス名でマウントする。
【００８４】
図４は、ｍ＝４の場合におけるＩ／Ｏノードの占有状況を表した一例である。図４の例では、ジョブ＃１は、Ｉ／Ｏノード＃１〜Ｉ／Ｏノード＃４を、それぞれ２５％の占有率で確保している。ジョブ＃２は、Ｉ／Ｏノード＃１とＩ／Ｏノード＃２とを、それぞれ３５％の占有率で確保している。ジョブ＃３は、Ｉ／Ｏノード＃３とＩ／Ｏノード＃４とを、それぞれ２０％の占有率で確保している。ジョブ＃４は、Ｉ／Ｏノード＃３を、２５％の占有率で確保している。ジョブ＃５は、Ｉ／Ｏノード＃４を、１５％の占有率で確保している。ジョブ＃６は、Ｉ／Ｏノード＃１〜Ｉ／Ｏノード＃４を、それぞれ１５％の占有率で確保している。
【００８５】
図５に、ジョブサーバー１０のＩ／Ｏノードスケジューラ１０２が備えるＩ／Ｏノード管理テーブル１０２−２の具体例を示す。Ｉ／Ｏノード管理テーブル１０２−２は、図４に示したようなＩ／Ｏノードの占有率に関する情報を保持している。図示するように、図５のＩ／Ｏノード管理テーブル１０２−２は、Ｉ／Ｏノード番号の欄、利用率の欄、最大Ｉ／Ｏスレッド数の欄、及び、ＩＰアドレスの欄を有している。
【００８６】
図６に、ジョブサーバー１０のＩ／Ｏノードスケジューラ１０２が備えるジョブ管理テーブル１０２−３の具体例を示す。図示するように、図６のジョブ管理テーブル１０２−３は、ジョブ番号の欄、計算ノード番号の欄、Ｉ／Ｏノード番号の欄、占有率の欄、占有率不足分の欄、及び、ジョブ開始時刻の欄を有している。
【００８７】
図７に、Ｉ／Ｏノード２０のＩ／Ｏデーモン２０４が備えるＩ／Ｏバッファ管理テーブル２０４−５の説明図を示す。図示するように、図７のＩ／Ｏバッファ管理テーブル２０４−５は、状態を示すフラグの欄、及び、Ｉ／Ｏバッファへのポインタの欄を有している。Ｉ／Ｏバッファへのポインタの欄に保持されたポインタ＃０，ポインタ＃１，・・・，ポインタ＃ｎは、それぞれ、Ｉ／Ｏバッファ＃０  ９０−０，Ｉ／Ｏバッファ＃１  ９０−１，・・・，Ｉ／Ｏバッファ＃ｎ  ９０−ｎの場所を指し示している。
【００８８】
本実施の形態では、あるジョブが使用する計算ノード数と確保するメモリ量の関係から必要なＩ／Ｏノード数と占有率を推定する。また、特に並列Ｉ／Ｏを必要とするジョブについては、ジョブを投入するユーザ自身が、そのジョブに必要なＩ／Ｏ資源として、Ｉ／Ｏノード数とＩ／Ｏノードの占有率をジョブ投入時に宣言することも可能である。従って、その並列Ｉ／Ｏを必要とするジョブの並列度に見合ったＩ／Ｏノード数を指定することもできる。
【００８９】
ジョブサーバー１０内のＩ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード２０の占有率に関する管理情報（Ｉ／Ｏノード管理テーブル１０２−２）、及び各ジョブに割り当てたＩ／Ｏノードに関する情報（ジョブ管理テーブル１０２−３）を持っている。これらに基づいて、各Ｉ／Ｏノードの利用率（割り当てた占有率の合計）を調査し、利用率の最も少ないＩ／Ｏノードから順に選択して、新たに投入されたジョブが要求する数のＩ／Ｏノードを割り当てる。
【００９０】
ただし、他のジョブが使用しているために要求しただけのＩ／Ｏノード数、および占有率を確保できない場合もある。この場合は、一旦要求値を、占有率を確保可能な値まで縮小してそのジョブの実行を開始する。後刻、他のジョブが終了し利用率に空きが生じた時点で、実行中の当該ジョブを停止させることなく、動的に当初要求した値まで占有率を拡大させるという制御を行う。
【００９１】
各Ｉ／Ｏノード内では、主に以下のような処理を行う。Ｉ／Ｏノード内にジョブ毎に生成されるＩ／Ｏデーモンがあり、Ｉ／Ｏデーモンが実際にＩ／Ｏ処理を行うＩ／Ｏスレッドを生成する。この際、各Ｉ／Ｏノード毎の最大Ｉ／Ｏスレッド数を、固定値として、予め設定しておく。この最大Ｉ／Ｏスレッド数を基準に、ジョブ毎に設定される各Ｉ／Ｏノードの占有率に比例した数までのＩ／Ｏスレッドの生成を当該Ｉ／Ｏデーモンに許す。これにより当該ジョブは、Ｉ／Ｏノードスケジューラが設定した占有率に比例した数までのＩ／Ｏを発行することができる。
【００９２】
これにより、複数のジョブを同時に実行させる場合、ジョブ毎に必要なＩ／Ｏ資源を動的に割り当てることができる。また、多数のＩ／Ｏが要求された場合でも、あるＩ／Ｏノードから同時に発行されるＩ／Ｏ数は最大Ｉ／Ｏスレッド数までであるので、ファイルシステムが過負荷になり処理が遅延することがない。
【００９３】
＝＝＝＝＝動作＝＝＝＝＝
次に、図８及び図９のフローチャートを参照して、本実施の形態におけるＩ／Ｏノード制御方式の動作について詳細に説明する。ただし、Ｉ／Ｏノード登録時、ジョブ起動時、Ｉ／Ｏ実行時、ジョブ終了時について、処理が異なるので、これらを分けて説明する。なお、ジョブサーバー１０と計算ノード３０−１〜３０−ｎ、及び計算ノード３０−１〜３０−ｎとＩ／Ｏノード２０−１〜２０−ｍは、それぞれ、ＴＣＰ／ＩＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ／Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）などの一般的な通信プロトコルを用いて通信できるものとする。また、それぞれのオペレーティングシステムは、ＵＮＩＸ（登録商標）やＬｉｎｕｘ（登録商標）などを前提とする。
【００９４】
《Ｉ／Ｏノード登録時》
ジョブサーバー１０起動時において、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３の領域をメモリ上に確保する。続いて、Ｉ／Ｏノード登録部１０２−１により、Ｉ／Ｏノード設定ファイル１０２−５から各Ｉ／Ｏノードの番号、最大Ｉ／Ｏスレッド数、ＩＰアドレスを読み出す。そして、Ｉ／Ｏノード管理テーブルへ登録する。また、システム運用中において、システム管理者は、管理用のコマンドを用いて、上記と同様にＩ／Ｏノードの番号、最大Ｉ／Ｏスレッド数、ＩＰアドレスを入力することで、Ｉ／Ｏノードを追加することができる。
【００９５】
《ファイルシステムのマウント時》
ファイルシステム６０へ直接アクセスするのはＩ／Ｏノード２０−１〜２０−ｍであり、Ｉ／Ｏを要求するのは計算ノード３０−１〜３０−ｎである。Ｉ／Ｏノード２０−１〜２０−ｍがマウントしたファイルシステム６０と計算ノード３０−１〜３０−ｎとの対応が必要となる。本実施の形態においては、ＮＦＳ（Ｎｅｔｗｏｒｋ  Ｆｉｌｅ  Ｓｙｓｔｅｍ）などのネットワークファイルシステムをマウントする場合と同様なインターフェースを用い、あたかもＩ／Ｏノードがネットワークファイルシステムのサーバーであるかのように、各計算ノードからシステム管理者がマウントコマンドを実行する。
【００９６】
上記において、ファイルシステムタイプがＩ／Ｏノードであることを示している場合は、マウント部３０６により、指定されたＩ／Ｏノード上のマウントポイントのパス名とそれに対する計算ノードのマウントポイントのパス名との対応をマウントポイント対応テーブル３０７の空きエントリに登録する。なお、マウントポイント対応テーブル３０７の領域は、計算ノードの起動時にメモリ上に確保する。ただし、Ｉ／Ｏノードからファイルシステム６０を使用できるように、予めシステム管理者がマウントしていることを前提とする。
【００９７】
《ジョブ起動時》
ジョブサーバー１０では、ジョブスケジューラ１０１がＩ／Ｏノード要求情報を作成し、Ｉ／Ｏノードスケジューラ１０２を呼び出す。Ｉ／Ｏノード要求情報には、Ｉ／Ｏノード数と各Ｉ／Ｏノードの占有率、及び計算ノード数、各計算ノードのＩＰアドレス、要求するメモリ容量、実装メモリ容量が含まれる。
【００９８】
ジョブ投入時に、ユーザが、Ｉ／Ｏノード数とその占有率を明示的に要求している場合とそうではない場合がある。明示的に要求している場合は、そのままＩ／Ｏノード数と各Ｉ／Ｏノードの占有率を指定し、他の項目に加える。
【００９９】
明示的に要求されていない場合は、Ｉ／Ｏノード数、占有率をそれぞれ０とし、Ｉ／Ｏノード要求情報とする。Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード要求情報を、ジョブスケジューラ１０１がＩ／Ｏノードスケジューラ１０２を呼び出す際に渡される。まず、Ｉ／Ｏノード要求情報作成部１０２−１０により、ジョブスケジューラ１０１から渡されたＩ／Ｏノード要求情報を参照し、Ｉ／Ｏノード数が０の場合、次の方法により当該ジョブが必要とするＩ／Ｏ資源量を推定し、Ｉ／Ｏノード数と各Ｉ／Ｏノードの占有率を決める。
【０１００】
（１）当該ジョブが要求する計算ノード数と同数のＩ／Ｏノードがある場合、その数をＩ／Ｏノードの要求数とする。同数のＩ／Ｏノードがない場合は、Ｉ／Ｏノード数の整数倍が計算ノード数になるような最大のＩ／Ｏノード数をＩ／Ｏ要求の要求数とする。
（２）当該ジョブが要求する総メモリ容量と使用する計算ノードの実装メモリ容量の合計の比を求める。その比を上記（１）で決定したＩ／Ｏノードの台数で割る。この値を、各Ｉ／Ｏノードの占有率とする。
【０１０１】
次に、Ｉ／Ｏノード確保／解放部１０２−４によりＩ／Ｏノード管理テーブル１０２−２を検索し、利用率が最も低いＩ／Ｏノードから順に要求されたノード数のＩ／Ｏノードを選択する。次に、それらのＩ／Ｏノードのエントリの利用率を要求された割合だけ増加させ、ジョブ管理テーブル１０２−３へ当該ジョブのためのエントリを確保する。割り当てられた計算ノードの番号とそれに対応するＩ／Ｏノード番号、確保した占有率、およびジョブ開始時刻を記録する。
【０１０２】
ただし、要求された占有率と選択したＩ／Ｏノードの利用率の和が１００％を超える場合で、現在の利用率が１００％ではない場合、同テーブルの利用率を１００％に書き換え、ジョブ管理テーブル１０２−３の占有率に確保可能な占有率を記録し、占有率不足分の項目には要求されたが確保できなかった占有率を記録する。現在の利用率が１００％のＩ／Ｏノードがあり、要求した台数分のＩ／Ｏノードが確保できない場合は、その旨のエラーをジョブスケジューラ１０１に返す。
【０１０３】
Ｉ／Ｏノードが確保できた場合は、次に計算ノード毎にＩ／Ｏノード情報を作成する。まず、Ｉ／Ｏノード情報作成部１０２−７により当該ジョブで使用する計算ノード数分のＩ／Ｏノード情報テーブル１０２−８の領域をメモリ上に確保する。ジョブ管理テーブル１０２−３に登録した当該ジョブについて、計算ノード毎に対応するＩ／Ｏノード番号とそのＩＰアドレスを記録する。
【０１０４】
次に、占有率マッピング部１０２−６により、ジョブ管理テーブル１０２−３に登録した当該ジョブの計算ノード毎に、占有率とＩ／Ｏノード管理テーブル１０２−２の当該Ｉ／Ｏノードの最大Ｉ／Ｏスレッド数との関係から、当該ジョブに与えるジョブ最大Ｉ／Ｏスレッド数を計算する。そして、Ｉ／Ｏノード情報作成部１０２−７により、その値をＩ／Ｏノード情報テーブル１０２−８へ記録し、ジョブスケジューラ１０１へ返却する。返却後、Ｉ／Ｏノード情報テーブル１０２−８の領域はジョブスケジューラ１０１により解放される。この後、ジョブスケジューラ１０１は、上記Ｉ／Ｏノード情報を含むジョブ起動に関する情報を各計算ノードへ送信する。
【０１０５】
図８は、ジョブ起動時のＩ／Ｏノードスケジューラ１０２の動作を説明するフローチャートである。ステップＳ１１において、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード要求情報を渡される。ステップＳ１２でユーザが明示的にＩ／Ｏノード数や占有率を指定していないか否かを確認する。Ｉ／Ｏノード数が０、つまりユーザが明示的にＩ／Ｏノード数や占有率を指定していない場合には、Ｉ／Ｏノード要求情報作成部１０２−１０により、Ｉ／Ｏ資源量を推定する（ステップＳ１３、Ｓ１４）。次に、Ｉ／Ｏノード要求情報が確定すると、Ｉ／Ｏノード確保／解放部１０２−４により必要な数のＩ／Ｏノードを選択する（ステップＳ１５）。ただし、必要なＩ／Ｏノード数を確保できるか否かを確認し（ステップＳ１６）、必要なＩ／Ｏノード数を確保できなかった場合には、ジョブスケジューラ１０１へ戻る（ステップＳ１７）。
【０１０６】
必要なＩ／Ｏノード数を確保できた場合には、要求した占有率を確保できるか否かを確認する（ステップＳ１８）。要求した占有率を確保できない場合、使用する占有率を縮小し、確保できる占有率のみを確保する（ステップＳ１９）。続いて、確保できたＩ／Ｏノード、及びその占有率に従って、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３を更新する（ステップＳ２０）。計算ノード毎にＩ／Ｏノード情報を作成する（ステップＳ２１）。その後、ジョブスケジューラ１０１へ復帰し、ジョブスケジューラ１０１が各計算ノードへジョブ起動のための通信を行う際に、Ｉ／Ｏノード情報も含めて送信する（ステップＳ２２）。
【０１０７】
計算ノードでは、ジョブ管理デーモン３０２が通信部３０１によりジョブスケジューラ１０１からジョブ起動のための必要な情報を含むパケットを受信すると、ユーザプロセス３０３を起動する前に、ジョブ毎にＩ／Ｏノード対応テーブル３０５の領域をメモリ上に確保する。Ｉ／Ｏノード対応テーブル３０５へ同パケット内に含まれるＩ／Ｏノード情報を当該ジョブのＪＩＤと共に格納する。
【０１０８】
次に、ジョブ管理デーモン３０２は、当該Ｉ／Ｏノードとの通信のための接続が確立されていない場合は、通信部３０１により接続要求を行う。この結果作成されたソケットをＩ／Ｏノード対応テーブル３０５へ記録する。Ｉ／Ｏノードとの接続が確立されると、ジョブ管理デーモン３０２が通信部３０１により、当該ジョブのユーザＩＤ、グループＩＤ（以下、それぞれ、ＵＩＤ，ＧＩＤともいう。）、補足グループＩＤなどの認証情報、ＪＩＤ、当該ジョブに許される生成可能なＩ／Ｏスレッド数としてジョブ最大Ｉ／Ｏスレッド数、及び初期化情報であることを示す識別子を含む初期化情報を、相互結合ネットワーク４０を介して共通処理デーモン２０２へ送信する。
【０１０９】
Ｉ／Ｏノードについて、Ｉ／Ｏノード内の通信デーモン２０１は、各Ｉ／Ｏノードに１つ存在する。通信デーモン２０１は、計算ノードから接続要求があると、接続確立後、共通処理デーモン２０２を１つ生成し、生成された共通処理デーモン２０２が通信スレッド２０３をスレッド生成部２０２−２により生成する。その後、共通処理デーモン２０２は、通信バッファ２０２−４、ジョブ管理テーブル２０２−７の領域をメモリ上に確保し、受信部２０２−１により当該計算ノードからの受信待ち状態となる。また、通信スレッド２０３は、通信バッファ２０３−２の領域をメモリ上に確保し、プロセス間通信部２０３−３により、Ｉ／Ｏの終了通知に対する受信待ち状態となる。
【０１１０】
共通処理デーモン２０２は、計算ノードから初期化情報を受信すると、プロセス生成部２０２−６によりＩ／Ｏデーモン２０４を生成する。ジョブテーブル操作部２０２−３により生成したＩ／Ｏデーモン２０４のＰＩＤをジョブ管理テーブル２０２−７の対応するＪＩＤのエントリへ登録する。プロセス間通信部２０２−５により、同初期化情報をそのＩ／Ｏデーモン２０４へ送信する。
【０１１１】
生成されたＩ／Ｏデーモン２０４は、Ｉ／Ｏスレッド管理テーブル２０４−３、Ｉ／Ｏバッファ管理テーブル２０４−５、ファイル管理テーブル２０４−８の領域をメモリ上に確保する。Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファを固定長のバッファとして１つ確保して受信待ちを示すフラグを設定し、Ｉ／Ｏ管理テーブル２０４−５へ登録する。次に、スレッド生成部２０４−２により、Ｉ／Ｏデーモン送信スレッド２０６を１つ生成する。そして、確保したバッファを受信領域として、プロセス間通信部２０４−１により共通処理デーモン２０２に対して受信待ち状態となる。生成されたＩ／Ｏデーモン送信スレッド２０６は、待ち合わせ部２０６−２により待ち合わせ状態となる。
【０１１２】
共通処理デーモン２０２から、初期化情報を受信すると、同情報内にある認証情報を元に、実効のユーザＩＤ、グループＩＤ、補足グループＩＤなどを計算ノード上のユーザプロセスと同じ値に設定する。そして、当該ジョブに許される生成可能なＩ／Ｏスレッド数としてジョブ最大Ｉ／Ｏスレッド数をＩ／Ｏスレッド管理テーブル２０４−３に登録する。その後、再度、プロセス間通信部２０４−１により、共通処理デーモン２０２からの受信待ち状態となる。
【０１１３】
なお、ある計算ノードと共通処理デーモン２０２は１対１の関係にある。他の計算ノードから接続要求があった場合は、通信デーモン２０１がその計算ノードと接続を確立し、新たに共通処理デーモン２０２を生成する。
【０１１４】
《ジョブ終了時》
計算ノードでは、ジョブ管理デーモン３０２は、ユーザプロセス３０３がすべて終了したことを検知すると、Ｉ／Ｏノード対応テーブル３０５を参照する。そして、対応するＩ／Ｏノードへジョブ終了通知を示すパケットを送信する。即ち、ジョブ終了通知であることを示すパケット識別子と計算ノード番号、当該ジョブのＪＩＤを格納したパケットを通信部３０１により、対応するＩ／Ｏノードへ送信する。その後、ジョブサーバー１０のジョブスケジューラ１０１へ当該ジョブの終了通知を送信する。
【０１１５】
Ｉ／Ｏノード上では、共通処理デーモン２０２が、ジョブテーブル操作部２０２−３によりジョブ管理テーブル２０２−７を受信パケット内のＪＩＤをキーとして検索する。そして、当該ジョブに対応するＩ／Ｏデーモン２０４を特定し、そのエントリを削除する。それから、Ｉ／Ｏデーモン終了部２０２−８により、Ｉ／Ｏデーモン２０４へ終了シグナルを送信し、Ｉ／Ｏデーモン２０４とその配下のすべてのＩ／Ｏスレッド２０５とＩ／Ｏデーモン送信スレッド２０６を終了させる。この際、確保されていたＩ／Ｏバッファなどの領域もすべて解放される。
【０１１６】
ジョブサーバー１０では、ジョブの終了通知を受信すると、ジョブスケジューラ１０１からＩ／Ｏノードスケジューラ１０２が呼び出され、確保したＩ／Ｏノードの解放処理を行う。この際、終了したジョブのＪＩＤも渡される。Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード確保／解放部１０２−４により、ＪＩＤをキーとしてジョブ管理テーブル１０２−３を検索し、該当するエントリを特定する。次に、使用していたＩ／Ｏノード番号とその占有率を読み取り、Ｉ／Ｏノード管理テーブル１０２−２から、それらのＩ／Ｏノードのエントリを特定する。そして、各利用率から使用していた占有率を減じた後、ジョブ管理テーブル１０２−３の当該エントリを削除する。
【０１１７】
次に、再度、ジョブ管理テーブル１０２−３を検索し、使用していたＩ／Ｏノード番号と同じＩ／Ｏノード番号であり、且つ占有率不足分が０ではないエントリを抽出する。もし、１つも抽出されなかった場合は、Ｉ／Ｏ資源が不足したまま実行されているジョブは存在しないので、Ｉ／Ｏノードスケジューラ１０２はジョブスケジューラ１０１に制御を戻す。
【０１１８】
１つ以上のエントリが抽出された場合は、Ｉ／Ｏスレッド数変更部１０２−９により、それらについてジョブ開始時刻と現在時刻から当該ジョブが起動されてからの経過時間（この値をＴとする）と、占有率不足分に対するジョブ起動時に要求した占有率の比（この値をａとする）を計算する。
【０１１９】
このとき、（Ｔ×Ｔ＋ａ×ａ）が最大になるジョブのＩ／Ｏノードから順に選択し、先に終了したジョブが使用していた占有率をジョブ管理テーブル１０２−３の当該ジョブの当該Ｉ／Ｏノードの占有率に加算し、占有率不足分から減算する。ただし、占有率が１００％を超える場合は、１００％になるまでの値を加算する。次に、Ｉ／Ｏノード管理テーブル１０２−２の当該Ｉ／Ｏノードの利用率にその分を加算する。そして、占有率マッピング部１０２−６により、増加させることができるＩ／Ｏスレッド数を計算する。この時点で、一般に複数のＩ／Ｏスレッド数変更情報（ジョブ番号、計算ノード番号、Ｉ／Ｏノード番号、ジョブ最大Ｉ／Ｏスレッド数の増加分）ができている。
注：（Ｔ×Ｔ＋ａ×ａ）は、ａとＴの直交座標系を考えた場合、その原点からの距離の自乗を意味する。つまり、原点からの距離が最も遠いものを選ぶことが妥当と考えるということである。
【０１２０】
それから、Ｉ／Ｏスレッド数変更情報であることを示すパケット識別子を付加した同情報を、ジョブスケジューラ１０１から各計算ノードへ送信する。ジョブサーバー１０でのジョブ終了処理としては、この時点で終了する。
【０１２１】
図９は、ジョブ終了時のＩ／Ｏノードスケジューラ１０２の動作を説明するフローチャートである。ステップＳ３１において、ジョブスケジューラ１０１は、当該ジョブが使用していたＩ／Ｏノードに関する資源の解放をＩ／Ｏノードスケジューラ１０２に依頼するため、Ｉ／Ｏノードスケジューラ１０２を呼び出す。ステップＳ３２において、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード確保／解放部１０２−４により当該ジョブのＪＩＤからジョブ管理テーブル１０２−３のエントリを特定する。そして、使用していたＩ／ＯノードについてＩ／Ｏノード管理テーブル１０２−２の利用率を更新した後、ジョブ管理テーブル１０２−３の当該エントリを削除する。そして、ステップＳ３３において、他の動作中ジョブの内、占有率が不足しているジョブがあるかどうかを判別する。無ければ、ジョブスケジューラ１０１へ復帰する。ある場合は、ステップＳ３４において解放された占有率を割り当てるべきジョブを決める。ステップＳ３５において、対応する計算ノードへＩ／Ｏスレッド数変更情報を送信する。
【０１２２】
次に、上記パケットを通信部３０１により受信した計算ノード内のジョブ管理デーモン３０２は、パケット識別子からそのパケットがＩ／Ｏスレッド数変更情報であれば、対象となるＩ／Ｏノードの共通処理デーモン２０２へ通信部３０１によりそのまま転送する。
【０１２３】
Ｉ／Ｏノード上では、上記パケットを受信部２０２−１により受信した共通処理デーモン２０２は、受信したパケットのデータが格納されている通信バッファ２０２−４内のＪＩＤを参照する。そのＪＩＤをキーとしてジョブテーブル操作部２０２−３によりジョブ管理テーブル２０２−７を検索し、該当するＩ／Ｏデーモン２０４を特定する。そして、当該Ｉ／Ｏデーモン２０４へ受信したパケットをプロセス間通信部２０２−５により送信する。
【０１２４】
Ｉ／Ｏデーモン２０４は、プロセス間通信部２０４−１により共通処理デーモン２０２から送信されたパケットを受信すると、受信バッファの格納されているバッファに対応するＩ／Ｏバッファ管理テーブル２０４−５のエントリに設定されている受信待ちフラグをクリアする。そして、パケット識別子がＩ／Ｏスレッド数変更情報であれば、Ｉ／Ｏスレッド数変更部２０４−９により、Ｉ／Ｏスレッド管理テーブル２０４−３内のジョブ最大Ｉ／Ｏスレッド数に、受信したパケット内のＩ／Ｏスレッド数変更情報に含まれる「ジョブ最大Ｉ／Ｏスレッド数の増加分」を加算する。
【０１２５】
Ｉ／Ｏバッファ管理テーブル２０４−５を検索し、Ｉ／Ｏ待ちフラグが設定されているバッファが存在するかどうかを調べる。存在する場合、スレッド生成部２０４−２によりジョブ最大Ｉ／Ｏスレッド数を超えない範囲で、新たなスレッドをそのバッファの個数分生成する。Ｉ／Ｏスレッド起動部２０４−７により生成したスレッドを実行させる。この後、生成されたＩ／Ｏスレッド２０５の動作は、Ｉ／Ｏ実行時の動作と同様である。
【０１２６】
《Ｉ／Ｏ実行時》
計算ノード上において、ジョブ内のユーザプロセス３０３からオープン（ｏｐｅｎ）／リード（ｒｅａｄ）／ライト（ｗｒｉｔｅ）／クローズ（ｃｌｏｓｅ）などのＩ／Ｏに関係するシステムコールからＩ／Ｏが発行された場合の処理である。
【０１２７】
ユーザプロセス３０３が呼び出したシステムコールがリード／ライトである場合、一度にＩ／Ｏノードに転送できるサイズ（以下、転送サイズ）と、リード／ライト・システムコールの引数として与えられたユーザ要求Ｉ／Ｏサイズを比較する。ユーザ要求Ｉ／Ｏサイズの方が大きい場合は、転送サイズ毎に分割したサイズをＩ／Ｏサイズとして逐次に処理を行う。
【０１２８】
Ｉ／Ｏリクエスト作成部３０４が計算ノード上で保持する当該ファイルのファイルディスクリプタ（以下、ＦＤ）またはファイルやディレクトリのパス名、カレントディレクトリのパス名、システムコールを呼び出したプロセスのＰＩＤと計算ノードのＩＰアドレス、当該ユーザプロセスが属するジョブのＪＩＤ、認証情報（ユーザＩＤ、グループＩＤ、補足グループＩＤなど）、また、リード／ライトの場合はＩ／Ｏサイズ、現在のファイルオフセット、及びシステムコールの種別（オープン，リード，ライトなど）を示すパケット識別子を格納する。
【０１２９】
次に、ライトの場合は、ライト・データが格納されているメモリのアドレスからＩ／Ｏサイズ分の長さを読み出し、上記パケットの最後に付加する。上記において、ファイルやディレクトリのパス名、およびカレントディレクトリのパス名は、マウントポイント対応テーブル３０７を検索し、計算ノード上においてのパス名に対応するＩ／Ｏノードでのルートファイルシステムからのフルパス名に変換する必要がある。
【０１３０】
そして、Ｉ／Ｏノード対応テーブル３０５を参照し、当該ジョブに対応するＩ／Ｏノードのソケットを特定し、そのソケットを指定して同パケットを送信する。
【０１３１】
Ｉ／Ｏノードでは、共通処理デーモン２０２が、受信部２０２−１により上記パケットを受信する。共通処理デーモン２０２は、受信したパケットのデータが格納されている通信バッファ２０２−４内のＪＩＤを参照する。そして、そのＪＩＤをキーとしてジョブテーブル操作部２０２−３によりジョブ管理テーブル２０２−７を検索し、該当するＩ／Ｏデーモン２０４を特定する。続いて、当該Ｉ／Ｏデーモン２０４へ受信したパケットをプロセス間通信部２０２−５により送信する。
【０１３２】
この後、Ｉ／Ｏデーモン２０４が、プロセス間通信部２０４−１により共通処理デーモン２０２から送信されたパケットを受信すると、受信バッファの格納されているバッファに対応するＩ／Ｏバッファ管理テーブル２０４−５のエントリにＩ／Ｏ待ちフラグを設定して受信待ちフラグをクリアする。そして、Ｉ／Ｏスレッド起動部２０４−７により、同パケット内のジョブ毎に生成可能な最大Ｉ／Ｏスレッド数であるジョブ最大Ｉ／Ｏスレッド数を、Ｉ／Ｏスレッド管理テーブル２０４−３に登録し、同テーブル内の下記ａ，ｂ，ｃの値を参照する。
【０１３３】
（ａ，ｂ，ｃは、それぞれ０以上の整数値）
ａ：ジョブ最大Ｉ／Ｏスレッド数
ｂ：生成済みのＩ／Ｏスレッド数
ｃ：現在Ｉ／Ｏ処理実行中のＩ／Ｏスレッド数
【０１３４】
この際、以下の３通りの条件があり得る。
ｂ＞ｃ−−−〔１〕
ｂ＜＝ｃ，ｂ＜ａ−−−〔２〕
ｂ＞＝ａ−−−〔３〕
【０１３５】
〔１〕の場合、空きスレッドがあるので、Ｉ／Ｏスレッド管理テーブル２０４−３から使用中ではない（Ｉ／Ｏで使用中フラグが設定されていない）Ｉ／Ｏスレッドを１つ選ぶ。それにＩ／Ｏ処理中フラグを設定し、待ち合わせ部２０５−１でＩ／Ｏ要求を待ち合わせているＩ／Ｏスレッド２０５を再実行する。
【０１３６】
〔２〕の場合、空きスレッドは存在しないが、まだ生成可能なので、スレッド生成部２０４−２により新たなスレッドを生成する。これを、Ｉ／Ｏスレッド管理テーブル２０４−３へ登録し、Ｉ／Ｏ処理中フラグを設定する。生成されたスレッドは、一旦待ち合わせ部２０５−１で停止するので、同Ｉ／Ｏスレッド２０５を再実行する。
【０１３７】
〔３〕の場合、空きスレッドがなく、且つ、ジョブ最大Ｉ／Ｏスレッド数に達しているので、これ以上Ｉ／Ｏスレッドを生成することができない状態である。この場合、処理中のＩ／Ｏスレッド２０５が空くまで、Ｉ／Ｏバッファ管理テーブル２０４−５に繋がれたままとなる。
【０１３８】
この後、Ｉ／Ｏデーモン２０４は、再度、共通処理デーモン２０２からの受信待ちのために、Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファ管理テーブル２０４−５を参照し、使用中ではない（使用中フラグが設定されていない）Ｉ／Ｏバッファを検索する。見つからない場合は、新たにＩ／Ｏバッファを１つ確保して受信待ちフラグを設定し、Ｉ／Ｏバッファ管理テーブルへ登録する。見つかれば、そのエントリに受信待ちフラグを設定する。そして、そのＩ／Ｏバッファを受信領域としてプロセス間通信部２０４−１により受信待ち状態となる。ただし、Ｉ／Ｏバッファを確保しようとした際、Ｉ／Ｏバッファ数が最大値に達している場合は、Ｉ／Ｏバッファ待ち合わせ部２０４−６により、使用中のバッファが解放されるまで待ち合わせる。
【０１３９】
Ｉ／Ｏスレッド２０５は、Ｉ／Ｏデーモン２０４から再実行されると、Ｉ／Ｏ部２０５−２により、Ｉ／Ｏバッファ管理テーブル２０４−５を検索する。そして、Ｉ／Ｏ待ちフラグが設定されているＩ／Ｏバッファを１つ選択し、同フラグをクリアし、Ｉ／Ｏ実行中フラグを設定する。次に、同Ｉ／Ｏバッファを参照し、システムコールの種別（オープン，リード，ライトなど）を確認する。
【０１４０】
リード／ライト以外の場合で引数にファイルまたはディレクトリのパス名が指定されるシステムコール（オープンなど）の場合は、ファイルまたはディレクトリのパス名、及びその他の引数を指定し、実際にオープン・システムコールを呼び出す。
【０１４１】
リード／ライトの場合は、既に当該ファイルに対してオープンが実行されているので、Ｉ／Ｏバッファ内に格納されている計算ノードのＩＰアドレス、Ｉ／Ｏを要求したプロセスのＰＩＤと、ＦＤをキーにして、ファイル管理テーブル２０４−８を検索し、対応するＩ／Ｏノード上のＦＤを得る。
【０１４２】
次に、ｌｓｅｅｋシステムコールを用いて、対象ファイルのオフセットを指定された位置に移動させる。そして、ＦＤ、当該Ｉ／ＯバッファのＩ／Ｏデータの格納位置のアドレス、及びＩ／Ｏサイズを指定し、実際にリード／ライト・システムコールを呼び出す。
【０１４３】
オープン／リード／ライト以外の場合で引数にＦＤが指定されている場合は、既に当該ファイルに対してオープンが実行されている。よって、Ｉ／Ｏバッファ内に格納されている計算ノードのＩＰアドレス、計算ノード上Ｉ／Ｏを要求したプロセスのＰＩＤと、ＦＤをキーにして、ファイル管理テーブル２０４−８を検索し、対応するＩ／Ｏノード上のＦＤを得る。次に、指定されたシステムコールの種別に基づいて、必要な引数を指定し、そのシステムコールを実行する。
【０１４４】
次に、システムコールから復帰すると、
オープンの場合、対象ファイルが存在しないなどのエラーが起きていないとき、戻り値としてＦＤが返される。このＦＤを計算ノードのＦＤ、ＩＰアドレス、計算ノード上でＩ／Ｏを要求したプロセスのＰＩＤと共に当該Ｉ／Ｏバッファの所定の位置に格納する。
オープン以外の場合、戻り値とエラーコードを、当該Ｉ／Ｏバッファの所定の位置に格納する。
【０１４５】
その後、Ｉ／Ｏ実行中フラグをクリアし、返却待ちフラグを設定する。そして、Ｉ／Ｏデーモン送信スレッド２０６を再実行させる。再度Ｉ／Ｏバッファ管理テーブル２０４−５を検索し、Ｉ／Ｏ待ちフラグが設定されたＩ／Ｏバッファがあれば、そのフラグをクリアし、Ｉ／Ｏ実行中フラグを設定し、Ｉ／Ｏ処理を行う。Ｉ／Ｏ待ちフラグが設定されたＩ／Ｏバッファがなければ、待ち合わせ部２０５−１により待ち状態となる。
【０１４６】
再実行されたＩ／Ｏデーモン送信スレッド２０６は、Ｉ／Ｏバッファ管理テーブル２０４−５に返却待ちフラグが設定されたＩ／Ｏバッファがあるかどうかを調べる。無い場合は、再度待ち合わせ部２０６−２で待ち合わせ状態になる。返却待ちフラグが設定されたＩ／Ｏバッファがある場合、同フラグをクリアし、プロセス間通信部２０６−１により、共通処理デーモン送信スレッド２０３へ送信する。この際、Ｉ／Ｏバッファ待ち合わせ部２０４−６により、Ｉ／Ｏデーモン２０４がＩ／Ｏバッファが空くのを待ち合わせている場合は、Ｉ／Ｏデーモン２０４を再実行する。
【０１４７】
プロセス間通信部２０３−３により、Ｉ／Ｏデーモン送信スレッド２０６からパケットを受信した共通処理デーモン送信スレッド２０３は、送信部２０３−１により通信バッファ２０３−２に格納されているＩ／Ｏデーモン送信スレッド２０６から受信したデータを、当該計算ノードへ、システムコール返信パケットとして送信する。
【０１４８】
計算ノードでは、上記システムコール返信パケットを通信部３０１により受信する。受信したパケット内のエラー番号を参照し、０以外の値が入っている場合は、何らかのエラーが発生したことを示すので、システムコールの種別によらず、そのエラー番号と戻り値をそのままユーザプロセスへ返して処理を終了する。エラー番号が０である場合で、且つシステムコールの種別がリード／ライト以外である場合で、返却されるデータがある場合は、それをユーザプロセスから指定されたアドレスへコピーし、戻り値をそのままユーザプロセスへ返して処理を終了する。システムコールの種別がリード／ライトである場合、ファイルのオフセットに、戻り値の値を加算し、その戻り値をそのままユーザプロセスへ返して処理を終了する。
【０１４９】
なお、各テーブルやバッファへの参照／追加／更新の際は、排他制御を行い、一貫性を保っている。
【０１５０】
本実施の形態では、図２に示したような複数のＩ／Ｏノード２０−１〜２０−ｍをＩ／Ｏ資源と捉えている。この場合、計算ノードは複数必要だがＩ／Ｏノードは１台のみで十分なジョブもある。一方で、計算ノードと同数のＩ／Ｏノードを必要とするジョブもある。つまり、ジョブによってＩ／Ｏ資源の必要量には本来差がある。そこで、本実施の形態においては、複数のジョブを同時に実行させる場合、ジョブ毎に必要なＩ／Ｏ資源を動的に割り当て、効率的なＩ／Ｏ資源の利用を行っている。
【０１５１】
また、例えば計算ノード数やメモリ容量などの資源は要求量が確保出来なければ実行を開始できない場合もある。しかし、本実施の形態のようにＩ／ＯノードをＩ／Ｏ資源と捉える場合、要求したＩ／Ｏ資源の全てを確保できなかったとしても、ジョブの実行時間が延びることはあっても実行不可能な訳ではない。本実施の形態においては、ジョブスケジューラ１０１は、ジョブが要求したＩ／Ｏ資源を要求量まで確保できない場合でも、そのジョブの実行を開始するというジョブスケジューリングを行っている。さらに、Ｉ／Ｏ資源が不足したまま実行されているジョブに対して、同Ｉ／Ｏ資源に空きができた時点で動的に実行中のジョブ資源を要求値まで拡大するような処理を行って、効率的にＩ／Ｏ資源を利用している。
【０１５２】
図１Ｃは、本実施の形態で使用している効率的なＩ／Ｏ資源の利用方法の説明図である。図１Ｃにおいて、ジョブ＃２の実行を開始した時点では、ジョブ＃１は実行中である。そのため、７５％の占有率をジョブ＃２は要求しているが、一旦確保可能な３３％まで占有率を確保してジョブ＃２の実行を開始する。後刻、ジョブ＃１の実行が終了した時点で、当初要求していた７５％の占有率までＩ／Ｏ資源の占有率を拡大する。これにより、ジョブ＃２の投入と同時に、そのジョブ＃２の実行を開始できるので、無駄のないＩ／Ｏ資源の利用、効率的なＩ／Ｏ資源の利用が可能である。
【０１５３】
本実施の形態による効果について説明する。本実施の形態による第１の効果は、ジョブ投入時点で、他のジョブが実行されているため、要求したＩ／Ｏノードの占有率を割り当てることができない場合でも、それらのジョブが終了して空きができ次第、実行中のジョブの占有率を要求値まで拡大させることができることにある。さらに、このＩ／Ｏノード制御方法では、該当するジョブまたは該当ジョブのＩ／Ｏ処理を停止させる必要がない。
【０１５４】
その理由は、他の実行中のジョブが終了した際、Ｉ／Ｏノードスケジューラ１０２がジョブ管理テーブル１０２−３を参照し、要求した占有率を確保できていない実行中のジョブが存在するかどうかを確認する。存在すれば、計算ノードを経由して当該Ｉ／Ｏノードへ占有率を変更させるパケットを送信する。Ｉ／Ｏノードではこれに基づいて、当該ジョブのＩ／Ｏデーモン２０４がＩ／Ｏスレッド管理テーブル２０４−３内のジョブ最大Ｉ／Ｏスレッド数を変更するという構成になっているためである。
【０１５５】
第２の効果は、必要なＩ／Ｏ資源をジョブ単位で動的に割り当てることができるので、並列計算機システムを複数のジョブで共用する場合でも、ジョブ毎に効率のよいＩ／Ｏ資源の使用ができることにある。その理由は、計算ノードとＩ／Ｏノードの関係が固定されておらず、Ｉ／Ｏノードスケジューラが各ジョブの要求に基づいてＩ／Ｏ資源を動的に割り当てる構成を備えているためである。
【０１５６】
第３の効果は、Ｉ／Ｏの単位時間当たりの処理量（スループット）を損なわず、各ジョブが必要とするＩ／Ｏ資源を使用でき、且つ複数のジョブでＩ／Ｏ資源を効率良く共有することができることにある。その理由は、各Ｉ／Ｏノードの最大Ｉ／Ｏスレッド数を上限として、各Ｉ／Ｏノードの占有率を、要求に応じてジョブ毎に動的に割り当てるためである。
【０１５７】
第４の効果は、Ｉ／Ｏノードに接続されているファイルシステムが過負荷になり、処理が遅延するという問題が起きにくいことにある。その理由は、ジョブ投入時に、使用する各Ｉ／Ｏノードの占有率を宣言し、Ｉ／Ｏノードスケジューラがそれに基づいて、Ｉ／Ｏノードを確保する。当該Ｉ／Ｏノードでは確保された占有率に基づくジョブ最大Ｉ／Ｏスレッド数を超えてＩ／ＯノードからＩ／Ｏが発行されることがないからである。
【０１５８】
第５の効果は、Ｉ／Ｏノードに接続されるファイルシステムが並列ファイルシステムである場合、複数の計算ノードが複数のＩ／Ｏノードを使用することにより、並列Ｉ／Ｏを行うことができることにある。その理由は、並列Ｉ／Ｏが必要なジョブについては、並列Ｉ／Ｏに最適なＩ／Ｏノードの割り当てをそのジョブに対して行うことが可能なためである。
【０１５９】
第６の効果は、Ｉ／Ｏデーモン２０４とその配下のＩ／Ｏスレッド２０５及びＩ／Ｏデーモン送信スレッド２０６においては、Ｉ／Ｏデータをメモリ間でコピーする必要がなく、Ｉ／Ｏデータの受け渡しによるオーバーヘッドが発生しないことにある。その理由は、Ｉ／Ｏデータは、Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ管理テーブル２０４−５で一元管理しており、且つスレッドを使用しているため、Ｉ／Ｏスレッド２０５及びＩ／Ｏデーモン送信スレッド２０６は、Ｉ／Ｏデーモン２０４とメモリを共有できるからである。
【０１６０】
第７の効果は、Ｉ／Ｏノード上で利用できるファイルシステムであれば、たとえ計算ノードがサポートしていないファイルシステムであっても、Ｉ／Ｏノードを介して計算ノードから利用可能になる。このため、使用したいファイルシステムすべてを計算ノード上にインプリメントする必要がなくなり、計算に必要な処理のみに特化した小さなサイズのオペレーティングシステムとすることが可能となる。このため、オペレーティングシステムが占有するメモリなどの資源やシステムのオーバーヘッドを削減できることにある。その理由は、計算ノード上で呼び出されるＩ／Ｏ関係のシステムコールの処理をＩ／Ｏノード上で実行させるため、計算ノードではＩ／ＯドライバやファイルシステムなどのＩ／Ｏ処理のための機能が不要になるからである。
【０１６１】
本発明は、ＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）のような大規模なデータを高速に処理しなければならない分野において、必要な資源の異なる複数のジョブを並列計算機システム上で共用する場合など、Ｉ／Ｏ資源を含む計算資源を分割して使用するような環境で好適に利用できる。
【図面の簡単な説明】
【０１６２】
【図１Ａ】図１Ａは、非効率的なＩ／Ｏ資源の利用方法の説明図である。
【図１Ｂ】図１Ｂは、非効率的なＩ／Ｏ資源の利用方法の説明図である。
【図１Ｃ】図１Ｃは、本実施の形態が使用する効率的なＩ／Ｏ資源の利用方法の説明図である。
【図２】図２は、本発明の一つの実施の形態におけるＩ／Ｏノード制御方式を備えた並列計算機システムの構成図である。
【図３】図３は、本実施の形態におけるＩ／Ｏノード制御方式の詳細構成図である。
【図４】図４は、Ｉ／Ｏノードの占有状況の一例を表した説明図である。
【図５】図５は、Ｉ／Ｏノード管理テーブルの具体例を示す説明図である。
【図６】図６は、ジョブ管理テーブルの具体例を示す説明図である。
【図７】図７は、Ｉ／Ｏバッファ管理テーブルの具体例を示す説明図を示す。
【図８】図８は、ジョブ起動時のＩ／Ｏノードスケジューラの動作を説明するフローチャートである。
【図９】図９は、ジョブ終了時のＩ／Ｏノードスケジューラの動作を説明するフローチャートである。
【符号の説明】
【０１６３】
１０  ジョブサーバー
２０，２０−１〜２０−ｍ  Ｉ／Ｏノード
３０，３０−１〜３０−ｎ  計算ノード
４０  相互結合ネットワーク
５０  制御ネットワーク
６０  ファイルシステム
７０  並列計算機システム
９０−０〜９０−ｎ  Ｉ／Ｏバッファ
１０１  ジョブスケジューラ
１０２  Ｉ／Ｏノードスケジューラ
１０２−１  Ｉ／Ｏノード登録部
１０２−２  Ｉ／Ｏノード管理テーブル
１０２−３  ジョブ管理テーブル
１０２−４  Ｉ／Ｏノード確保／解放部
１０２−５  Ｉ／Ｏノード設定ファイル
１０２−６  占有率マッピング部
１０２−７  Ｉ／Ｏノード情報作成部
１０２−８  Ｉ／Ｏノード情報テーブル
１０２−９  Ｉ／Ｏスレッド数変更部
１０２−１０  Ｉ／Ｏノード要求情報作成部
１０３  既存コンポーネント
２０１  通信デーモン
２０１−１  接続確立部
２０１−２  プロセス生成部
２０２  共通処理デーモン
２０２−１  受信部
２０２−２  スレッド生成部
２０２−３  ジョブテーブル操作部
２０２−４  通信バッファ
２０２−５  プロセス間通信部
２０２−６  プロセス生成部
２０２−７  ジョブ管理テーブル
２０２−８  Ｉ／Ｏデーモン終了部
２０３  共通処理デーモン送信スレッド
２０３−１  送信部
２０３−２  通信バッファ
２０３−３  プロセス間通信部
２０４  Ｉ／Ｏデーモン
２０４−１  プロセス間通信部
２０４−２  スレッド生成部
２０４−３  Ｉ／Ｏスレッド管理テーブル
２０４−４  Ｉ／Ｏバッファ確保部
２０４−５  Ｉ／Ｏバッファ管理テーブル
２０４−６  Ｉ／Ｏバッファ待ち合わせ部
２０４−７  Ｉ／Ｏスレッド起動部
２０４−８  ファイル管理テーブル
２０４−９Ｉ／Ｏスレッド数変更部
２０５  Ｉ／Ｏスレッド
２０５−１  待ち合わせ部
２０５−２  Ｉ／Ｏ部
２０６  Ｉ／Ｏデーモン送信スレッド
２０６−１  プロセス間通信部
２０６−２  待ち合わせ部
３０１  通信部
３０２  ジョブ管理デーモン
３０３  ユーザプロセス
３０４  Ｉ／Ｏリクエスト作成部
３０５  Ｉ／Ｏノード対応テーブル
３０６  マウント部
３０７  マウントポイント対応テーブル
【図１Ａ】
0004569846.tif 000002
【図１Ｂ】
0004569846.tif 000003
【図１Ｃ】
0004569846.tif 000004
【図２】
0004569846.tif 000005
【図３】
0004569846.tif 000006
【図４】
0004569846.tif 000007
【図５】
0004569846.tif 000008
【図６】
0004569846.tif 000009
【図７】
0004569846.tif 000010
【図８】
0004569846.tif 000011
【図９】
0004569846.tif 000012