(57)【特許請求の範囲】
【請求項１】
複数の情報処理装置をネットワークで接続したシステムで、複数のスレッドを含むタスクを複数の情報処理装置に分散させて分散タスクとして実行する負荷分散方法において、
前記複数の情報処理装置の各々が、他の複数の情報処理装置の負荷情報を収集する収集ステップと、
収集した前記負荷情報に基づいて、自装置の負荷が他の装置より高ければ、自装置で動作中の分散タスクを負荷の低い他の装置へ拡張し、自装置の負荷が他の装置より低ければ、負荷の高い他の装置で動作中の分散タスクを自装置へ拡張する分散度制御ステップと、
前記分散タスクを実行中の複数の情報処理装置内で、高い負荷の情報処理装置上で動作しているスレッドを低い負荷の情報処理装置上に移送する移送ステップと
を有することを特徴とする負荷分散方法。
【請求項２】
前記分散度制御ステップでは、更に、収集した前記負荷情報に基づいて、自装置上で動作している分散タスクが負荷の低い装置へ拡張されていれば、当該分散タスクを当該負荷の低い装置へ圧縮し、自装置上で動作している分散タスクが負荷の高い装置へ拡張されていれば、当該分散タスクを自装置へ圧縮することを特徴とする請求項１記載の負荷分散方法。
【請求項３】
前記収集ステップでは、各装置が自装置の負荷情報を定期的にメッセージとして他の装置に回覧するようにし、当該メッセージより負荷情報を収集することを特徴とする請求項１または２記載の負荷分散方法。
【請求項４】
前記収集ステップを、自装置の負荷状態が変化した時点で実行することを特徴とする請求項１または２記載の負荷分散方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は分散した複数の情報処理装置上で動作するタスクを制御する負荷分散方式に関するものである。
【０００２】
【従来の技術】
複数のプロセッサを1台の情報処理装置内にもつマルチプロセッサの情報処理装置上で、それらのプロセッサを有効に活用可能なタスク／スレッドモデルと呼ばれるプログラム形態が提案されている。これは1つのプログラムをスレッドと呼ばれる複数の実行モジュールと、タスクと呼ばれる資源割り当ての単位に分割したモデルである。スレッドはプロセッサ資源の割り当て単位となり、その他の記憶空間資源などはタスクに割り当てられ、タスク内の全てのスレッドに解放されている。このようなタスク／スレッドモデルは、マルチプロセッサの情報処理装置において、プロセッサ資源を効率よく使用するプログラムのためのモデルである。
【０００３】
さらに、通常のタスク／スレッドモデルのプログラム上で利用者空間内でコンテキスト切り換えやスレッド生成等を行なうことが可能な利用者レベルスレッドが提案されている。これは通常のタスク／スレッドモデルのスレッドの生成やコンテキスト切り換え等が、オペレーティングシステムカーネル(OSカーネル)へのシステムコールを必要とし速度が低いという欠点を改善するために考えられた物である。複数のコンテキストを持つことが可能で、かつ利用者空間内でスレッド生成やコンテキスト切り換え等が行なえて高速であることが利点である。このような利用者レベルスレッドに対して、従来のOSカーネルに制御されるスレッドをカーネルレベルスレッドと呼ぶ。
【０００４】
また、特殊な装置を持たずに従来の主記憶管理装置と情報処理装置間のネットワークを制御することによって、複数の情報処理装置上のタスク間で仮想共有記憶を実現する分散仮想共有記憶方式を用いて、そのタスク内の全仮想記憶空間を共有し、その中で複数のスレッドを動作させる分散タスク／スレッドモデルが提案されている。これは、複数の情報処理装置上の各タスク上の全主記憶を分散仮想共有記憶とし、各タスクが1個以上のスレッドを持った1つの分散したタスクと考えたものである。上述のタスク／スレッドモデルにおけるマルチプロセッサの情報処理装置を、複数の情報処理装置とネットワークによる接続に置き換え、これらの分散した資源を効率よく使用するためのものが、分散タスク／スレッドモデルである。また、分散仮想共有記憶はネットワークを固定長のページデータ転送で主に使用し、高速なネットワークを効率よく使用可能となる。
【０００５】
また分散した情報処理装置システムにおいて、各情報処理装置に与えられる負荷が均等ではなく、負荷が集中することを防止するために様々な負荷分散方式が提案されてきた。従来の負荷分散方式では、負荷の高い情報処理装置から負荷の低い情報処理装置に動作中のタスクを移送するタスク・マイグレーションと呼ばれる方法や、負荷の高い情報処理装置上で実行されようとするタスクを負荷の低い情報処理装置で実行する遠隔タスク実行という方法が使用されていた。動作中のタスクを移送してしまうタスク・マイグレーションでは、タスクの状態をすべて完全に異なる情報処理装置に転送してやらなければならない。遠隔タスク実行方式はそのような転送を行なう必要がなく、実行タスク名や実行するための環境や引数など僅かな情報を転送するだけで済むが、一度実行してしまったタスクを移送することができないため、負荷分散の実行を行なえる時点が限られてしまうという欠点がある。
【０００６】
【発明が解決しようとしている課題】
上述のタスク・マイグレーション方式や遠隔タスク実行方式などの負荷分散方式において、どちらの方式も移送時期が異なるだけでタスクを完全に他の情報処理装置に転送して動作させるということには変わりがない。これは、分散した各情報処理装置がすべて同じ処理能力を持つ場合に、分散システム全体の負荷が高い時に、その中で特に負荷の高い情報処理装置上のタスクを負荷の低い情報処理装置上に移送する場合には問題はない。分散システム全体の負荷が低く、全情報処理装置数よりも動作タスク数が少ない場合を考える。このとき、たとえそれらタスクの内で多数のスレッドが生成しているタスクがあり、そのタスクの動作している情報処理装置では負荷が高くなっている場合でも、負荷の低い情報処理装置にタスクを転送することは負荷の移動は行なわれても負荷を均等化することは出来ず、もとの情報処理装置の負荷が低くなるだけである。
【０００７】
つまり、このように動作するタスクが少ない場合に、このようなタスクを完全に転送して動作させる負荷分散方式では、タスクが割り当てられていない情報処理装置を生み処理能力を無駄にしてしまうという欠点がある。
【０００８】
また、各情報処理装置の処理能力が異なっている(各情報処理装置のもつプロセッサ数が異なる場合も含む)ような場合を考える。このとき、各情報処理装置の負荷が均等でなくタスクを移送をしようとする場合に、処理能力の低い情報処理装置上から処理能力の高い情報処理装置への移送は問題がないが、処理能力の高い情報処理装置上から処理能力の低い情報処理装置への移送は次のような問題を生じる。
【０００９】
処理能力の高い情報処理装置Aに負荷が集中し、数個のタスクが動作しており、処理能力の低い情報処理装置Bで動作中のタスクが終了し負荷がなくなった場合、A上のタスクのうち何れかをBへ移送する。この後、Aは処理能力が高いために次々とタスクを実行し終わるが、Bへ移送されたタスクはBの処理能力が低いために延々と動作し続ける。このために、移送せずにAで実行しておけば既に実行が終わっているような逆転現象が起ってしまう。
【００１０】
この様な現象を避けるためには、Bに移送したタスクを再びAに移送することが考えられるが、遠隔タスク実行方式の場合には一度動作してしまったタスクを移送することは出来ないし、タスク・マイグレーション方式の場合でも再びタスク移送を行なうことは処理効率の低下につながる。また逆にA上で動作しているタスクのうち、負荷が軽くBに移送して処理しても処理時間が短くてBで実行させる意味のあるタスクを選択することが考えられるが、そのようなタスクを動作中に選択することは従来の技術では困難である。このようなことを考慮して、通常では処理能力の低い情報処理装置上に積極的にタスクを移送することは考えられてはいなかった。
【００１１】
【課題を解決するための手段】
上記課題を解決するために、本発明によれば、複数の情報処理装置をネットワークで接続したシステムで、複数のスレッドを含むタスクを複数の情報処理装置に分散させて分散タスクとして実行する負荷分散方法に、前記複数の情報処理装置の各々が、他の複数の情報処理装置の負荷情報を収集する収集ステップと、収集した前記負荷情報に基づいて、自装置の負荷が他の装置より高ければ、自装置で動作中の分散タスクを負荷の低い他の装置へ拡張し、自装置の負荷が他の装置より低ければ、負荷の高い他の装置で動作中の分散タスクを自装置へ拡張する分散度制御ステップと、前記分散タスクを実行中の複数の情報処理装置内で、高い負荷の情報処理装置上で動作しているスレッドを低い負荷の情報処理装置上に移送する移送ステップとを備えることを特徴とする。
【００１２】
【実施例】
以下、図面を参照して本発明の実施例を詳細に説明する。
【００１３】
図１は本発明の、分散した情報処理装置を示す図である。各情報処理装置は単独で一般的な情報処理装置として動作することが可能であり、ネットワークによって接続され相互に通信可能である。但し、各情報処理装置が全ての入出力装置を備えている必要はなく、各情報処理装置の処理能力が同じである必要もない。
【００１４】
図２に本発明の負荷分散方式の概念図を示す。201が各情報処理装置(以下ノードと呼ぶ)で相互にネットワークによって接続されている。202がオペレーティングシステムのマイクロカーネルであり、タスクの制御、そのノード内の主記憶の制御、カーネルレベルのスレッド制御などを行なう。203が本負荷分散方式を行なう負荷分散サーバであり、各ノード上のサーバが通信しあい協調して負荷分散を行なう。204が複数のノードにまたがる分散タスクである。205が分散タスク内で動作するスレッドである。206が分散タスクの分散仮想共有記憶を実現する分散仮想共有記憶サーバである。
【００１５】
図３に本発明の負荷分散方式のフローチャートを示す。
【００１６】
本負荷分散方式では、ステップＳ１で、従来の負荷分散方式と同様に各情報処理装置の負荷情報を収集する。ステップＳ２では、ステップＳ１で集めた各情報処理装置の負荷情報が等しいか否か判別し、各情報処理装置の負荷が等しい場合はステップＳ１の処理に移る。集めた負荷情報から各ノードの負荷が均等でなく、高負荷のノードと低負荷のノードが存在した場合に、ステップＳ３の処理に移る。ステップＳ３では、動作中の分散タスクの分散度(分散タスクが動作しているノード数)を制御する。ステップＳ４では、動作中の分散タスク内のスレッドを高負荷のノードから低負荷のノードヘ移送する処理を行う。
【００１７】
分散タスクの分散度の制御には、分散度を大きくすることと、分散度を減らすことの２つの方法がある。分散度を大きくするためには、分散タスクの分散仮想共有記憶空間を他のノード上に拡張し、その上で分散タスク内のスレッドを動作できるようにする。その分散タスクの拡張の概念図を表したのが図４である。
【００１８】
また分散度を減らすためには、分散タスクが既に拡張して動作しているノードからスレッドを全て当該分散タスクの存在する他のノードへ移送し、全スレッドを移送したノードから分散仮想共有記憶での共有をやめる。この分散タスクの圧縮の概念図を表したのが図５である。この分散タスクの拡張と圧縮を行なうことで、本負荷分散方式では分散タスクの分散度の制御を行ない、高負荷のノード上で動作している分散タスクを低負荷のノードに拡張し、さらに高負荷のノード上から分散タスクを圧縮し、分散タスク内でスレッドを移送することで負荷分散を行なう。
【００１９】
対象とする分散システムによって、この分散タスクの拡張と圧縮のどちらかしか行なわなかったり、両方とも行なうことが考えられる。例えば、タスクを生成した際に、そのタスクで必要となる並列度分のノードに分散タスクを拡張して生成するシステムや、分散タスクの動作中に並列度が上がるとすぐに他のノードに分散タスクを拡張するシステムでは、全ノードの負荷を均等化するために負荷分散サーバが分散タスクを圧縮することが必要である。
【００２０】
逆にタスクは自分から分散タスクになり他のノードに分散したり、分散タスクから並列度が上がったからといって、他のノードに拡張したりしないシステムでは、負荷分散サーバが各ノードの負荷を分散させるために分散タスクの拡張を行なう。この場合、分散タスクの圧縮を行なわず各ノードの負荷が一様に高くなった場合には分散タスクの拡張を抑制するだけでも良いが、分散タスクの圧縮も行なうようにすればより負荷分散の効果が上がる。
【００２１】
図３のフローチャートでは負荷情報の収集が負荷分散と同じ流れで示されているが、図６のように別の流れで行なうことも可能である。図６のステップＳ１からステップＳ４は図３のステップＳ１からステップＳ４と同じ処理を行っているので、ここでは説明を省略し、ステップＳ５からステップＳ７について説明する。ステップＳ６では、ステップＳ１で収集した各情報処理装置の負荷情報を記録するか、負荷情報を負荷分散スレッドに通知する処理を行う。ステップＳ７では一定時間待機して、ステップＳ１の処理に戻る。ステップＳ５では、前記収集された負荷情報をチェックする。次のステップＳ２からステップＳ４は図３のステップＳ２からステップＳ４の処理を実行する。即ち、収集した負荷情報は負荷分散を行なうスレッドと負荷情報の収集を行なうスレッドの両方が参照可能な記憶装置に記録することや、収集した負荷情報をメッセージなどによって転送する方法などがある。
【００２２】
（第２の実施例）
上記の実施例では、負荷分散を行なうサーバが集中して意志決定を可能な場合を述べたが、本実施例では分散して自律的に負荷分散を行なう場合について述べる。
【００２３】
図７に本実施例の負荷分散方式のフローチャートを示す。
【００２４】
ステップＳ７１では、各負荷分散サーバは自ノードの負荷についての情報を監視し、自ノードの負荷が低下したり、負荷が上昇した場合にはステップＳ７２の処理に移る。負荷分散を行なおうとする。ステップＳ７１で負荷が変化していないと判断された場合は、ステップＳ７１の処理に戻る。ステップＳ７２では、他の情報処理装置の負荷情報を収集する。ステップＳ７３では、自情報処理装置の負荷情報が、ステップＳ７２で収集した他の情報処理装置の負荷情報より高いと判断された場合は、ステップＳ７５の処理に移る。ステップＳ７５で動作中の分散タスクがないと判断された場合は、ステップＳ７６の処理に移り、ステップＳ７６では、低負荷のノードへ分散タスクを拡張する処理を行う。ステップＳ７４で、自情報処理装置の負荷情報が、ステップＳ７２で収集した他の情報処理装置の負荷情報より低いと判断された場合は、ステップＳ７７の処理に移る。ステップＳ７７では動作中の分散タスクあるか否か判断し、なければステップＳ７８で、高負荷のノードから分散タスクを拡張する。ステップＳ７６とステップＳ７８の処理の実行後ステップＳ７９に移る。ステップＳ７９では、分散タスク内のスレッドを高負荷のノードから低負荷のノードに移送する。
【００２５】
本実施例では、各負荷分散サーバは基本的に自ノードの負荷についての情報を監視し、自ノードの負荷が低下したり、負荷が上昇した場合に負荷分散を行なおうとする。負荷分散を行なうか行なわないかの決定は、自ノードの負荷に対して閾値を設けておく方法がある。閾値は一つである必要はなく2つ持っておくことも可能である。この場合、上下の閾値について現在の負荷と比較して、上の閾値より負荷が上がった場合には自ノードの負荷をさげようとし、下の閾値より負荷が下がった場合には自ノードの負荷を上げようとして、負荷分散を計る。
【００２６】
自ノードの負荷を下げるためには、他のノードの負荷情報を収集して自ノードよりも負荷の低いノードを探す。そして、自ノード上に動作中の分散タスクが存在し、その分散タスクが自ノードより負荷の低いノードに拡張していたならば、その分散タスク内のスレッドを自ノードから負荷の低いノードに移送する。
【００２７】
また、自ノードで分散タスクが動作していなかったり、分散タスクはあるが自ノードよりも負荷の高いノードに拡張している場合には、自ノードで動作しているタスクや分散タスクを負荷の低いノードに拡張してから、その低いノードへスレッドを移送する。このような方法で自ノードの負荷を他のノードへと分散できる。
【００２８】
この自ノードの負荷を他のノードに分散する場合には、自ノードのタスクを拡張するだけでなく、動作中の分散タスクで負荷の低いノードに拡張しているものを、そのノードへ自ノードから分散タスクを圧縮してしまうことも考えられる。この場合は、システム全体の負荷が高い場合に分散タスクが拡張ばかりでなく圧縮されるので、分散仮想共有記憶を保持するための処理の負荷が減少し、ネットワークによるメッセージ転送が減少し、システム全体の処理能力は上がる。
【００２９】
逆に自ノードの負荷が低下し、自ノードの負荷を上げようとする場合には、他のノードの負荷情報を収集して自ノードよりも負荷の高いノードを探す。そして自ノードの負荷を下げる場合と同様に、分散タスクを負荷の高いノードから拡張や負荷の低いノードへの分散タスクの圧縮をして、スレッドを負荷の高いノードから移送してくることによって負荷の分散が計れる。
【００３０】
さらに本実施例では負荷分散を行なおうとして必要になった時にはじめて他のノードの負荷情報を収集する方式を説明したが、定期的に自ノードの負荷情報を他のノードに伝達することによって、負荷情報を収集する方式も考えられる。
【００３１】
（第３の実施例）
以上の実施例では高い負荷のノードから低い負荷のノードへスレッドの移送を行なっていたが、分散タスク上で利用者レベルのスレッドの管理機構を用いることによって利用者レベルスレッドをコンテキストスイッチングを利用してノード移動を可能とし、それでスレッド移送を行なわずに分散タスク内の負荷を移動することが可能である。この場合には図８のように、分散タスク内の負荷の低いノード上にカーネルレベルスレッドを生成し、負荷の高いノード上で動作している利用者レベルスレッドに移動要求を出して、移動したあとに負荷の高いノード上のカーネルレベルスレッドを停止することで負荷分散が行なえる。
【００３２】
また、利用者レベルスレッドの管理機構が空きカーネルレベルスレッドを自動的に探して割り当てる方式の場合には、利用者レベルスレッドに移動要求を出す必要もなくなる。この場合は分散タスクに割り当てるカーネルレベルスレッドの数をノード毎に制御することによって負荷分散が行なえることになる。さらに、ある分散タスクのひとつのノードに割り当てるカーネルレベルスレッド数を零にすると決めた場合に、分散タスクの圧縮を行なえば良い。この場合の負荷分散方式の流れ図を図９に示す。図９のステップＳ７１からステップＳ７８までの処理は、図７のステップＳ７１からステップＳ７８の処理と同じであるので、ここでは説明を省略する。自ノードの負荷が他ノード負荷より低いと判断された場合は、ステップＳ８０の処理に移り、ステップＳ８０では自ノード上のカーネルスレッドを増やす処理を実行する。自ノードの負荷が他ノード負荷より高いと判断された場合は、自ノード上のカーネルスレッドを減らす処理を実行する。
【００３３】
【発明の効果】
以上説明したように、本発明によれば、複数の情報処理装置をネットワークで接続したシステムで、複数のスレッドを含むタスクを複数の情報処理装置に分散させて分散タスクとして実行する際に、複数の情報処理装置の各々が、他の装置の負荷情報を収集し、収集した負荷情報に基づいて自装置の負荷が他の装置より高ければ、自装置で動作中の分散タスクを負荷の低い他の装置へ拡張し、自装置の負荷が他の装置より低ければ、負荷の高い他の装置で動作中の分散タスクを自装置へ拡張して、分散タスクを実行中の複数の情報処理装置内で、高い負荷の情報処理装置上で動作しているスレッドを低い負荷の情報処理装置上に移送するようにしたので、複数のスレッドを含むタスクを複数の情報処理装置に分散させて分散タスクとして実行中に、複数の情報処理装置上の負荷が分散され、システム全体としての処理能力を充分に活用することが可能となる。
【００３４】
また、各装置の負荷情報を定期的にメッセージとして回覧することで、効率的な負荷情報を収集することができる。また、自装置の負荷状態が変化し、実際に分散タスクの拡張やスレッドの移送を行なわなければならない状態になってはじめて、他の情報処理装置の負荷情報を収集することで、効率的な負荷情報の収集が行える。
【図面の簡単な説明】
【図１】本発明の負荷分散方式を用いる分散した情報処理装置の構成図である。
【図２】本発明の負荷分散方式の概念図である。
【図３】本発明の負荷分散方式のフローチャートである。
【図４】分散タスクの拡張と圧縮について示した図である。
【図５】分散タスクの拡張と圧縮について示した図である。
【図６】負荷情報の収集を別のスレッドで行なう場合のフローチャートである。
【図７】負荷分散を分散したノード上で自律して行なう場合のフローチャートである。
【図８】カーネルレベルスレッドと利用者レベルスレッドの関係を示す図である。
【図９】利用者レベルスレッドの移動を用いた場合の負荷分散方式のフローチャートである。
【符号の説明】
１０１  情報処理装置
１０２  ネットワーク
２０１  情報処理装置
２０２  マイクロカーネル
２０３  負荷分散サーバ
２０４  分散タスク
２０５  スレッド
２０６  分散仮想共有記憶サーバ
【図１】
0003696901.tif 000002
【図２】
0003696901.tif 000003
【図３】
0003696901.tif 000004
【図４】
0003696901.tif 000005
【図５】
0003696901.tif 000006
【図６】
0003696901.tif 000007
【図７】
0003696901.tif 000008
【図８】
0003696901.tif 000009
【図９】
0003696901.tif 000010