以下、図面を参照して本発明の実施例について説明する。
本発明の実施例では、仮想マシン(VM)のマイグレーションにおいて複数のVMのデータを移動させるときの移動順序を決定するデータ移動順序決定装置について説明する。VMのマイグレーションとは、VMのメモリデータを移行先のサーバにコピーする作業のことを言う。VMのライブマイグレーションとは、VMのマイグレーションの一種であり、サーバ上で稼働しているVMを稼働させたまま別のサーバ(例えば、バックアップ用サーバ)に移動(コピー)させることを言う。
図1は、マイグレーションのフェーズを示す図である。マイグレーションには、初期コピー、更新コピー、及び最終更新コピーの3つのフェーズが存在する。マイグレーションを開始した後、初期コピーフェーズで開始時のデータを最初にコピーする。その間、VMは稼働しているため、データの書き換えが行われる。その書き換えられたデータを更新コピーフェーズで送信する。そして、あるタイミングでVMの稼働を停止し、最終更新コピーフェーズで残りの更新データを送信する。
例えば、物理プラットフォームの負荷が高く、物理プラットフォーム上で稼働しているVMの少なくとも一部を別の物理プラットフォームに移動させる場合、物理プラットフォームの負荷を速く軽減させる必要がある。本発明の実施例に係るデータ移動順序決定装置は、短時間で物理プラットフォームの負荷を軽減できるVMを優先して移動させるように、データの移動をスケジューリングする。
図2は、本発明の実施例に係るデータ移動順序決定装置100の機能ブロック図である。データ移動順序決定装置100は、負荷管理部105と、データ分類部110と、移動順序決定部120とを有する。
負荷管理部105は、VMのデータを用いて処理を実行する物理プラットフォームの負荷を管理する。また、負荷管理部105は、VMのデータ量を管理してもよい。一般的に、VMのデータは、複数のサブデータから構成される。負荷管理部105は、VMのデータ量をサブデータ単位で管理してもよい。なお、VMのデータ構造については、以下に詳細に説明する。物理プラットフォームの負荷は、CPU負荷又はメモリ負荷等でもよく、これらの負荷を重み付けして組み合わせた値が用いられてもよい。
負荷管理部105は、複数の物理プラットフォームの負荷、データ量等の情報を一元的に管理してもよい。図3は、負荷を一元的に管理する場合のシステム構成を示す図である。例えば、負荷管理部105は、物理プラットフォームとは別の負荷管理コントローラに含まれる。物理プラットフォームの情報は、物理プラットフォームに存在する負荷管理機能を用いて収集され、C-Planeを介して物理プラットフォームと負荷管理コントローラとの間で情報が交換される。負荷管理コントローラが物理プラットフォームの負荷の平滑化の指示を受けた場合、又はある物理プラットフォームの負荷が閾値を超えた場合、負荷管理部105は、物理プラットフォームの負荷、或いは、物理プラットフォームの負荷とサブデータのデータ量に基づいて、負荷を平滑化するように移行対象のVMを決定する。その後、以下に説明するようにデータの移動順序が決定される。
また、負荷管理部105は、複数の物理プラットフォームのそれぞれにおいて負荷、データ量等の情報を分散して管理してもよい。図4は、負荷を分散管理する場合のシステム構成を示す図である。例えば、負荷管理部105は、各物理プラットフォームに含まれる。各物理プラットフォーム上の負荷管理部105は、自身の物理プラットフォームの負荷、データ量等の情報を収集し、他の物理プラットフォームと情報を交換する。物理プラットフォームの負荷の平滑化の指示を受けた場合、又は自身の物理プラットフォームの負荷が閾値を超えた場合、負荷管理部105は、物理プラットフォームの負荷、或いは、物理プラットフォームの負荷とサブデータのデータ量に基づいて、負荷を平滑化するように移行対象のVMを決定する。その後、以下に説明するようにデータの移動順序が決定される。
図5は、負荷管理部105において移行対象のVMを決定する方法のフローチャートである。この例では、図3に示すように負荷が一元的に管理される例を用いるが、図4に示すように負荷が分散管理される場合にも適用可能である。ステップS11において、負荷分散コントローラの負荷管理部105は、物理プラットフォームの負荷の平滑化の指示を受ける。ステップS12において、負荷管理部105は、負荷情報を参照し、移行対象のVMを予め設定された方法に従い選択する。
図6は、移行対象のVMを選択する例を示す図である。例えば、負荷管理部105は、物理プラットフォームA、B、C上で稼働する仮想マシンVM1〜VM10のデータサイズ及びCPU負荷を負荷管理テーブルの形式で管理する。ここで、物理プラットフォームAの合計負荷は13であり、物理プラットフォームBの合計負荷は8であり、物理プラットフォームCの合計負荷は28である。したがって、システム全体の負荷は13+8+28=49である。負荷を平均化する場合は、1台当たり負荷がシステム全体の負荷を物理プラットフォームで割った数である49/3=16.3に近くなるようにVMを移動する。但し移動対象のVMの数はなるべく少ない方が好ましいため、データサイズが考慮されてもよい。この例では、物理プラットフォームCのVM8を物理プラットフォームBへ、物理プラットフォームCのVM9を物理プラットフォームAへ移動することで、負荷が平滑化される。移動順序については以下に詳細に説明するが、VM8とVM9を比較すると、VM8の方の負荷が大きいため、VM8の移動を優先させるような順序コストの重み付けが行われる。なお、負荷が同じである場合は、データサイズの小さい方(すなわち、移動が速く終了する方)を優先して移動させるような順序コストの重み付けが行われる。
図7は、移行対象のVMを選択する別の例を示す図である。図7(A)に示すように、負荷管理部105は、図6を用いて説明した負荷管理テーブルを1つのテーブルで管理してもよい。この例では、負荷管理部105が負荷を平滑化するために20の負荷を削減する必要があることが決定されたと仮定する。負荷管理部105は、移行対象のVMを選択するために、図7(B)に示すように、データサイズの昇順にソートし、例えばデータサイズが小さい上位2つであるVM1及びVM8を選択する。これは、移行が速く終了するVMを選択することに相当する。また、負荷管理部105は、移行対象のVMを選択するために、図7(C)に示すように、CPU負荷の降順にソートし、例えばCPU負荷が大きい上位2つであるVM10及びVM8を選択する。これは、CPU負荷が重く移行が必要となるVMを選択することに相当する。選択されたVM1、VM10、VM8の負荷の合計は、22である。このように、負荷管理部105は、データサイズ及びCPU負荷に基づいて、例えば両者の上位2つを選択することで、20の負荷を削減することができる。なお、負荷管理部105は、CPU負荷に加えてメモリ負荷等も管理し、CPU負荷とメモリ負荷とを組み合わせた負荷を用いて移行対象のVMを選択してもよい。また、移行対象のVMを選択する際に、CPU負荷が同じVMの場合は、メモリ負荷の重い方を優先してもよい。
その後、図5のステップS13において、負荷分散部105は、移行対象のVMとその移行先の物理プラットフォームを各物理プラットフォームに通知する。ステップS14において、通知を受けた物理プラットフォームは、移行対象のVMの情報を受信する。ステップS15において、物理プラットフォームは、移行対象のVMに対し、負荷を速く軽減するための移動順序を決定する。移動順序の決定方法は、以下に詳細に説明する。ステップS16において、物理プラットフォームは、ステップS15において決定された移動順序に従って、移行対象のVMを通知された移行先の物理プラットフォームへと送信する。なお、図5では、移行対象のVMの通知を受けた物理プラットフォームが移動順序を決定しているが、負荷分散コントローラが移動順序を決定し、各物理プラットフォームに移動順序を通知してもよい。また、各物理プラットフォームの負荷管理部105が移行対象のVMを決定してもよい。
図8は、負荷管理部105において移行対象のVMを決定する方法のフローチャートである。この例では、図3に示すように負荷が一元的に管理される管理の例を用いるが、図4に示すように負荷が分散管理される場合にも適用可能である。ステップS21において、負荷管理部105は、オペレータ、オーケストレータ等から負荷の閾値を受け取り、VMの組み合わせのうち、負荷が閾値を越える組み合わせを選択する。ステップS22において、負荷管理部105は、選択した組み合わせのうち、送信するデータ量の総量が最小の組み合わせを選択する。
図9は、移行対象のVMを選択する例を示す図である。ここでは、負荷の閾値が8であると仮定する。負荷の閾値を超えるVMの組み合わせは、{VM1,VM2,VM3,VM4}、{VM1,VM2,VM3}、{VM1,VM2,VM4}、{VM2,VM3,VM4}、{VM1,VM2}、{VM2,VM3}である。このうち、データ量が最小である組み合わせは{VM1,VM2}である。このため、負荷管理部105は、物理プラットフォームにVM1,VM2の移行を指示する。
その後、図8のステップS23において、負荷分散部105は、選択した組み合わせに含まれるVMとその移行先の物理プラットフォームを各物理プラットフォームに通知する。以降は、図5と同様に、物理プラットフォームは、移行対象のVMに対し、負荷を速く軽減するための移動順序を決定し、物理プラットフォームは、決定された移動順序に従って、移行対象のVMを通知された移行先の物理プラットフォームへと送信する。図8においても、負荷分散コントローラが移動順序を決定し、各物理プラットフォームに移動順序を通知してもよい。また、各物理プラットフォームの負荷管理部105が移行対象のVMを決定してもよい。
次に、移動順序の決定方法について詳細に説明する。
一般的に、VMのデータは、複数のサブデータから構成され、複数のサブデータは、VM間で共通する共通データ(OS等)と、VMに固有の固有データに分類される。固有データは、アプリケーションが処理を行う際に使用する一時データなどを含む。説明の便宜上、VMのデータをノードと呼ぶことがあり、サブデータをリンクと呼ぶことがある。また、共通データを中間リンクと呼ぶことがあり、固有データを葉リンクと呼ぶことがある。
データ分類部110は、マイグレーションの対象となるVMのサブデータに関する情報を取得し、VMのサブデータを、複数のVMで共通する共通データ(すなわち、中間リンク)と、VM固有の固有データ(すなわち、葉リンク)とに分類する。図10に、VMのデータ構造例を示す。例えば、VM間で共通するサブデータa〜iは中間リンクに分類され、VMに固有のサブデータ1〜4は葉リンクに分類される。VM固有の情報や一時データは葉リンクに分類される。また、マイグレーションの更新コピーフェーズ及び最終更新コピーフェーズで送信される更新データも葉リンクに分類される。更に、データ分類部110は、データ量に基づき中間リンク及び葉リンクのコストを算出する。例えば、コストはデータ量や転送時間に比例する値に設定される。
移動順序決定部120は、共通データ及び固有データのデータ量と、物理プラットフォームの負荷とに基づいて、共通データと固有データの移動順序を決定する。このとき、物理プラットフォームの負荷を速く軽減できるようなスケジューリングを行う。移動順序の決定においては、負荷が大きいVMを負荷が小さいVMより優先する。また、データ量の小さいVMをデータサイズの大きいVMより優先してもよい。さらに、移動順序の決定においては、中間リンクを葉リンクより優先する。葉リンクに含まれる一時データは処理に伴い頻繁に更新されるため、この部分をマイグレーションの中間部分で送信すると、大量に更新されたデータを送信することになり、マイグレーション時間の増加につながるため、葉リンクはノード内においては最後に送信する。また、葉リンクの中でも更新頻度が大きいデータほど最後に送信する。なお、以下の移動順序の計算においても、葉リンクの移動順序がノード内において最後になるようにする。
また、移動順序決定部120は、物理プラットフォームの負荷と、中間リンク及び葉リンクのデータ量(コスト)と、中間リンクを有するノード数と、固有データの変更頻度とのうち少なくとも1つによって重み付けを行い、移動順序を決定する。具体的には、移動順序決定部120は、ノードのデータ移動を完了するまでに要する順序コストを算出し、順序コストが小さくなるようデータの移動順序をスケジューリングするが、このスケジューリングのときに、負荷を考慮しつつ、中間リンクを葉リンクより優先する。順序コストは、優先して移動させるものほど順序コストが小さくなるよう、重み付けが行われる。
順序コストの算出方法には、以下に詳細に説明するように、ノード単位で順序コストを算出する方法と、リンク単位で順序コストを算出する方法がある。重み付けは、移動するノード/リンクのコスト算出時、自ノード/リンクを含む未移動のノード/リンク(残ノード/リンクと呼ぶ)に対応する物理プラットフォームの負荷を乗じた重み付けを行う。例えば、先にコストの大きいリンクを移動すると、そのリンク移動後の残ノード数は大きくなり、順序コストも大きくなることから、そのような移動は優先されなくなる。
<ノード単位の順序コストの算出方法の概要>
移動順序決定部120におけるノード単位の順序コスト算出について説明する。まず、移動順序決定部120は、データの移動順序、すなわち、データ移動を行うノード順序を複数仮定する。例えば、図10のデータ構造例の場合、複数のノード順序が考えられる。その中で、VM1、VM2、VM3、VM4の順でデータ移動を行う場合の順序コストについて説明する。
VM1のデータを移動させるときの順序コストは、VM1内の未移動のサブデータのコストと、VM1を含む未移動のノードの負荷とに基づいて算出される。VM1のコスト(移動データ量)は、{a,b,c,d,1}のサブデータを移動するため、2+1+3+2+1=9である。この時、残ノードの負荷(自ノードも含め、未移動のノードはVM1、VM2、VM3、VM4であり、負荷は3+5+2+7=17)を乗じて、順序コストは9×17=153とする。次に、VM2のコストを算出するが、VM2の中のa,dはVM1の移動で既に移動しているため、{f,g,2}=1+2+2=5である。この時、残ノードの負荷5+2+7=14を乗じて順序コストは5×14=70となる。同様にVM3の順序コストは({e,3}=4+3)×9=63となり、VM4の順序コスト({h,i,4}=3+2+2)×7=49となる。従って、VM1、VM2、VM3、VM4でデータ移動する順序コストは、153+70+63+49=335である。
移動順序決定部120は、他のノード順序でデータ移動を行うときの順序コストも算出し、算出した順序コストの中で最も順序コストが小さくなる移動順序を決定する。順序コストは、全ての移動順序に対して算出してもよいが、以下に詳細に説明するように、順序コストの算出を進める候補を選択してもよく、順序コストの算出を途中で中断してもよい。
図11は、ノード単位の順序コスト算出例である。説明を簡単にするために、図11(A)に示すデータ構造を仮定する。ノードn1、n2、n3、n4のリンクの中で、a、bは中間リンクであり、c、d、e、fは葉リンクである。それぞれのコストは中間リンク及び葉リンクに示されており、負荷はノードの下に示されている。
このときの順序コストの算出過程を図11(B)に示す。図11(B)において、各ボックス内の{n1,n2,…}は移動するノードの順序であり、a,c,d,…は転送するリンクの順序である。また、図11(B)の最も下の行には、順序コストの算出の基礎となるコストの値を示す。
{n1}の順序コストは(リンクa,cのコスト)*(n1を含む残ノードの負荷)=5*6=30として計算できる。{n1,n2}の順序コストは{n1}の順序コスト+(追加したリンクdのコスト)*(n2を含む残ノードの負荷)=30+(1*4)=34として計算できる。{n1,n2,n3}の順序コストは{n1,n2}の順序コスト+(追加したリンクb,eのコスト)*(n3を含む残ノードの負荷)=34+(6*2)=46として計算できる。{n1,n2,n3,n4}の順序コストは{n1,n2,n3}の順序コスト+(追加したリンクfのコスト)*(n4を含む残ノードの負荷)=46+(3*1)=49として計算できる。同様に順序コストの算出を進めると、最も順序コストが小さくなる移動順序は、{n2,n1,n3,n4}であることが分かる。
順序コストの算出は、図11の行毎に行ってもよく、列毎に行ってもよい。言い換えると、行毎の算出とは、あるノード順序{n1,n2,n3,n4}の順序コストを算出する過程において、同じ階層(順序コストを算出したノード数)まで別のノード順序{n2,n1,n3,n4}の順序コストを算出する方法である。また、列毎の算出とは、あるノード順序{n1,n2,n3,n4}を計算し終えた後に、別のノード順序{n1,n2,n4,n3}を計算する方法である。
図12は、行毎にノード単位の順序コストを算出する方法のフロー例である。移動対象となるノードの数を階層数とする。例えば、4ノードの場合、階層数は4であり、階層L=4のときに最下層である。
まず、ステップS101において、階層L=1とする。ステップS102において、階層Lにおける各ノードの順序リストを更新する。例えば、階層L=1でn1を選定していたならば、階層L=2の未選定ノードはn2,n3,n4である。n2を次ノードと選定すると、階層L=1の順序リスト{n1}を{n1,n2}に更新する。ステップS103において、各順序リストにおける順序コストを算出する。順序コスト=(階層L-1の順序コスト)+(次ノードを移動完了するためのコスト)*(次ノードを含む未選定ノードの負荷)である。例えば、順序リスト{n1,n2}ならば、順序コスト=({n1}の順序コスト)+(次ノードn2のコスト)*(n2の負荷+n3の負荷+n4の負荷)である。ステップS104において階層Lが最下層でない場合、ステップS105において階層L+1としてステップS102に戻る。ステップS104において階層Lが最下層である場合、ステップS106において最小順序コスト及びそのときの順序リストを出力する。
図12は、全ての順序コストを算出する例を示しているが、順序コストを算出する過程において順序コストの算出を中断して計算量を削減することも可能である。図13は、ノード単位の順序コスト算出において計算量を削減する例を示す。図13(A)のデータ構造は図11(A)のデータ構造と同じである。
あるノード順序{n1,n2,…}で順序コストを算出する過程{n1,n2}において、途中まで順序コストを算出したノードn1,n2と同一のノードが別のノード順序{n2,n1,…}において算出されており且つ途中まで算出した順序コスト34が別のノード順序において算出された順序コスト30を上回った場合、順序コストの算出を中断することができる。なお、順序コストが同じである場合には、どちらかの順序コストの算出を進める。これは、図12のステップS103において、階層Lにおいて順序コストを算出したノードの組み合わせが同一になった場合、最小コスト以外は順序リスト更新の対象から除外することで実現できる。
図14は、図13に従ってコスト算出を進めた結果である。例えば、{n1,n2}のノード順序で移動したときの順序コストは34であり、同じノードの組み合わせである{n2,n1}のノード順序で移動したときの順序コストは30である。そのため、コストが少ない{n2,n1}のノード順序に対して順序コストの算出を進める。図14において、ハッチングが同じ箇所は同じノードの組み合わせとなっており、このうち、順序コストが少ない順に次の階層の計算を行う。また、図14において、順序コストの算出を進めるものを、太線の枠で示す。最終的に、最適解である順序コスト45及び順序リスト{n2,n1,n3,n4}が出力される。
上記のように総当たりで順序コストを算出すると計算量が大きくなると想定される。従って、順序コストを算出する過程において、途中まで算出した順序コストに基づいて、順序コストの算出を進める候補を選択して、選択された候補に対して順序コストの算出を進めてもよい。図15は、ノード単位の順序コスト算出において計算量を削減する例を示す。図15においても図11(A)のデータ構造の例が用いられる。
行毎にノード単位の順序コストを算出する過程において、ある階層において順序コストが少ない順に、順序コストの算出を進める候補を選択する。例えば、ある階層L=1において順序コストが少ない2つのノード順序{n1}、{n2}のみ次の階層L=2の順序コストを算出する。同様に、階層L=2において順序コストが少ない2つのノード順序{n1,n2}、{n1,n3}のみ次の階層L=3の順序コストを算出する。これは、図12のステップS103において、階層Lにおいて順序コストが少ない上位の2つ以外は順序リスト更新の対象から除外することで実現できる。この場合、最適解が得られない可能性があるが、準最適解が短時間で算出できる。
図16は、列毎にノード単位の順序コストを算出する方法のフロー例である。移動対象となるノードの数を階層数とする。例えば、4ノードの場合、階層数は4であり、階層L=4のときに最下層である。
まず、ステップS201において、階層L=1とする。ステップS202において、階層Lに未選定ノードがある場合、ステップS203において未選定ノードから次ノードを選択し、順序リストを更新する。例えば、階層L=1でn1を選定していたならば、階層L=2の未選定ノードはn2,n3,n4である。n2を次ノードと選定すると、階層L=1の順序リスト{n1}を{n1,n2}に更新する。ステップS204において、順序リストにおける順序コストを算出する。順序コスト=(階層L-1の順序コスト)+(次ノードを移動完了するためのコスト)*(次ノードを含む未選定ノードの負荷)である。例えば、順序リスト{n1,n2}ならば、順序コスト=({n1}の順序コスト)+(次ノードn2のコスト)*(n2の負荷+n3の負荷+n4の負荷)である。ステップS205において階層Lが最下層でない場合、ステップS206において階層L+1としてステップS202に戻る。ステップS205において階層Lが最下層である場合、ステップS209において最小順序コスト及びそのときの順序リストを更新する。更に、ステップS210において階層L-1としてステップS202に戻る。
ステップS202において階層Lに未選定ノードがなく、階層L=1でない場合、1つ上の階層に戻って順序コストを計算するため、ステップS210において階層L-1としてステップS202に戻る。ステップS202において階層Lに未選定ノードがなく、階層L=1である場合、全ての順序コストの算出が完了したので、ステップS208において最小順序コスト及びそのときの順序リストを出力する。
図16は、全ての順序コストを算出する例を示しているが、順序コストを算出する過程において順序コストの算出を中断して計算量を削減することも可能である。図17は、ノード単位の順序コスト算出において計算量を削減する例を示す。図17においても図11(A)のデータ構造の例が用いられる。
あるノード順序{n1,n2,n4,n3}で順序コストを算出する過程{n1,n2,n4}において、別のノード順序{n1,n2,n3,n4}に対して既に算出した順序コストを上回った場合、順序コストの算出を中断することができる。これは、図17のステップS204において、階層Lにおいて算出した順序コストが、別のノード順序に対してステップS209において既に算出した最小順序コスト以上であれば、ステップS205に進まずにステップS202に戻ることで実現できる。この例においても、最適解である順序コスト45及び順序リスト{n2,n1,n3,n4}が出力される。
<リンク単位の順序コストの算出方法の概要>
移動順序決定部120におけるリンク単位の順序コスト算出について説明する。まず、移動順序決定部120は、データの移動順序、すなわち、データ移動を行うノード順序を複数仮定する。例えば、図10のデータ構造例の場合、複数のノード順序が考えられる。その中で、VM1、VM2、VM3、VM4の順でデータ移動を行う場合の順序コストについて説明する。
VM1のデータを移動させるためには、リンク{a,b,c,d,1}を移動させる必要がある。更に、移動順序決定部120は、仮定したノード順序において、リンクの移動順序、すなわち、データ移動を行うリンク順序を仮定する。中間リンクからデータを移動させるため、a,b,c,d,1の順でリンクを移動させる場合を考える。
VM1のリンクaのデータを移動させるときの順序コストは、リンクaのコストと、VM1を含む未移動のノードの負荷とに基づいて算出される。リンクaのコストは2である。この時、残ノードの負荷(自ノードも含め、未移動のノードはVM1、VM2、VM3、VM4であり、負荷は3+5+2+7=17)を乗じて、順序コストは34とする。次に、リンクbのコストは1である。この時、残ノードの負荷17を乗じて、順序コストは17とする。同様に計算し、VM1の順序コストは34+17+51+34+17=153((2+1+3+2+1)*17=153)となる。同様にVM2のf,g,2(残ノードのコスト14)、VM3のe,3(残ノードのコスト9)、VM4のh,i,4(残ノードのコスト7)の順序コストを算出し、その和をVM1、VM2、VM3、VM4の順でデータ移動する場合の順序コストとする。
移動順序決定部120は、他のリンク順序及び他のノード順序でデータ移動を行うときの順序コストも算出し、算出した順序コストの中で最も順序コストが小さくなる移動順序を決定する。順序コストは、全ての移動順序に対して算出してもよいが、ノード単位における順序コストの算出と同様に、順序コストの算出を進める候補を選択してもよく、順序コストの算出を途中で中断してもよい。
図18は、リンク単位の順序コスト算出例である。説明を簡単にするために、図18(A)に示すデータ構造を仮定する。ノードn1、n2、n3、n4のリンクの中で、a、bは中間リンクであり、c、d、e、fは葉リンクである。それぞれのコストは中間リンク及び葉リンクに示されており、負荷はノードの下に示されている。
このときの順序コストの算出過程を図18(B)に示す。図18(B)において、各ボックス内の{a,c,d,…}は転送するリンクの順序である。また、図18(B)の最も下の行には、順序コストの算出の基礎となるコストの値を示す。ノードの移動順序としては、{n1,n2,n3,n4}、{n1,n2,n4,n3}、{n1,n3,n2,n4}、{n1,n3,n4,n2}、{n1,n4,n2,n3}、{n1,n4,n3,n2}、{n2,n1,n3,n4}、{n2,n1,n4,n3}、…が考えられるが、{n1,n2,n3,n4}のときの順序コストの算出について説明する。
{a}の順序コストは(リンクaのコスト)*(n1を含む残ノードの負荷)=2*6=12として計算できる。{a,c}の順序コストは{a}の順序コスト+(追加したリンクcのコスト)*(n1を含む残ノードの負荷)=12+(3*6)=30として計算できる。{a,c,d}の順序コストは{a,c}の順序コスト+(追加したリンクdのコスト)*(n2を含む残ノードの負荷)=30+(1*4)=34として計算できる。全ての順序コストを算出してもよいが、図13と同様に、あるリンク順序{a,c,d,…}で順序コストを算出する過程{a,c,d}において、途中まで順序コストを算出したリンクa,c,dと同一のリンクが別のリンク順序{a,d,c}において算出されており且つ途中まで算出した順序コスト34が別のリンク順序において算出された順序コスト30を上回った場合、順序コストの算出を中断することができる。なお、順序コストが同じである場合には、どちらかの順序コストの算出を進める。順序コストの算出を進めると、最も順序コストが小さくなる移動順序は、{a,d,c,b,e,f}であることが分かる。
図19は、行毎にリンク単位の順序コストを算出する方法のフロー例である。移動対象となるリンクの数を階層数とする。例えば、リンク数が4の場合、階層数は4であり、階層L=4のときに最下層である。
まず、ステップS301において、階層L=1とする。ステップS302において、階層Lにおける各リンクの順序リストを更新する。例えば、階層L=1でaを選定していたならば、階層L=2の未選定リンクはc,d,…である。cを次リンクと選定すると、階層L=1の順序リスト{a}を{a,c}に更新する。ステップS303において、各順序リストにおける順序コストを算出する。順序コスト=(階層L-1の順序コスト)+(次リンクを移動完了するためのコスト)*(次リンクのノードを含む未選定ノードの負荷)である。例えば、順序リスト{a,c}ならば、順序コスト=({a}の順序コスト)+(次リンクcのコスト)*(n1の負荷+n2の負荷+n3の負荷+n4の負荷))である。ステップS304において階層Lが最下層でない場合、ステップS305において階層L+1としてステップS302に戻る。ステップS304において階層Lが最下層である場合、ステップS306において最小順序コスト及びそのときの順序リストを出力する。
図19は、全ての順序コストを算出する例を示しているが、図18で説明したように、順序コストを算出する過程において順序コストの算出を中断することも可能である。これは、図19のステップS303において、階層Lにおいて順序コストを算出したリンクの組み合わせが同一になった場合、最小コスト以外は順序リスト更新の対象から除外することで実現できる。
また、上記のように総当たりで順序コストを算出すると計算量が大きくなると想定される。従って、図15と同様に、順序コストを算出する過程において、途中まで算出した順序コストに基づいて、順序コストの算出を進める候補を選択して、選択された候補に対して順序コストの算出を進めてもよい。これは、図19のステップS303において、階層Lにおいて順序コストが少ない上位の2つ以外は順序リスト更新の対象から除外することで実現できる。この場合、最適解が得られない可能性があるが、準最適解が短時間で算出できる。
図20は、列毎にリンク単位の順序コストを算出する方法のフロー例である。移動対象となるリンクの数を階層数とする。例えば、リンク数が4の場合、階層数は4であり、階層L=4のときに最下層である。
まず、ステップS401において、階層L=1とする。ステップS402において、階層Lに未選定リンクがある場合、ステップS403において未選定リンクから次リンクを選択し、順序リストを更新する。例えば、階層L=1でaを選定していたならば、階層L=2の未選定リンクはc,d,…である。cを次リンクと選定すると、階層L=1の順序リスト{a}を{a,c}に更新する。ステップS404において、順序リストにおける順序コストを算出する。順序コスト=(階層L-1の順序コスト)+(次リンクを移動完了するためのコスト)*(次リンクのノードを含む未選定ノードの負荷)である。例えば、順序リスト{a,c}ならば、順序コスト=({a}の順序コスト)+(次リンクcのコスト)*(n1の負荷+n2の負荷+n3の負荷+n4の負荷))である。ステップS405において階層Lが最下層でない場合、ステップS406において階層L+1としてステップS402に戻る。ステップS405において階層Lが最下層である場合、ステップS409において最小順序コスト及びそのときの順序リストを更新する。更に、ステップS410において階層L-1としてステップS402に戻る。
ステップS402において階層Lに未選定リンクがなく、階層L=1でない場合、1つ上の階層に戻って順序コストを計算するため、ステップS410において階層L-1としてステップS402に戻る。ステップS402において階層Lに未選定ノードがなく、階層L=1である場合、全ての順序コストの算出が完了したので、ステップS408において最小順序コスト及びそのときの順序リストを出力する。
図20は、全ての順序コストを算出する例を示しているが、順序コストを算出する過程において順序コストの算出を中断することも可能である。図17と同様に、あるリンク順序{a,c,b,e,d,f}で順序コストを算出する過程{a,c,b,e}において、別のリンク順序{a,d,c,b,e,f}に対して既に算出した順序コストを上回った場合、順序コストの算出を中断することができる。これは、図20のステップS404において、階層Lにおいて算出した順序コストが、別のリンク順序に対してステップS409において既に算出した最小順序コスト以上であれば、ステップS405に進まずにステップS402に戻ることで実現できる。
<実施例1:ノード単位の順序コストの算出例(データ構造がツリーで表現できる場合)>
図13で説明したノード単位の順序コストの算出において計算量を削減する例について更に詳細に説明する。実施例1では、VMのデータ構造がツリーで表現できることを仮定する。
図21に、VMのデータ構造をツリーで表現する例を示す。VM1、VM2、VM3、VM4のサブデータを中間リンクa,b及び葉リンクc,d,e,fに分類する。ツリートポロジは、1つの根ノードと複数の葉ノードを含む。根ノード方向を上流とし、中間リンクを優先的に上流に接続し、葉リンクを下流に接続することで、VM1、VM2、VM3、VM4のデータ構造がツリートポロジで表現される。各ノードには負荷が存在し、各リンクにはコストが存在する。
実施例1では、上記のように、負荷を考慮しつつ、共通データである中間リンクを優先して移動させ、固有データである葉リンクを後で送信する。葉リンクに含まれる一時データは処理に伴い頻繁に更新されるため、この部分をマイグレーションの中間部分で送信すると、大量に更新されたデータを送信することになり、マイグレーション時間の増加につながるため、葉リンクはノード内においては最後に送信する。リンクの順序の計算においても、葉リンクの移動順序がノード内において最後になるようにする。
以下の説明において使用するデータについて説明する。構造体データとは、確定済みのリンクの順序を管理するデータを示す。構造体データは、順序が確定したリンクを記録するデータ1と、リンクの順序を記録するデータ2と、確定済みの順序に従いデータを移動したときの順序コストを記録するデータ3を含む。また、集合データ1は、構造体データの集合であり、順序確定済みのリンクの組み合わせが同じリンク順序のうち、順序コストの最も小さい順序を管理するデータを示す。全てのリンクをデータ1に持つ構造体データのみになった場合、全てのリンクの順序が確定したため順序コストの算出が終了する。リンク集合データ1は、確定済みのリンクの集合を示し、リンク集合3の計算に使用する。リンク集合データ2は、リンクの順序を管理するデータを示す。リンク集合3は、未確定のリンクの集合を示す。
図22は、VMのデータ構造をツリーで表現したときのリンクの順序及び順序コストを説明するための図である。図22のデータ構造において、リンクのIDをa〜d、ノードのIDをn1〜n3と定義する。ノードの負荷をL1〜L3とし、リンクのコストをCa〜Cdとする。リンクの順序がa->b->c->dである場合、構造体データのデータ1に{a,b,c,d}が、データ2に{a->b->c->d}が記録される。
リンクaを選ぼうとした時点で、葉リンクから根ノードまでの経路が確定していない葉リンク(aを含む)は3本存在し、3本の葉リンクのノードの負荷はL1+L2+L3である。よって、Ca*(L1+L2+L3)を順序コストに足す。次に、リンクb,cを選んだ時点で、葉リンクから根ノードまでの経路が確定していない葉リンクは2本存在し、2本の葉リンクのノードの負荷はL2+L3である。よって、(Cb+Cc)*(L2+L3)を順序コストに足す。dを選んだ時点で順序が確定していない葉リンクは1本存在し、1本の葉リンクのノードの負荷はL3である。よって、Cd*L3を順序コストに足す。この計算により、順序a->b->c->dの順序コストをCa*(L1+L2+L3)+Cb*(L2+L3)+Cc*(L2+L3)+Cd*L3とする。順序コストは負荷で重み付けされたVMのマイグレーション時間の総和を示す。よって、順序コストが小さければ、負荷を速く軽減させることができることを示す。
図23は、ノード単位の順序コスト算出方法のフローチャートである。図23を説明するときの具体例として、図21のデータ構造を用いる。
ステップS501において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS502において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a,b,c,d,e,f}である。
ステップS503−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用するリンクを計算する。
このときのリンクの計算について、図24を参照して説明する。図24は、ステップS503−1におけるリンクの計算を示す図である。ここでは、図21のデータ構造にリンクgが追加されたデータ構造を例に挙げて説明する。ステップS503−1において、リンク集合3に含まれる、中間リンクのすべて、又は上流に存在する中間リンクがすべてリンク集合データ1に含まれる葉リンクのすべてを計算する。リンクa,cがリンク集合データ1に含まれる場合、リンクb,d,e,f,gがリンク集合3に含まれる。このとき、リンク集合3に含まれる中間リンクのすべては{b}であり、リンク集合3に含まれる、上流に存在する中間リンクがすべてリンク集合データ1に含まれる葉リンクのすべては{d,g}である。従って、(リンクID,コスト)={(b,5),(d,1),(g,3)}が出力される。
図21のデータ構造に対してステップS503−1を実行すると、以降のステップで計算するリンクは{a,b}となる。
ステップS503−2において、ステップS503−1で計算されたリンクの中から選択したリンクをリンク10として、リンク10に対応する構造体データ1-1を作成する。リンクa->bの順で構造体データ1-1を作成することを仮定すると、リンクaが選択された場合、図25(A)に示すように、ステップS503−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。リンクbが選択された場合も、ステップS503−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。以下、リンクaの構造体データ1-1について説明する。
ステップS504−1において、構造体データ1-1のデータ1に、構造体データ1-1に対応するリンク10とリンク集合データ1に含まれるリンクを入力する。リンクaがリンク10として選択された場合、構造体データ1-1のデータ1(data1)に、リンク10(a)とリンク集合データ1(={})の要素を代入する。
ステップS504−2において、構造体データ1-1のデータ2に、リンク集合データ2の最後尾にリンク10を追加したデータを入力する。リンク10が複数のリンクを結合したものである場合、結合したときの順序を保ちつつ、結合する前のリンクを先頭に追記する。リンクaがリンク10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の最後尾にリンク10(a)を追加したデータを入力する。
ステップS504−3において、構造体データ1-1のデータ3に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合データ1に含まれている葉リンクに対応するノードの負荷を全葉リンクに対応するノードの負荷から引いた値とリンク10のコストをかけ、数値1を足した値を記録する。リンクaがリンク10として選択された場合、構造体データ1-1のデータ3(data3)に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合データ1に含まれている葉リンクに対応するノードの負荷(=0)を全葉リンクに対応するノードの負荷(=7+5+2+3=17)から引いた値(17-0=17)にリンク10(a)のコスト(=2)をかけ、数値1(=0)を足した値(=34)を記録する。その結果、図25(B)に示す構造体データ1-1が生成される。
ステップS504−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS504−4−1において、構造体データ1-1を集合データ1に入力する。
ステップS504−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS504−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS504−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
ステップS503−3において、リンク集合3に属するリンクから計算したリンクすべてに対し、ステップS503−2からS504−5のステップを繰り返す。ステップS503−1で生成したリンク={a,b}に対し処理が終わったとき、図26の集合データ1が生成される。
ステップS503−4において、構造体データ10が空でなければ、ステップS503−4−1において、集合データ1から構造体データ10を削除する。
ステップS503−4及びステップS503−4−1の後に、ステップS505−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS506において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS505−1の条件が満たされない場合、ステップS505−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図26の集合データ1の例では、集合データ1の要素数が最小値(=1)であるリンクa用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a}となり、リンク集合データ2は構造体データ10のデータ2である{a}となり、数値1は、構造体データ10のデータ3である34となる。
その後、ステップS502に戻り計算を進めると、ステップS502において、リンク集合3=全リンク−リンク集合データ1(={a})={b,c,d,e,f}となる。
ステップS503−1において、図24を用いて説明した方法を用いて以降のステップで使用するリンクを計算すると、{b,c,d}となる。
ステップS503−2において、リンクb->c->dの順で、それぞれ構造体データ1-1を計算する。リンクbが選択された場合、ステップS504−1において、構造体データ1-1のデータ1(data1)に、リンク10(b)とリンク集合データ1(={a})の要素を代入する。ステップS504−2において、構造体データ1-1のデータ2に、リンク集合データ2(={a})の最後尾にリンク10(b)を追加したデータを入力する。ステップS504−3において、構造体データ1-1のデータ3に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合1に含まれている葉リンクに対応するノードの負荷(=0)を全葉リンクに対応するノードの負荷(=17)から引いた値(17-0=17)にリンク10(b)のコスト(=5)をかけ、数値1(=34)を足した値(=119)を記録する。その結果、図27(A)に示す構造体データ1-1が生成される。
リンクc及びdが選択されたときも同様に計算すると、図27(B)及び(C)に示す構造体データ1-1が生成される。その結果、図27(D)に示す集合データ1が生成される。
ステップS503−4において、構造体データ10が空でないため、ステップS503−4−1において、図28(A)に示すように、構造体データ10を集合データ1から削除する。
ステップS505−1の条件は満たされないため、ステップS505−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=1)であるリンクb用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{b}となり、リンク集合データ2は構造体データ10のデータ2である{b}となり、数値1は、構造体データ10のデータ3である85となる。
その後、ステップS502からステップS503−3を同様に行うと、図28(B)に示す構造体データ1-1、構造体データ1-2、構造体データ1-3が生成される。図28(A)の集合データ1を見ると、data1が{a,b}になっている構造体データ1が集合データ1内に存在する。このとき、構造体データ1-1作成中におけるステップS504−4の条件が満たされないため、ステップS504−5において両者のコストを比較し、ステップS504−5の条件を満たすかチェックする。この場合は両者とも同じコストであるため交換をしない。
更に計算を進めると、集合データ1は図29(A)に示すようになる。図29(A)の左下の構造体データを構造体データ10とすると、図29(B)に示す構造体データが生成される。図29(A)の集合データ1を見ると、集合データ1内にdata1={a,b,c}であるデータが存在する。このとき、構造体データ作成中におけるステップS504−4の条件が満たされない。また、ステップS504−5において両者のコストを比較すると、集合データ1内の構造体データのコストが新たにできた構造体データより大きいためステップS504−5の条件に合致する。よって、ステップS504−5−1において、集合データ内の構造体データと新たにできた構造体データを入れ替える。
更に計算を進めると、集合データ1は図30(A)に示すようになる。ここで、図30(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図30(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図30(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図30(B)の構造体データ)が存在するが、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図30(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図30(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図30(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図30(D)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図30(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a->d->c->b->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
このように、データの共通部分を1本のリンクとするツリー構造でVM間の関係を表せる場合に、負荷で重み付けされたVMマイグレーション時間が短くなるよう、VMのデータの送信順をスケジューリングすることが可能になる。
<実施例2:ノード単位の順序コストの算出例(データ構造が一般的な場合)>
図13で説明したノード単位の順序コストの算出において計算量を削減する例について更に詳細に説明する。実施例2では、VMのデータ構造が一般的な場合を仮定する。
図31に、一般的なVMのデータ構造の例を示す。VM1、VM2、VM3、VM4のサブデータを中間リンク及び葉リンクに分類する。説明の便宜上、中間リンクは、アルファベットでグループを表し、識別子を数字で表したリンクIDによって区別する。データ構造が一般的な場合、複数のリンクを直列につないだ経路が複数存在し、リンクはいずれか1つのグループに属する。経路の一番下に存在するリンクを葉リンクとし、その他を中間リンクとする。各ノードには負荷が存在し、各リンクにはコストが存在する。
実施例2では、上記のように、負荷を考慮しつつ、共通データである中間リンクのデータを優先して移動させ、固有データである葉リンクのデータを後で送信する。葉リンクに含まれる一時データは処理に伴い頻繁に更新されるため、この部分をマイグレーションの中間部分で送信すると、大量に更新されたデータを送信することになり、マイグレーション時間の増加につながるため、葉リンクはノード内においては最後に送信する。リンクの順序の計算においても、葉リンクの移動順序がノード内において最後になるようにする。
以下の説明においても、既に定義した構造体データ、集合データ1、リンク集合データ1、リンク集合データ2、リンク集合3を用いる。
図32は、一般的なVMのデータ構造のときのリンクの順序及び順序コストを説明するための図である。図32(A)のデータ構造において、どのリンクの順序も確定していない状態からVM1に対応する経路上のリンクの順序を確定する場合、{a1,b1,c1,d1,1}が順序確定対象である。a1->b1->c1->d1->1の順でリンクの順序を確定する。a2,a3,b2,c2,d2についてはa1,b1,c1,d1と同じグループに属するので、順序確定済みとする。順序確定済みのものは太線の枠で示す。
あるVMに対応する経路上のリンクを確定対象とする場合、順序のコストをそれまで確定した順序のコスト+新たに確定対象とするリンクのコストの総和×未確定の経路の負荷として計算する。図32(A)に示すように、全リンクが順序未確定の状態で、VM1に対応する経路上のリンクを確定対象とするとき{a1,b1,c1,d1,1}が新たな確定対象なので、新たに確定対象とするリンクのコストの総和は2+1+3+2+1=9である。VM1の経路追加時の未確定の経路(VM1の経路を含む)の負荷は(3+5+2+7)=17なので、順序a1->b1->c1->d1->1の順序コストは9×17=153である。
次に図32(B)に示すように、VM2に対応する経路上のリンクの順序を確定する場合、順序未確定の{f1,g1,2}が順序確定対象である。f1->g1->2の順でリンクの順序を確定すると、先ほど確定したa1->b1->c1->d1->1の後ろにf1->g1->2を追加し、a1->b1->c1->d1->1->f1->g1->2とする。同時にf2,f3についてはf1と同じグループに属するので順序確定済みとする。
図32(B)に示すように、VM2に対応する経路上のリンクを確定対象とするとき、{f1,g1,2}が新たな確定対象なので、新たに確定対象とするリンクのコストの総和は1+2+2=5である。VM2の経路追加時の未確定の経路(VM2の経路を含む)の負荷は(5+2+7)=14なので、順序a1->b1->c1->d1->1->f1->g1->2のコストは153+5×14=223である。
以降、VMを追加するとき、同じ方法でリンクの順序確定と同一グループに属するリンクの順序確定済みチェックを行い、順序コストを計算する。
データ構造が一般的な場合のノード単位の順序コスト算出方法も、図23と同じフローチャートで実現できる。説明を簡単にするために、図33のデータ構造を用いて順序コストの計算について説明する。ここで、a1、a2、b1、b2は中間リンクであり、c、d、e、fは葉リンクである。
ステップS501において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS502において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a1,a2,b1,b2,c,d,e,f}である。
ステップS503−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用するリンクを計算する。
このときのリンクの計算について、図34を参照して説明する。図34は、ステップS603−1におけるリンクの計算を示す図である。ここでは、図32のデータ構造を例に挙げて説明する。ステップS503−1において、リンク集合3に含まれる、中間リンクのすべて、又は上流に存在する中間リンクがすべてリンク集合データ1に含まれる葉リンクのすべてを計算する。リンクa1,a2,a3,b1,b2,c1,c2,d1,d2がリンク集合データ1に含まれる場合、リンク1,2,3,4,e1,f1,f2,f3,g1,h1,i1がリンク集合3に含まれる。このとき、リンク集合3に含まれる中間リンクのすべては{e1,f1,f2,f3,g1,h1,i1}であり、リンク集合3に含まれる、上流に存在する中間リンクがすべてリンク集合データ1に含まれる葉リンクのすべては{1}である。従って、(リンクID,コスト)={(e1,4),(f1,1),(f2,1),(f3,1),(g1,2),(h1,3),(i1,2),(1,1)}が出力される。
図33のデータ構造に対してステップS503−1を実行すると、以降のステップで計算するリンクは{a1,a2,b1,b2}となる。
ステップS503−2において、ステップS503−1で計算されたリンクの中から選択したリンクをリンク10として、リンク10に対応する構造体データ1-1を作成する。リンクa1->a2->b1->b2の順で構造体データ1-1を作成することを仮定すると、リンクa1が選択された場合、図35(A)に示すように、ステップS503−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。以下、リンクa1の構造体データ1-1について説明する。
ステップS504−1において、構造体データ1-1のデータ1に、構造体データ1-1に対応するリンク10とリンク集合データ1に含まれるリンクを入力する。更に、リンク10と同じグループに属するリンク集合を入力する。リンクa1がリンク10として選択された場合、構造体データ1-1のデータ1(data1)に、リンク10(a1)とリンク集合データ1(={})の要素を代入する。更に、リンク10(a1)と同じグループに属するリンク集合(={a2})を代入する。
ステップS504−2において、構造体データ1-1のデータ2に、リンク集合データ2の最後尾にリンク10を追加したデータを入力する。リンク10が複数のリンクを結合したものである場合、結合したときの順序を保ちつつ、結合する前のリンクを先頭に追記する。リンクa1がリンク10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の最後尾にリンク10(a1)を追加したデータを入力する。
ステップS504−3において、構造体データ1-1のデータ3に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合データ1に含まれている葉リンクに対応するノードの負荷を全葉リンクに対応するノードの負荷から引いた値とリンク10のコストをかけ、数値1を足した値を記録する。リンクa1がリンク10として選択された場合、構造体データ1-1のデータ3(data3)に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合データ1に含まれている葉リンクに対応するノードの負荷(=0)を全葉リンクに対応するノードの負荷(=7+5+2+3=17)から引いた値(17-0=17)にリンク10(a1)のコスト(=2)をかけ、数値1(=0)を足した値(=34)を記録する。その結果、図35(B)に示す構造体データ1-1が生成される。
ステップS504−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS504−4−1において、構造体データ1-1を集合データ1に入力する。ステップS503−1で生成したリンク=a1に対し処理が終わったとき、図36(A)の集合データ1が生成される。
ステップS504−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS504−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS504−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
リンクa2に対する構造体データを生成する際、ステップS504−3終了時の構造体データ1-1は図36(B)に示すようになる。構造体データ1-1のデータ1(data1)は、先に生成し、集合データ1内に存在する、リンクa1の構造体データのデータ1(data1)と同じa1,a2となる。このとき、ステップS504−5において、両者のコストを比較し、小さいほうを残す。同じ場合はどちらかを残す。この例では両者のコストは同じであるため、リンクa1に対する構造体データのほうを残す。
ステップS503−3において、リンク集合3に属するリンクから計算したリンクすべてに対し、ステップS503−2からS504−5のステップを繰り返す。ステップS503−1で生成したリンク={a1,a2,b1,b2}に対し処理が終わったとき、図36(C)の集合データ1が生成される。
ステップS503−4において、構造体データ10が空でなければ、ステップS503−4−1において、集合データ1から構造体データ10を削除する。
ステップS503−4及びステップS503−4−1の後に、ステップS505−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS506において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS505−1の条件が満たされない場合、ステップS505−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図36(C)の集合データ1の例では、集合データ1の要素数が最小値(=2)であるリンクa1用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a1,a2}となり、リンク集合データ2は構造体データ10のデータ2である{a1}となり、数値1は、構造体データ10のデータ3である34となる。
その後、ステップS502に戻り計算を進めると、ステップS502において、リンク集合3=全リンク−リンク集合データ1(={a1,a2})={b1,b2,c,d,e,f}となる。
ステップS503−1において、図34を用いて説明した方法を用いて以降のステップで使用するリンクを計算すると、{b1,b2,c,d}となる。
ステップS503−2において、リンクb1->b2->c->dの順で、それぞれ構造体データ1-1を計算する。リンクb1が選択された場合、ステップS504−1において、構造体データ1-1のデータ1(data1)に、リンク10(b1)とリンク集合データ1(={a1,a2})の要素を代入する。更に、リンク10(b1)と同じグループに属するリンク集合(={b2})を代入する。
ステップS504−2において、構造体データ1-1のデータ2に、リンク集合データ2(={a1})の最後尾にリンク10(b1)を追加したデータを入力する。ステップS504−3において、構造体データ1-1のデータ3に、葉リンクから根ノードまでの経路上のリンクがすべてリンク集合1に含まれている葉リンクに対応するノードの負荷(=0)を全葉リンクに対応するノードの負荷(=17)から引いた値(17-0=17)にリンク10(b1)のコスト(=5)をかけ、数値1(=34)を足した値(=119)を記録する。その結果、図37(A)に示す構造体データ1-1が生成される。
リンクb2、c及びdが選択されたときも同様に計算すると、図37(B)、(C)及び(D)に示す構造体データ1-1が生成される。リンクb2が選択されたときの構造体データは、ステップS504−5においてコスト比較され、リンクb1に対する構造体データのほうを残す。その結果、図37(E)に示す集合データ1が生成される。
ステップS503−4において、構造体データ10が空でないため、ステップS503−4−1において、図38に示すように、構造体データ10を集合データ1から削除する。
ステップS505−1の条件は満たされないため、ステップS505−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=2)であるリンクb1用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{b1,b2}となり、リンク集合データ2は構造体データ10のデータ2である{b1}となり、数値1は、構造体データ10のデータ3である85となる。
更に計算を進めると、集合データ1は図39(A)に示すようになる。ここで、図39(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図39(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図39(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図39(B)の構造体データ)が存在するが、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図39(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図39(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS504−3終了時の構造体データ1-1は、図39(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図39(D)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図39(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a1->d->c->b1->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
このように、VMのデータ構造が一般的な場合に、負荷で重み付けされたVMマイグレーション時間が短くなるよう、VMのデータの送信順をスケジューリングすることが可能になる。
<実施例3:リンク単位の順序コストの算出例(データ構造がツリーで表現できる場合)>
図18で説明したリンク単位の順序コストの算出において計算量を削減する例について更に詳細に説明する。実施例3では、VMのデータ構造がツリーで表現できることを仮定する。VMのデータ構造は、図21と同様に表現される。VMのデータ構造をツリーで表現したときのリンクの順序及び順序コストは、図22と同様に計算される。
実施例3では、上記のように、負荷を考慮しつつ、共通データである中間リンクのデータを優先して移動させ、固有データである葉リンクのデータを後で送信する。葉リンクに含まれる一時データは処理に伴い頻繁に更新されるため、この部分をマイグレーションの中間部分で送信すると、大量に更新されたデータを送信することになり、マイグレーション時間の増加につながるため、葉リンクはノード内においては最後に送信する。リンクの順序の計算においても、葉リンクの移動順序がノード内において最後になるようにする。
以下の説明においても、既に定義した構造体データ、集合データ1、リンク集合データ1、リンク集合データ2、リンク集合3を用いる。
図40は、リンク単位の順序コスト算出方法のフローチャートである。図40を説明するときの具体例として、図21のデータ構造を用いる。
ステップS601において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS602において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a,b,c,d,e,f}である。
ステップS603−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用する経路を計算する。
このときの経路の計算について、図41を参照して説明する。図41は、ステップS603−1における経路の計算を示す図である。ここでは、図21のデータ構造にリンクgが追加されたデータ構造を例に挙げて説明する。ステップS603−1において、リンク集合3に含まれるリンクのうち、リンク集合3に含まれる葉リンクごとに計算した経路を選び出すときに、計算対象とする経路に含む葉リンクと、その上流に存在しリンク集合3に含まれるリンクとを葉リンクが最後に来るように結合した経路を選び出す。リンクa,b,c,d,e,f,gがリンク集合3に含まれる場合、計算対象の葉リンクは{d,e,f,g}である。計算対象の葉リンクがdの場合の経路は、{a->d}であり、計算対象の葉リンクがeの場合の経路は、{b->e}であり、計算対象の葉リンクがfの場合の経路は、{b->f}であり、計算対象の葉リンクがgの場合の経路は、{a->c->g}である。従って、(経路,コスト)={(a->d,3),(b->e,6),(b->f,8),(a->c->g,8)}が出力される。
図21のデータ構造に対してステップS603−1を実行すると、以降のステップで計算する(経路,コスト)は{(a->c,5),(a->d,3),(b->e,6),(b->f,8)}となる。
ステップS603−2において、ステップS603−1で計算された経路の中から選択した経路を経路10として、経路10に対応する構造体データ1-1を作成する。経路(a->c)->(a->d)->(b->e)->(b->f)の順で構造体データ1-1を作成することを仮定すると、経路a->cが選択された場合、図42(A)に示すように、ステップS603−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。
ステップS604−1において、構造体データ1-1のデータ1に、構造体データ1-1に経路10上のリンクとリンク集合データ1に含まれるリンクを入力する。経路a->cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10上のリンク(a,c)とリンク集合データ1(={})の要素を代入する。
ステップS604−2において、構造体データ1-1のデータ2に、経路10を構成するリンクを、葉リンクが最後に来るように並び替えたものをリンク集合データ2の最後尾に追加したデータを入力する。経路a->cが経路10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の最後尾に経路10(a->c)を追加したデータを入力する。
ステップS604−3において、構造体データ1-1のデータ3に、リンク集合3に含まれる葉リンクに対応するノードの負荷と経路10のコストをかけ、数値1を足した値を記録する。経路a->cが経路10として選択された場合、構造体データ1-1のデータ3(data3)に、リンク集合3に含まれる葉リンクの負荷(=7+5+2+3=17)と経路10のコスト(=5)をかけ、数値1(=0)を足した値(=85)を記録する。その結果、図42(B)に示す構造体データ1-1が生成される。
ステップS604−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS604−4−1において、構造体データ1-1を集合データ1に入力する。
ステップS604−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS604−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS604−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
ステップS603−3において、リンク集合3に属するリンクから計算した経路すべてに対し、ステップS603−2からS604−5のステップを繰り返す。ステップS603−1で生成した経路={(a->c,5),(a->d,3),(b->e,6),(b->f,8)}に対し処理が終わったとき、図43の集合データ1が生成される。
ステップS603−4において、構造体データ10が空でなければ、ステップS603−4−1において、集合データ1から構造体データ10を削除する。
ステップS603−4及びステップS603−4−1の後に、ステップS605−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS606において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS605−1の条件が満たされない場合、ステップS605−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図43の集合データ1の例では、集合データ1の要素数が最小値(=2)である経路a->c用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a,c}となり、リンク集合データ2は構造体データ10のデータ2である{a->c}となり、数値1は、構造体データ10のデータ3である85となる。
その後、ステップS602に戻り計算を進めると、ステップS602において、リンク集合3=全リンク−リンク集合データ1(={a,c})={b,d,e,f}となる。
ステップS603−1において、図41を用いて説明した方法を用いて以降のステップで使用する経路を計算すると、{(d,1),(b->e,6),(b->f,8)}となる。
ステップS603−2において、経路(b->e)->(d)->(b->f)の順で、それぞれ構造体データ1-1を計算する。経路b->eが選択された場合、ステップS604−1において、構造体データ1-1のデータ1(data1)に、経路10上のリンク(b,e)とリンク集合データ1(={a,c})の要素を代入する。ステップS604−2において、構造体データ1-1のデータ2に、リンク集合データ2(={a->c})の最後尾に経路10を追加したデータ(a->c->b->e)を入力する。ステップS604−3において、構造体データ1-1のデータ3に、リンク集合3に含まれている葉リンクに対応するノードの負荷(=10)に経路10のコスト(=6)をかけ、数値1(=85)を足した値(=145)を記録する。その結果、図44(A)に示す構造体データ1-1が生成される。
経路d及び経路b->fが選択されたときも同様に計算すると、図44(B)及び(C)に示す構造体データ1-1が生成される。その結果、図44(D)に示す集合データ1が生成される。
ステップS603−4において、構造体データ10が空でないため、ステップS603−4−1において、図45(A)に示すように、構造体データ10を集合データ1から削除する。
ステップS605−1の条件は満たされないため、ステップS605−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=2)である経路a->d用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a,d}となり、リンク集合データ2は構造体データ10のデータ2である{a->d}となり、数値1は、構造体データ10のデータ3である51となる。
その後、ステップS602からステップS603−3を同様に行うと、図45(B)に示す構造体データ1-1、構造体データ1-2、構造体データ1-3が生成される。図45(A)の集合データ1を見ると、data1が{a,c,d}になっている構造体データ1が集合データ1内に存在する。このとき、構造体データ1-1作成中におけるステップS604−4の条件が満たされないため、ステップS604−5において両者のコストを比較し、ステップS604−5の条件を満たすかチェックする。この場合は図45(B)の構造体データ1-1のコストの方が小さいため、入れ替える。その結果、集合データ1は図45(C)になる。
更に計算を進めると、集合データ1は図46(A)に示すようになる。ここで、図46(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図46(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図46(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図46(B)の構造体データ)が存在するが、集合データ1の構造体データとコストが同じであるので置き換えない。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図46(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図46(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図46(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図46(D)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図46(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a->d->c->b->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
次に、別の順序コスト算出方法について説明する。
図47は、リンク単位の順序コスト算出方法のフローチャートである。図47を説明するときの具体例として、図21のデータ構造を用いる。図47のフローチャートは、ステップS703−1、S704−2、S704−3を除き、図40のフローチャートと同じである。
ステップS701において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS702において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a,b,c,d,e,f}である。
ステップS703−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用する経路を計算する。
このときの経路の計算について、図48を参照して説明する。図48は、ステップS703−1における経路の計算を示す図である。ここでは、図21のデータ構造にリンクgが追加されたデータ構造を例に挙げて説明する。ステップS703−1において、リンク集合3に含まれるリンクのうち、リンク集合3に含まれる葉リンクごとに計算した経路を選び出すときに、計算対象とする経路に含む葉リンクと、その上流に位置する中間リンクのうち、下流側の端点である分岐ノードにおいて、下流側リンクのうち該葉リンク方向のリンク以外のすべてのリンクが、その下流にリンク集合データ1に含まれる葉リンクが存在するような中間リンクとを葉リンクが最後に来るように結合した経路を選び出す。リンクdがリンク集合データ1に含まれる場合、リンクa,b,c,e,f,gがリンク集合3に含まれる。このとき、計算対象の葉リンクは{e,f,g}である。計算対象の葉リンクがeの場合の経路は、{e}である。この経路を選び出すときに、リンクbの下流側分岐ノードにリンク集合3に属する葉リンク(=f)が存在するため、bは含めない。計算対象の葉リンクがfの場合の経路は、{f}である。この経路を選び出すときに、リンクbの下流側分岐ノードにリンク集合3に属する葉リンク(=e)が存在するため、bは含めない。計算対象の葉リンクがgの場合の経路は、{a->c->g}である。この経路を選び出すときに、リンクa,cの下流側分岐ノードに、リンクg方向以外の下流側リンクすべてに、リンク集合1に属する葉リンクが下流方向に存在する、もしくはg方向にのみ下流側リンクが存在するため、a,cを含める。従って、(経路,コスト)={(e,1),(f,3),(a->c->g,8)}が出力される。
図21のデータ構造に対してステップS703−1を実行すると、以降のステップで計算する(経路,コスト)は{(c,3),(d,1),(e,1),(f,3)}となる。
ステップS703−2において、ステップS703−1で計算された経路の中から選択した経路を経路10として、経路10に対応する構造体データ1-1を作成する。経路(c)->(d)->(e)->(f)の順で構造体データ1-1を作成することを仮定すると、経路cが選択された場合、図49(A)に示すように、ステップS703−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。
ステップS704−1において、構造体データ1-1のデータ1に、構造体データ1-1に経路10上のリンクとリンク集合データ1に含まれるリンクを入力する。経路cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10上のリンク(c)とリンク集合データ1(={})の要素を代入する。
ステップS704−2において、構造体データ1-1のデータ2に、経路10を構成するリンクを、葉リンクが最後に来るように並び替えたものをリンク集合データ2の先頭に追加したデータを入力する。経路cが経路10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の先頭に経路10(c)を追加したデータを入力する。
ステップS704−3において、構造体データ1-1のデータ3に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値に経路10のコストをかけ、数値1を足した値を記録する。経路cが経路10として選択された場合、構造体データ1-1のデータ3(data3)に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値(0+7=7)と経路10のコスト(=3)をかけ、数値1(=0)を足した値(=21)を記録する。その結果、図49(B)に示す構造体データ1-1が生成される。
ステップS704−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS704−4−1において、構造体データ1-1を集合データ1に入力する。
ステップS704−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS704−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS704−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
ステップS703−3において、リンク集合3に属するリンクから計算した経路すべてに対し、ステップS703−2からS704−5のステップを繰り返す。ステップS703−1で生成した経路={(c,3),(d,1),(e,1),(f,3)}に対し処理が終わったとき、図50の集合データ1が生成される。
ステップS703−4において、構造体データ10が空でなければ、ステップS703−4−1において、集合データ1から構造体データ10を削除する。
ステップS703−4及びステップS703−4−1の後に、ステップS705−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS706において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS705−1の条件が満たされない場合、ステップS705−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図50の集合データ1の例では、集合データ1の要素数が最小値(=1)である経路c用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{c}となり、リンク集合データ2は構造体データ10のデータ2である{c}となり、数値1は、構造体データ10のデータ3である21となる。
その後、ステップS702に戻り計算を進めると、ステップS702において、リンク集合3=全リンク−リンク集合データ1(={c})={a,b,d,e,f}となる。
ステップS703−1において、図48を用いて説明した方法を用いて以降のステップで使用する経路を計算すると、{(a->d,3),(e,1),(f,3)}となる。
ステップS703−2において、経路(a->d)->(e)->(f)の順で、それぞれ構造体データ1-1を計算する。経路a->dが選択された場合、ステップS704−1において、構造体データ1-1のデータ1(data1)に、経路10上のリンク(a,d)とリンク集合データ1(={c})の要素を代入する。ステップS704−2において、構造体データ1-1のデータ2に、リンク集合データ2(={c})の先頭に経路10を追加したデータ(a->d->c)を入力する。ステップS704−3において、構造体データ1-1のデータ3に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値(7+5=12)に経路10のコスト(=3)をかけ、数値1(=21)を足した値(=57)を記録する。その結果、図51(A)に示す構造体データ1-1が生成される。
経路e及び経路fが選択されたときも同様に計算すると、図51(B)及び(C)に示す構造体データ1-1が生成される。その結果、図51(D)に示す集合データ1が生成される。
ステップS703−4において、構造体データ10が空でないため、ステップS703−4−1において、図52(A)に示すように、構造体データ10を集合データ1から削除する。
ステップS705−1の条件は満たされないため、ステップS705−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=1)である経路d用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{d}となり、リンク集合データ2は構造体データ10のデータ2である{d}となり、数値1は、構造体データ10のデータ3である5となる。
その後、ステップS702からステップS703−3を同様に行うと、図52(B)に示す構造体データ1-1、構造体データ1-2、構造体データ1-3が生成される。図52(A)の集合データ1を見ると、data1が{a,c,d}になっている構造体データ1が集合データ1内に存在する。このとき、構造体データ1-1作成中におけるステップS704−4の条件が満たされないため、ステップS704−5において両者のコストを比較し、ステップS704−5の条件を満たすかチェックする。この場合は図52(B)の構造体データ1-1のコストの方が大きいため、入れ替えない。その結果、集合データ1は図52(C)になる。
更に計算を進めると、集合データ1は図53(A)に示すようになる。ここで、図53(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図53(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図53(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図53(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図53(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図53(C)の構造体データ)が存在するが、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図53(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図53(C)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図53(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a->d->c->b->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
次に、図40のフローチャートにおいて計算量を削減するための方法について説明する。以下の説明では図40のフローチャートを参照して説明するが、図47のフローチャートにも適用可能である。
図40では、ステップS603−1において計算されたすべての経路に対して順序コストの計算を進めるが、順序コストの計算を進める経路を、コストが小さい順に予め与えられた数に制限してもよい。すなわち、ステップS603−1において、例えば候補経路の選択方法の変更指示(計算量の削減指示)を受信した場合に、リンク集合3に属するリンクから指定した方法によって計算された経路のうち、負荷で重み付けしたコストが最小の経路からk番目までの経路を選ぶ。
図43の集合データ1から経路a->c用の構造体データ1を取り出し、構造体データ10とした場合について説明する。このとき、リンク集合データ1は構造体データ10のデータ1である{a,c}となり、リンク集合データ2は構造体データ10のデータ2である{a->c}となり、数値1は、構造体データ10のデータ3である85となる。
その後、ステップS602に戻り計算を進めると、ステップS602において、リンク集合3=全リンク−リンク集合データ1(={a,c})={b,d,e,f}となる。
ステップS603−1において、図41を用いて説明した方法を用いて以降のステップで使用する経路を計算すると、{(d,1),(b->e,6),(b->f,8)}となる。ここで、計算量の削減指示を受信したことを想定する。
計算量の削減指示がなければ、経路(b->e)->(d)->(b->f)の順で、それぞれ構造体データ1-1を計算するが、計算量の削減指示に従い、ステップS603−2において、コストの小さい順に2つ目までの経路に対する構造体データ1-1を計算する。負荷で重み付けした経路dのコストは1*(5+2+3)=10であり、負荷で重み付けした経路b->eのコストは6*(5+2+3)=60であり、負荷で重み付けした経路b->fのコストは8*(5+2+3)=80である。従って、経路d及びb->eに対する構造体データを生成する。経路dが選択された場合、図54(A)に示す構造体データ1-1が生成される。経路b->eが選択された場合、図54(B)に示す構造体データ1-1が生成される。その結果、図54(C)に示す集合データ1が生成される。図54(C)の集合データ1と図44(D)の集合データ1を比べると、集合データ1の要素数が少なくなっていることが分かる。
上記の例では、候補経路の選択方法の変更指示が計算途中で受信された場合を示しているが、候補経路の選択方法の変更指示は用いられなくてもよい。すなわち、ステップS603−1において、リンク集合3に属するリンクから指定した方法によって計算された経路のうち、コストが最小の経路からk番目までの経路を選んでもよい。
このように、データの共通部分を1本のリンクとするツリー構造でVM間の関係を表せる場合に、負荷で重み付けされたVMマイグレーション時間が短くなるよう、VMのデータの送信順をスケジューリングすることが可能になる。
<実施例4:リンク単位の順序コストの算出例(データ構造が一般的な場合)>
図18で説明したリンク単位の順序コストの算出において計算量を削減する例について更に詳細に説明する。実施例4では、VMのデータ構造が一般的な場合を仮定する。VMのデータ構造は、図31と同様に表現される。このときのリンクの順序及び順序コストは、図32と同様に計算される。
実施例4では、上記のように、負荷を考慮しつつ、共通データである中間リンクのデータを優先して移動させ、固有データである葉リンクのデータを後で送信する。葉リンクに含まれる一時データは処理に伴い頻繁に更新されるため、この部分をマイグレーションの中間部分で送信すると、大量に更新されたデータを送信することになり、マイグレーション時間の増加につながるため、葉リンクはノード内においては最後に送信する。リンクの順序の計算においても、葉リンクの移動順序がノード内において最後になるようにする。
以下の説明においても、既に定義した構造体データ、集合データ1、リンク集合データ1、リンク集合データ2、リンク集合3を用いる。
データ構造が一般的な場合のノード単位の順序コスト算出方法も、図40と同じフローチャートで実現できる。説明を簡単にするために、図33のデータ構造を用いて順序コストの計算について説明する。ここで、a1、a2、b1、b2は中間リンクであり、c、d、e、fは葉リンクである。
ステップS601において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS602において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a1,a2,b1,b2,c,d,e,f}である。
ステップS603−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用する経路を計算する。
このときの経路の計算について、図55を参照して説明する。図55は、ステップS603−1における経路の計算を示す図である。ここでは、図32のデータ構造を例に挙げて説明する。ステップS603−1において、リンク集合3に含まれるリンクのうち、リンク集合3に含まれる葉リンクごとに計算した経路を選び出すときに、計算対象とする経路に含む葉リンクと、その上流に存在しリンク集合3に含まれるリンクとを葉リンクが最後に来るように結合した経路を選び出す。リンクe1,f1,f2,f3,g1,h1,i1,2,3,4がリンク集合3に含まれる場合、計算対象の葉リンクは{2,3,4}である。計算対象の葉リンクが2の場合の経路は、{f1->g1->2}であり、計算対象の葉リンクが3の場合の経路は、{e1->f2->3}であり、計算対象の葉リンクが4の場合の経路は、{f3->h1->i1->4}である。従って、(経路,コスト)={(f1->g1->2,5),(e1->f2->3,13),(f3->h1->i1->4,8)}が出力される。
図33のデータ構造に対してステップS603−1を実行すると、以降のステップで計算する(経路,コスト)は{(a1->c,5),(a2->d,3),(b1->e,6),(b2->f,8)}となる。
ステップS603−2において、ステップS603−1で計算された経路の中から選択した経路を経路10として、経路10に対応する構造体データ1-1を作成する。経路(a1->c)->(a2->d)->(b1->e)->(b2->f)の順で構造体データ1-1を作成することを仮定すると、経路a1->cが選択された場合、図56(A)に示すように、ステップS603−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。
ステップS604−1において、構造体データ1-1のデータ1に、構造体データ1-1に経路10上のリンクとリンク集合データ1に含まれるリンクを入力する。更に、経路10と同じグループに属するリンク集合を入力する。経路a1->cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10上のリンク(a1,c)とリンク集合データ1(={})の要素を代入する。更に、経路10と同じグループに属するリンク集合(={a2})を代入する。
ステップS604−2において、構造体データ1-1のデータ2に、経路10を構成するリンクを、葉リンクが最後に来るように並び替えたものをリンク集合データ2の最後尾に追加したデータを入力する。経路a1->cが経路10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の最後尾に経路10(a1->c)を追加したデータを入力する。
ステップS604−3において、構造体データ1-1のデータ3に、リンク集合3に含まれる葉リンクに対応するノードの負荷と経路10のコストをかけ、数値1を足した値を記録する。経路a1->cが経路10として選択された場合、構造体データ1-1のデータ3(data3)に、リンク集合3に含まれる葉リンクに対応するノードの負荷(=7+5+2+3=17)と経路10のコスト(=5)をかけ、数値1(=0)を足した値(=85)を記録する。その結果、図56(B)に示す構造体データ1-1が生成される。
ステップS604−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS604−4−1において、構造体データ1-1を集合データ1に入力する。
ステップS604−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS604−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS604−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
ステップS603−3において、リンク集合3に属するリンクから計算した経路すべてに対し、ステップS603−2からS604−5のステップを繰り返す。ステップS603−1で生成した経路={(a1->c,5),(a2->d,3),(b1->e,6),(b2->f,8)}に対し処理が終わったとき、図57の集合データ1が生成される。
ステップS603−4において、構造体データ10が空でなければ、ステップS603−4−1において、集合データ1から構造体データ10を削除する。
ステップS603−4及びステップS603−4−1の後に、ステップS605−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS606において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS605−1の条件が満たされない場合、ステップS605−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図57の集合データ1の例では、集合データ1の要素数が最小値(=3)である経路a1->c用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a1,a2,c}となり、リンク集合データ2は構造体データ10のデータ2である{a1->c}となり、数値1は、構造体データ10のデータ3である85となる。
その後、ステップS602に戻り計算を進めると、ステップS602において、リンク集合3=全リンク−リンク集合データ1(={a1,a2,c})={b1,b2,d,e,f}となる。
ステップS603−1において、図55に示す方法で以降のステップで使用する経路を計算すると、{(d,1),(b1->e,6),(b2->f,8)}となる。
ステップS603−2において、経路(b1->e)->(d)->(b2->f)の順で、それぞれ構造体データ1-1を計算する。経路b1->eが選択された場合、ステップS604−1において、構造体データ1-1のデータ1(data1)に、経路10上のリンク(b1,e)とリンク集合データ1(={a1,a2,c})の要素を代入する。更に、経路10と同じグループに属するリンク集合(={b2})を代入する。ステップS604−2において、構造体データ1-1のデータ2に、リンク集合データ2(={a1->c})の最後尾に経路10を追加したデータ(a1->c->b1->e)を入力する。ステップS604−3において、構造体データ1-1のデータ3に、リンク集合3に含まれている葉リンクに対応するノードの負荷(=10)に経路10のコスト(=6)をかけ、数値1(=85)を足した値(=145)を記録する。その結果、図58(A)に示す構造体データ1-1が生成される。
経路d及び経路b2->fが選択されたときも同様に計算すると、図58(B)及び(C)に示す構造体データ1-1が生成される。その結果、図58(D)に示す集合データ1が生成される。
ステップS603−4において、構造体データ10が空でないため、ステップS603−4−1において、図59(A)に示すように、構造体データ10を集合データ1から削除する。
ステップS605−1の条件は満たされないため、ステップS605−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=3)である経路a2->d用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{a1,a2,d}となり、リンク集合データ2は構造体データ10のデータ2である{a2->d}となり、数値1は、構造体データ10のデータ3である51となる。
その後、ステップS602からステップS603−3を同様に行うと、図59(B)に示す構造体データ1-1、構造体データ1-2、構造体データ1-3が生成される。図59(A)の集合データ1を見ると、data1が{a1,a2,c,d}になっている構造体データ1が集合データ1内に存在する。このとき、構造体データ1-1作成中におけるステップS604−4の条件が満たされないため、ステップS604−5において両者のコストを比較し、ステップS604−5の条件を満たすかチェックする。この場合は図59(B)の構造体データ1-1のコストの方が小さいため、入れ替える。その結果、集合データ1は図59(C)になる。
更に計算を進めると、集合データ1は図60(A)に示すようになる。ここで、図60(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図60(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図60(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図60(B)の構造体データ)が存在するが、集合データ1の構造体データとコストが同じであるので置き換えない。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図60(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図60(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS604−3終了時の構造体データ1-1は、図60(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図60(D)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図60(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a2->d->c->b1->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
次に、図47を参照して別の順序コスト算出方法について説明する。図47を説明するときの具体例として、図33のデータ構造を用いる。
ステップS701において、変数を初期化する。リンク集合データ1とリンク集合データ2と構造体データ10と集合データ1を空にし、数値1を0にする。
ステップS702において、全リンクからリンク集合データ1に含まれるリンクを削除したリンクの集合であるリンク集合3を作成する。リンク集合データ1={}の場合、リンク集合3={a1,a2,b1,b2,c,d,e,f}である。
ステップS703−1において、リンク集合3に属するリンクから、指定した方法によって以降のステップで使用する経路を計算する。
このときの経路の計算について、図61を参照して説明する。図61は、ステップS703−1における経路の計算を示す図である。ここでは、図32のデータ構造を例に挙げて説明する。ステップS703−1において、リンク集合3に含まれるリンクのうち、リンク集合3に含まれる葉リンクごとに計算した経路を選び出すときに、計算対象とする経路に含む葉リンクと、該葉リンクの上流に位置するリンク集合3に含まれる中間リンクのうち、該中間リンクと同じグループに属し下流側にリンク集合データ1に含まれる葉リンクが存在する中間リンクの数が、グループに属するリンク数から1を引いた値である中間リンクとを葉リンクが最後に来るように結合した経路を選び出す。リンクg1,2がリンク集合データ1に含まれる場合、リンクa1,a2,a3,b1,b2,c1,c2,d1,d2,e1,f1,f2,f3,h1,i1,1,3,4がリンク集合3に含まれる。このとき、計算対象の葉リンクは{1,3,4}である。計算対象の葉リンクが1の場合の経路は、{d1->1}である。この経路を選び出すときに、リンクd1は同じグループのリンクd2が経路VM2に存在し、その葉リンクはリンク集合データ1に属する。リンクd1と同じグループに属するリンク数は2であるため、d1は経路を選び出す条件に合致する。リンクa1は同じグループのリンクa2が経路VM2に存在し、リンクd3が経路VM3に存在し、各経路の葉リンクでリンク集合データ1に属するのはVMの葉リンクの2のみである。よって、リンクa1と同じグループに属し下流側にリンク集合データ1に含まれる葉リンクが存在する中間リンクの数は1である。グループに属するリンク数は3であるため、a1は経路を選び出す条件に合致しない。よって、a1は上記の経路に含まれない。同様の理由でb1、c1も上記の経路に含まれない。同様に計算すると、計算対象の葉リンクが3の場合の経路は、{e1->3}であり、計算対象の葉リンクが4の場合の経路は、{h1->i1->4}である。従って、(経路,コスト)={(d1->1,3),(e1->3,7),(h1->i1->4,7)}が出力される。
図33のデータ構造に対してステップS703−1を実行すると、以降のステップで計算する(経路,コスト)は{(c,3),(d,1),(e,1),(f,3)}となる。
ステップS703−2において、ステップS703−1で計算された経路の中から選択した経路を経路10として、経路10に対応する構造体データ1-1を作成する。経路(c)->(d)->(e)->(f)の順で構造体データ1-1を作成することを仮定すると、経路cが選択された場合、図62(A)に示すように、ステップS703−2終了時の構造体データ1-1のデータ1(data1)はNullであり、データ2(data2)はNullであり、データ3(data3)は0である。
ステップS704−1において、構造体データ1-1のデータ1に、構造体データ1-1に経路10上のリンクとリンク集合データ1に含まれるリンクを入力する。更に、経路10と同じグループに属するリンク集合を入力する。経路cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10上のリンク(c)とリンク集合データ1(={})の要素を代入する。更に、経路10と同じグループに属するリンク集合(={})を代入する。
ステップS704−2において、構造体データ1-1のデータ2に、経路10を構成するリンクを、葉リンクが最後に来るように並び替えたものをリンク集合データ2の先頭に追加したデータを入力する。経路cが経路10として選択された場合、構造体データ1-1のデータ2(data2)に、リンク集合データ2(={})の先頭に経路10(c)を追加したデータを入力する。
ステップS704−3において、構造体データ1-1のデータ3に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値に経路10のコストをかけ、数値1を足した値を記録する。経路cが経路10として選択された場合、構造体データ1-1のデータ3(data3)に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値(0+7=7)と経路10のコスト(=3)をかけ、数値1(=0)を足した値(=21)を記録する。その結果、図62(B)に示す構造体データ1-1が生成される。
ステップS704−4において、構造体データ1-1のデータ1と同じデータ1を有する構造体データ1-2が集合データ1に存在しないとき、ステップS704−4−1において、構造体データ1-1を集合データ1に入力する。
ステップS704−4において、構造体データ1-1のデータ1と同じデータを有する構造体データ1-2が集合データ1に存在し、かつステップS704−5において構造体データ1-2のデータ3の値が構造体データ1-1のデータ3の値より大きい場合、ステップS704−5−1において、構造体データ1-1と構造体データ1-2を入れ替える。
ステップS703−3において、リンク集合3に属するリンクから計算した経路すべてに対し、ステップS703−2からS704−5のステップを繰り返す。ステップS703−1で生成した経路={(c,3),(d,1),(e,1),(f,3)}に対し処理が終わったとき、図63の集合データ1が生成される。
ステップS703−4において、構造体データ10が空でなければ、ステップS703−4−1において、集合データ1から構造体データ10を削除する。
ステップS703−4及びステップS703−4−1の後に、ステップS705−1において、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれている場合、ステップS706において、構造体データ1のデータ2のリンクの順序を順序の計算結果として、データ3を順序に対する順序コストとして出力する。
ステップS705−1の条件が満たされない場合、ステップS705−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とし、そのデータ1をリンク集合データ1に、データ2をリンク集合データ2に、データ3を数値1に入力する。図63の集合データ1の例では、集合データ1の要素数が最小値(=1)である経路c用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{c}となり、リンク集合データ2は構造体データ10のデータ2である{c}となり、数値1は、構造体データ10のデータ3である21となる。
その後、ステップS702に戻り計算を進めると、ステップS702において、リンク集合3=全リンク−リンク集合データ1(={c})={a1,a2,b1,b2,d,e,f}となる。
ステップS703−1において、図61に示す方法で以降のステップで使用する経路を計算すると、{(a2->d,3),(e,1),(f,3)}となる。
ステップS703−2において、経路(a2->d)->(e)->(f)の順で、それぞれ構造体データ1-1を計算する。経路a2->dが選択された場合、ステップS704−1において、構造体データ1-1のデータ1(data1)に、経路10上のリンク(a2,d)とリンク集合データ1(={c})の要素を代入する。更に、経路10と同じグループに属するリンク集合(={a1})を代入する。ステップS704−2において、構造体データ1-1のデータ2に、リンク集合データ2(={c})の先頭に経路10を追加したデータ(a2->d->c)を入力する。ステップS704−3において、構造体データ1-1のデータ3に、リンク集合データ1に含まれる葉リンクに対応するノードの負荷に経路10に対応するノードの負荷を足した値(7+5=12)に経路10のコスト(=3)をかけ、数値1(=21)を足した値(=57)を記録する。その結果、図64(A)に示す構造体データ1-1が生成される。
経路e及び経路fが選択されたときも同様に計算すると、図64(B)及び(C)に示す構造体データ1-1が生成される。その結果、図64(D)に示す集合データ1が生成される。
ステップS703−4において、構造体データ10が空でないため、ステップS703−4−1において、図65(A)に示すように、構造体データ10を集合データ1から削除する。
ステップS705−1の条件は満たされないため、ステップS705−2において、集合データ1内の構造体データ1のうち、データ1の要素数が最も少ない構造体データ1を取り出して構造体データ10とする。ここでは、集合データ1の中でデータ1の要素数が最小値(=1)である経路d用の構造体データ1を取り出し、構造体データ10とする。リンク集合データ1は構造体データ10のデータ1である{d}となり、リンク集合データ2は構造体データ10のデータ2である{d}となり、数値1は、構造体データ10のデータ3である5となる。
その後、ステップS702からステップS703−3を同様に行うと、図65(B)に示す構造体データ1-1、構造体データ1-2、構造体データ1-3が生成される。図65(A)の集合データ1を見ると、data1が{a1,a2,c,d}になっている構造体データ1が集合データ1内に存在する。このとき、構造体データ1-1作成中におけるステップS704−4の条件が満たされないため、ステップS704−5において両者のコストを比較し、ステップS704−5の条件を満たすかチェックする。この場合は図65(B)の構造体データ1-1のコストの方が大きいため、入れ替えない。その結果、集合データ1は図65(C)になる。
更に計算を進めると、集合データ1は図66(A)に示すようになる。ここで、図66(A)の構造体データ1-10、構造体データ1-11、構造体データ1-12、構造体データ1-13の順に計算を進める。
構造体データ1-10に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図66(B)に示すようになる。これを集合データ1に入力し、構造体データ1-10を集合データ1から削除する。
構造体データ1-11に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図66(C)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図66(B)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが大きいので置き換える。その後、構造体データ1-11を集合データ1から削除する。
構造体データ1-12に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図66(D)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1に入力された図66(C)の構造体データ)が存在するが、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-12を集合データ1から削除する。
構造体データ1-13に対して計算を進めると、ステップS704−3終了時の構造体データ1-1は、図66(E)に示すようになる。集合データ1にデータ1が同じ構造体データ(集合データ1のデータと置き換えられた図66(C)の構造体データ)が存在し、集合データ1の構造体データのほうのコストが小さいので置き換えない。その後、構造体データ1-13を集合データ1から削除する。
最終的に、図66(F)に示すように、集合データ1内に構造体データ1が1つだけ存在し、そのデータ1にすべてのリンクが含まれているため、データ2= a2->d->c->b1->e->fをリンクの順序として、データ3=126を順序コストとして出力する。
次に、図40のフローチャートにおいて計算量を削減するための方法について説明する。以下の説明では図33のフローチャートを参照して説明するが、図47のフローチャートにも適用可能である。
図40では、ステップS603−1において計算されたすべての経路に対して順序コストの計算を進めるが、順序コストの計算を進める経路を、コストが小さい順に予め与えられた数に制限してもよい。すなわち、ステップS603−1において、例えば候補経路の選択方法の変更指示(計算量の削減指示)を受信した場合に、リンク集合3に属するリンクから指定した方法によって計算された経路のうち、負荷で重み付けしたコストが最小の経路からk番目までの経路を選ぶ。
図57の集合データ1から経路a1->c用の構造体データ1を取り出し、構造体データ10とした場合について説明する。このとき、リンク集合データ1は構造体データ10のデータ1である{a1,a2,c}となり、リンク集合データ2は構造体データ10のデータ2である{a1->c}となり、数値1は、構造体データ10のデータ3である85となる。
その後、ステップS602に戻り計算を進めると、ステップS602において、リンク集合3=全リンク−リンク集合データ1(={a1,a2,c})={b1,b2,d,e,f}となる。
ステップS603−1において、図55に示す方法で以降のステップで使用する経路を計算すると、{(d,1),(b1->e,6),(b2->f,8)}となる。ここで、計算量の削減指示を受信したことを想定する。
計算量の削減指示がなければ、経路(b1->e)->(d)->(b2->f)の順で、それぞれ構造体データ1-1を計算するが、計算量の削減指示に従い、ステップS603−2において、コストの小さい順に2つ目までの経路に対する構造体データ1-1を計算する。負荷で重み付けした経路dのコストは1*(5+2+3)=10であり、負荷で重み付けした経路b1->eのコストは6*(5+2+3)=60であり、負荷で重み付けした経路b2->fのコストは8*(5+2+3)=80である。従って、経路d及びb1->eに対する構造体データを生成する。経路dが選択された場合、図67(A)に示す構造体データ1-1が生成される。経路b1->eが選択された場合、図67(B)に示す構造体データ1-1が生成される。その結果、図67(C)に示す集合データ1が生成される。図67(C)の集合データ1と図58(D)の集合データ1を比べると、集合データ1の要素数が少なくなっていることが分かる。
上記の例では、候補経路の選択方法の変更指示が計算途中で受信された場合を示しているが、候補経路の選択方法の変更指示は用いられなくてもよい。すなわち、ステップS603−1において、リンク集合3に属するリンクから指定した方法によって計算された経路のうち、コストが最小の経路からk番目までの経路を選んでもよい。
このように、VMのデータ構造が一般的な場合に、負荷で重み付けされたVMマイグレーション時間が短くなるよう、VMのデータの送信順をスケジューリングすることが可能になる。
なお、実施例2及び実施例4の順序コストの算出例において、共通データを有するリンクを同じグループに属するリンクとして扱っているが、数字で表したリンクIDを用いずに同じリンクとして扱ってもよい。すなわち、図33に示すように識別子を用いず、VMのデータ構造は図68のように表現されてもよい。その場合においても、上記の計算は適用可能である。
図33のデータ構造の例では、ステップS504−1において、リンクa1がリンク10として選択された場合、構造体データ1-1のデータ1(data1)に、リンク10(a1)とリンク集合データ1(={})の要素を代入し、更に、リンク10(a1)と同じグループに属するリンク集合(={a2})を代入している。図68のデータ構造の例では、ステップS504−1において、リンクaがリンク10として選択された場合、構造体データ1-1のデータ1(data1)に、リンク10(a)とリンク集合データ1(={})の要素を代入すればよい。リンク10と同じグループに属するリンク(a)は既にデータ1に代入されているため、再度代入する必要はない。
また、図33のデータ構造の例では、ステップS604−1において、経路a1->cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10上のリンク(a1,c)とリンク集合データ1(={})の要素を代入し、更に、経路10と同じグループに属するリンク集合(={a2})を代入している。図68のデータ構造の例では、ステップS504−1において、経路a->cが経路10として選択された場合、構造体データ1-1のデータ1(data1)に、経路10(a->c)とリンク集合データ1(={})の要素を代入すればよい。経路10上のリンクと同じグループに属するリンク(a)は既にデータ1に代入されているため、再度代入する必要はない。以降のステップも、リンクをグループ化することなく実施することができる。
<ハードウェア構成例>
図69に、本発明の実施例に係るデータ移動順序決定装置100のハードウェア構成例を示す。データ移動順序決定装置100は、CPU(Central Processing Unit)151等のプロセッサ、RAM(Random Access Memory)やROM(Read Only Memory)等のメモリ装置152、ハードディスク等の記憶装置153等から構成されたコンピュータでもよい。例えば、上記のデータ移動順序決定方法の実行手順は、記憶装置153又はメモリ装置152に記録される。VMのデータ構造や計算中に発生するデータも、記憶装置153又はメモリ装置152に記録される。データ移動順序決定装置100の機能及び処理は、記憶装置153又はメモリ装置152に格納されているデータやプログラムをCPU151が実行することによって実現される。また、データ移動順序決定装置100に必要な情報は、入出力インタフェース装置154から入力され、データ移動順序決定装置100において求められた結果は、入出力インタフェース装置154から出力されてもよい。
なお、図3及び図4を参照して説明した通り、負荷は負荷管理コントローラにおいて一元的に管理されてもよく、物理プラットフォームにおいて分散管理されてもよい。すなわち、データ移動順序決定装置100の各機能部は、負荷管理コントローラに含まれてもよく、物理プラットフォームに含まれてもよい。以下に、負荷が負荷管理コントローラにおいて一元的に管理される場合の負荷管理コントローラ及び物理プラットフォームのハードウェア構成例について説明する。
負荷管理コントローラは、CPU151において、記憶装置153に存在するプログラムを実行する。また、記憶装置153において、物理プラットフォームから収集した負荷の情報を管理する負荷管理機能、各物理プラットフォームの負荷に基づいて移行対象の仮想マシンとその移行先を決定する移行対象仮想マシン決定機能等を実行するプログラムを記録する。また、入出力インタフェース154において、物理プラットフォームとの情報の交換を行う。
物理プラットフォームは、CPU151において、仮想マシンの処理や記憶装置153に存在するプログラムを実行する。また、記憶装置153において、物理プラットフォームの負荷を計測して管理する負荷管理機能、仮想マシンの移動順序を計算する機能、仮想マシンのデータ構造を管理するデータ構造管理機能等を実行するプログラムを記録する。また、入出力インタフェース装置154において、仮想マシンのマイグレーションや仮想マシンのパケット処理を行う。
<補足>
説明の便宜上、本発明の実施例に係るデータ移動順序決定装置は機能的なブロック図を用いて説明しているが、本発明の実施例に係るデータ移動順序決定装置は、ハードウェア、ソフトウェア又はそれらの組み合わせで実現されてもよい。例えば、本発明の実施例は、コンピュータに対して本発明の実施例に係るデータ移動順序決定装置の機能を実現させるプログラム、コンピュータに対して本発明の実施例に係る方法の各手順を実行させるプログラム等により、実現されてもよい。また、各機能部が必要に応じて組み合わせて使用されてもよい。また、本発明の実施例に係る方法は、実施例に示す順序と異なる順序で実施されてもよい。
以上、物理プラットフォームに重い負荷がかかる時間を短縮するためのデータの移動順序の決定手法について説明したが、本発明は、上記の実施例に限定されることなく、特許請求の範囲内において、種々の変更・応用が可能である。