以下に、本願の開示するスイッチ装置及びスイッチ装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示するスイッチ装置及びスイッチ装置の制御方法が限定されるものではない。
図1は、実施例1に係るスイッチのブロック図である。スイッチ1は、サーバや他のスイッチなどの外部の情報処理装置からパケットの入力を受け、入力されたパケットを指定されたアドレスに向けて転送する通信装置である。スイッチ1は、管理用サーバ2に接続される。
管理用サーバ2は、スイッチ1に接続された仮想サーバのパケットの送受信を制御する。例えば、管理用サーバ2は、ある仮想サーバから他の仮想サーバへのパケットの送受信をそれぞれの仮想サーバに行わせる。すなわち、管理用サーバ2は、スイッチ1が転送する各パケットの送信先アドレス、送信元アドレス、送信元ポート、送信先ポート及び使用するプロトコルの情報を保持する。また、管理用サーバ2は、後述する内部キュー232のそれぞれの優先度を予め有する。例えば、優先度として、0〜7の優先度があり、3が基準の優先度であり、7〜4が、基準の優先度を有する内部キュー232よりも優先する優先度であり、2〜0が基準の優先度を有する内部キュー232の後に選択される優先度である。
さらに、管理用サーバ2は、各フローに割り当てられた、そのフローが使用できるバンド幅の上限である設定バンド幅を予め有する。また、管理用サーバ2は、各フローの初期のグルーピングの情報を予め有する。また、管理用サーバ2は、後述する各送信キュー23の1ラウンドでの送出可能量を予め有する。
スイッチ1は、図1に示すように、制御情報送受信部11、記憶部12、スケジューラ13、制御部14、送信側メータカウンタ15、キュー選択部16、受信側メータカウンタ17及びフロー識別部18を有する。さらに、スイッチ1は、受信ポート21、スイッチング部22、送信キュー23及び送信ポート24を有する。
以下では、スイッチ1を介して送受信されるデータの単位をパケットという。パケットには、例えば、本実施例では、送信元IP(Internet Protocol)アドレス、送信先IPアドレス、送信元ポート番号、送信先ポート番号及びプロトコル番号が付加される。そして、条件によって分類された一連のパケットの集まりをフローという。例えば、送信元IPアドレス、送信先IPアドレス、送信元ポート番号、送信先ポート番号及びプロトコル番号によって分類されたパケットの集まりがフローにあたる。さらに、入力されたパケットを格納し順次出力するパケットの一時格納部のことをキューという。
スイッチ1は、受信ポート21を複数有する。各受信ポート21は、それぞれ外部の情報処理装置へ繋がるネットワークに接続される。受信ポート21は、外部の情報処理装置からパケットの入力を受ける。そして、受信ポート21は、受信したパケットをスイッチング部22へ出力する。
スイッチング部22は、パケットの入力を各受信ポート21から受ける。ここで、スイッチング部22が取得したパケットの内の1つのパケットに対するスイッチング部22の処理について説明する。ただし、以下の処理は、各パケット全てに同様に行われる。
スイッチング部22は、フロー識別部18からパケットが属するフローの識別情報であるフローID(Identifier)の入力を受ける。また、スイッチング部22は、フロー識別部18から入力されたフローIDに対応するフローグループの情報、すなわちそのパケットを含むフローが属するフローグループの情報をフロー管理情報121に含まれるフローグループ定義情報から取得する。以下では、例えば第1パケットというパケットがあったとして、その第1パケットが含まれるフローが属するフローグループのことを、単に「第1パケットのフローグループ」という。
また、スイッチング部22は、パケットの送信先IPアドレスを取得する。そして、スイッチング部22は、取得した送信先IPアドレスによって、そのパケットの出力に使用可能な送信ポート24を抽出する。この他にも、スイッチング部22は、MACアドレスを用いてスイッチを行ってもよい。次に、スイッチング部22は、抽出した使用可能な送信ポート24に接続される送信キュー23を特定する。そして、スイッチング部22は、特定した送信キュー23にパケットを出力する。
送信キュー23は、デマルチプレクサ231、内部キュー232及びマルチプレクサ233を有する。送信キュー23は、スイッチング部22から出力されたパケットを後述するスケジューラ13からの指示にしたがい送信ポート24へ出力する。以下に、送信キュー23の詳細を説明する。
内部キュー232は、対応付けられたフローグループに属するフローに含まれるパケットを格納し出力するキューである。内部キュー232は、格納されたタイミングが早い順にパケットを出力する。
内部キュー232は、1つの送信キュー23の中での上限の数が予め決められる。例えば、送信キュー23は、内部キュー232を4つまで有することができる。そして、送信キュー23の中で使用される内部キュー232は、制御部14からの制御を受けて決定される。具体的には、後述するように、内部キュー232は、制御部14によって分割及び結合が行われ、使用される本数が変化する。さらに、内部キュー232に対するフローグループの対応付けも制御部14によって行われる。
デマルチプレクサ231は、パケットの入力をスイッチング部22から受ける。さらに、デマルチプレクサ231は、受信した各パケットをいずれの内部キュー232へ格納するかの指示を後述するキュー選択部16から受ける。そして、デマルチプレクサ231は、指示にしたがい各パケットを内部キュー232へ格納する。
マルチプレクサ233は、後述するスケジューラ13からパケットを取得する内部キュー232の情報の入力を受ける。そして、マルチプレクサ233は、指定された内部キュー232からパケットを取得する。そして、マルチプレクサ233は、取得したパケットを送信ポート24へ出力する。
ここで、後述するようにマルチプレクサ233は、スケジューラ13によって各内部キュー232の重み及び優先度を用いて決められた取得先とする内部キュー232の指定を受ける。これにより、マルチプレクサ233は、各フローグループに対して重みや優先度に応じたフェアなパケットの出力を行うことができる。
また、スイッチ1は、送信ポート24を複数有する。各送信ポート24は、それぞれ外部の情報処理装置へ繋がるネットワークに接続される。送信ポート24は、送信キュー23からパケットの入力を受ける。そして、送信ポート24は、取得したパケットの送信先IPアドレスを有する情報処理装置へ送信されるようにパケットをネットワークへ出力する。
記憶部12は、フロー管理情報121、フロー情報122、フローグループ情報123、ポリシー情報124及びスケジューリングパラメータ125を記憶する。
フロー管理情報121は、フロー識別情報211及びフローグループ定義情報212を含む。図2は、フロー識別情報の一例の図である。また、図3は、フローグループ定義情報の一例の図である。
図2に示すように、フロー識別情報211は、パケットの送信元IPアドレス(SIP:Source IP Address)、送信先IPアドレス(DIP:Destination IP Address)、送信先ポート番号(SP:Source Port)、送信元ポート番号(DP:Destination Port)及びプロトコル番号(Pro:Protocol)に応じたフロー毎に、フローIDが登録される。フロー識別情報211は、後述する制御情報送受信部11により登録される。
また、図3に示すように、フローグループ定義情報212は、フローIDに対応するフローグループが登録される。すなわち、フローグループ定義情報212は、各フローがどのフローグループに含まれるかという情報を保持する。フローグループ定義情報212は、後述する制御部14が後述する内部キュー232の設定バンド幅及び統計情報を用いて決定したグルーピングにしたがって、制御部14により登録される。
フロー情報122は、スイッチ1のパケット転送におけるフロー毎の統計情報である。フロー情報122は、受信側のフロー毎の統計情報及び送信側のフロー毎の統計情報を含む。
フロー情報122の受信側の統計情報には、スイッチ1に入力された各フローの単位時間当たりの受信量であるフロー受信量が含まれる。フロー情報122の受信側の統計情報は、後述する受信側メータカウンタ17により登録される。
フロー情報122の送信側の統計情報には、フロー送信量、フローキュー長及びフロー廃棄数が含まれる。フロー送信量は、フロー毎の単位時間あたりの送信量である。フローキュー長は、各内部キュー232に格納されたフロー毎のパケットサイズの合計である。フロー廃棄数は、内部キュー232に格納されずに破棄されたフロー毎のパケットの数である。フロー情報122の送信側の統計情報は、後述する、送信側メータカウンタ15により登録される。
フローグループ情報123は、スイッチ1のパケット送信におけるフローグループ毎の送信側の統計情報である。ここで、受信時にはフローはフローグループ毎に分類されていないので、フローグループ毎の受信側の統計情報は存在しない。
フローグループ情報123は、フローグループ送信量、フローグループキュー長及びフローグループ廃棄数を含む。フローグループ送信量は、フローグループ毎の単位時間あたりの送信量である。フローグループキュー長は、各内部キュー232に格納されたフローグループ毎のパケットサイズの合計である。フローグループ廃棄数は、フローグループ毎の内部キュー232に格納されずに破棄されたパケットの数である。フローグループ情報123は、後述する送信側メータカウンタ15により登録される。
ポリシー情報124は、図4に示すように、各フローIDに対応させて制約情報である設定バンド幅が登録される。図4は、ポリシー情報の一例を示す図である。設定バンド幅は、各フローに割り当てられた、そのフローが使用できるバンド幅である。ポリシー情報124は、後述する制御情報送受信部11により登録される。
スケジューリングパラメータ125は、送信キュー23が有する内部キュー232からパケットを出力する場合に、どのような順番で出力を行うかをスケジューラ13が決定するために用いるパラメータを含む。スケジューリングパラメータ125は、送信キュー23毎に、例えば図5に示すように、キュー番号、優先度、重み、平均パケット長及びカウンタの領域を有する。図5は、スケジューリングパラメータの一例を示す図である。キュー番号は、各内部キュー232を表す番号である。そして、スケジューリングパラメータ125は、各キュー番号が振られた内部キュー232の優先度、重み及び平均パケット長が、制御部14により登録される。図5において、優先度は各キュー番号に対応させてP1〜PNと表したが、例えば、優先度が0〜7で表される場合、P1〜PNは、0〜7の何れかの値となる。また、スケジューリングパラメータ125のカウンタの領域は、スケジューラ13が使用する作業領域であり、スケジューラ13が、パケット出力のスケジュールを行うに当たり値を格納して使用する。
フロー識別部18は、各受信ポート21からスイッチング部22へ出力されたパケットの送信元IPアドレス、送信先IPアドレス、送信先ポート番号、送信元ポート番号及びプロトコル番号を取得する。そして、フロー識別部18は、取得した情報に対応するフローIDをフロー管理情報121に含まれるフロー識別情報211から取得する。
その後、フロー識別部18は、取得したフローIDをキュー選択部16、受信側メータカウンタ17及びスイッチング部22へ出力する。この時、フロー識別部18は、出力したフローIDがどのパケットが属するフローの識別情報か判別できるように各部へ出力する。
受信側メータカウンタ17は、各受信ポート21からスイッチング部22へ出力されたパケットの情報を取得する。さらに、受信側メータカウンタ17は、各パケットが属するフローのフローIDをフロー識別部18から取得する。そして、受信側メータカウンタ17は、フロー毎のパケットの数をカウントし、単位時間当たりの各フローの受信量であるフロー受信量を算出する。その後、受信側メータカウンタ17は、各フロー受信量をフローIDに対応させてフロー情報122として記憶部12に格納する。
キュー選択部16は、スイッチング部22から出力された各パケットが属するフローのフローIDの入力をフロー識別部18から受ける。また、キュー選択部16は、各フローIDに対応するフローグループの情報をフロー管理情報121のフローグループ定義情報212から取得する。
そして、キュー選択部16は、送信キュー23に入力された各パケットをどの内部キュー232に格納するかをデマルチプレクサ231に指示する。この時、キュー選択部16は、同じフローグループに属するパケットであれば同じ内部キュー232に格納するように指示する。また、キュー選択部16は、異なるフローグループに属するパケットであれば、それぞれ異なる内部キュー232に格納するように指示する。
例えば、送信キュー23が、内部キュー232として、内部キュー#1〜#4を有するとする。そして、図3に示すように、フローIDがF1及びF2であるフローが、FG1のフローグループに属し、フローIDがF3であるフローがFG2のフローグループに属する場合とする。この場合、キュー選択部16は、内部キュー#1〜#4の内、何れか一つ、例えば、内部キュー#1にFG1のフローグループのパケットを格納するとした場合、F1及びF2のフローに属するパケットは内部キュー#1に格納するようにデマルチプレクサ231に指示する。また、キュー選択部16は、FG2のフローグループのパケットを格納する内部キュー232として内部キュー#2〜#4のいずれか一つ、例えば、内部キュー#2を選択する。この場合、キュー選択部16は、F3のフローに属するパケットは内部キュー#2に格納するようにデマルチプレクサ231に指示する。
その後、FG1のフローグループが、制御部14により、FG3及びFG4に分割され、F1のフローはFG3のフローグループに属し、F2のフローはFG4のフローグループに属するように変更されたとする。この場合、キュー選択部16は、今までF1及びF2が属していたFG1のフローグループと、これからF1が属するFG3のフローグループ及びF2が属するFG4のフローグループとは異なるフローグループとして認識する。そこで、キュー選択部16は、FG3及びFG4のフローグループのそれぞれに内部キュー#3又は#4のいずれかをそれぞれ割り当てる。ここでは、キュー選択部16は、FG3のフローグループに内部キュー#3を割り当て、FG4のフローグループに内部キュー#4を割り当てる。そこで、キュー選択部16は、F1及びF2に属するパケットを内部キュー#1に格納させることは止め、F1に属するパケットを内部キュー#3に格納し、F2に属するパケットを内部キュー#4に格納するようにデマルチプレクサ231に指示する。これにより、内部キュー#1が使われないようになる。このように、キュー選択部16は、フローグループの情報を取得し、各フローグループにいずれかの内部キュー232を割り当てる。すなわち、内部キュー232とフローグループとは必ず1対1で対応する。
送信側メータカウンタ15は、各送信キュー23の各内部キュー232から出力されたパケットの情報を取得する。内部キュー232は、フローグループ毎に割り当てられるので、この情報は、フローグループ毎の出力されたパケットの情報にあたる。そして、送信側メータカウンタ15は、内部キュー232毎の単位当たりのパケットの送信量、すなわちフローグループ毎の単位時間あたりのパケットの送信量であるフローグループ送信量を算出する。
また、送信側メータカウンタ15は、内部キュー232毎に格納されているパケットサイズの合計を算出する。内部キュー232は、1つのフローグループに対応するので、この算出した値は、各フローグループの内部キュー232に格納されているサイズであるフローグループキュー長にあたる。すなわち、送信側メータカウンタ15は、フローグループキュー長を算出する。
また、送信側メータカウンタ15は、内部キュー232毎に廃棄されたパケットの数をカウントする。内部キュー232は、1つのフローグループに対応するので、このパケットの数は、フローグループ毎の破棄されたパケット数であるフローグループ廃棄数にあたる。すなわち、送信側メータカウンタ15は、フローグループ廃棄数を算出する。
そして、送信側メータカウンタ15は、算出したフローグループ送信量、フローグループキュー長及びフローグループ廃棄数をフローグループ統計情報としてフローグループ情報123に登録する。
また、送信側メータカウンタ15は、各内部キュー232の出力を監視し、フロー毎の送信量であるフロー送信量を算出する。また、送信側メータカウンタ15は、内部キュー232に格納されているフロー毎のサイズの合計であるフローキュー長を算出する。さらに、送信側メータカウンタ15は、フロー毎のパケットの廃棄数であるフロー廃棄数を算出する。そして、送信側メータカウンタ15は、算出したフロー送信量、フローキュー長及びフロー廃棄数をフロー統計情報としてフロー情報122に登録する。この、送信側メータカウンタ15及び上述した受信側メータカウンタ17が、「情報取得部」の一例にあたる。
制御情報送受信部11は、管理用サーバ2から構成定義を取得する。構成定義には、フロー識別情報211及びポリシー情報124が含まれる。また、構成定義には、キューの優先度及び平均パケット長が含まれる。
制御情報送受信部11は、フロー識別情報211及びポリシー情報124を記憶部12に格納する。また、制御情報送受信部11は、キューの優先度及び平均パケット長を制御部14へ出力する。
さらに、制御情報送受信部11は、フローの初期のグルーピングの情報及び送信キュー23の1ラウンドでの送出可能量を管理用サーバ2から取得する。そして、制御情報送受信部11は、フローの初期のフローグループの情報及び送信キュー23の1ラウンドでの送出可能量を制御部14へ出力する。
また、制御情報送受信部11は、フロー情報122及びフローグループ情報123を記憶部12から取得する。そして、制御情報送受信部11は、フロー情報122及びフローグループ情報123を管理用サーバ2へ送信する。
制御部14は、重み計算部114を有する。制御部14は、フローグループの作成による内部キュー232の使用状態の制御及びスケジューリングパラメータの調整による内部キュー232からの出力調整の制御を行う。
制御部14によるフローグループの作成について説明する。簡単に説明すると、制御部14は、フロー情報122、フローグループ情報123及びポリシー情報124を用いてフローのグルーピングを行い、フローグループを作成する。そして、制御部14は、作成したフローグループの情報をフロー管理情報121のフローグループ定義情報212に登録する。これにより、制御部14は、フローグループ毎の内部キュー232の割り当て、内部キュー232の分割及び結合などの再構成を制御する。以下に、制御部14によるフローグループの作成の詳細について説明する。
制御部14は、フローの初期のグルーピングの情報を制御情報送受信部11から取得する。そして、制御部14は、取得した初期のグルーピングの情報にしたがい、フロー管理情報121のフローグループ定義情報212に各フローに対応するフローグループを登録する。
次に、ある1つのフローグループについて分割を行う場合、すなわち内部キュー232を分割するための判定について説明する。制御部14は、分割の実行を決定するための、フローグループにおけるスループットと設定バンド幅との乖離率の分割閾値を予め記憶する。また、制御部14は、フローグループに属する各フローのスループット、すなわちフロー送信量をフロー情報122から取得する。さらに、制御部14は、フローグループに含まれる各フローの設定バンド幅をポリシー情報124から取得する。
そして、制御部14は、フローグループに属するフロー毎に、フローのスループットからフローの設定バンド幅を減算し、減算結果をフローの設定バンド幅で除算した値を求め、乖離率とする。乖離率は、フローのスループットが設定バンド幅からどのくらい離れているかを表す。ここで、乖離率をDflowとすると、Dflow=(フローのスループット−フローの設定バンド幅)/フローの設定バンド幅と表される。
次に、制御部14は、算出した乖離率の中で正の値を有するものの合計を求め、フローグループの乖離率とする。例えば、フローグループの乖離率をDFGとすると、DFG=Σflow∈FGmax(Dflow,0)と表される。
そして、制御部14は、フローグループの乖離率が分割閾値を超えたか否かを判定する。制御部14は、フローグループの乖離率が分割閾値を超えた場合、すなわち、「DFG>分割閾値」をみたす場合、そのフローグループの分割を決定する。
制御部14は、分割を決定したフローグループに属するフローの中で、乖離率が正の値を有するフローをまとめて1つのフローグループとする。さらに、制御部14は、分割を決定したフローグループに属するフローの中で残ったフローをまとめて他の1つのフローグループとする。例えば、フローグループFG1をFG3及びFG4に分割する場合、FG3={[Dflow>0]となるフロー},FG4=FG1−FG3と表される。ただし、このグルーピング方法は一例であり、フローグループに属するフローを複数のグループに分けることができれば他の方法でもよい。
例えば、図6を参照して、制御部14によるフローグループの分割について説明する。図6は、フローグループの分割を説明するための図である。図6における状態301は、分割前の状態を表す。また、状態302は、分割後の状態を表す。ここで、図6では、使用しない内部キュー232は図示していない。また、図6におけるA〜Dは、それぞれがフローA〜Dに含まれるパケットを表す。
状態301では、フローグループFG1にフローA〜Cが含まれる。ここでは、このようなフローグループとフローの状態をFG1={A,B,C}と表す。また、フローグループFG2にフローDが含まれる。これは、FG2={D}と表される。
ここで、フローグループFG1の分割を例に、制御部14による分割を説明する。制御部14は、フローA〜Cの乖離率(Dflow)を計算する。ここで、フローA〜Cの乖離率を、それぞれDA〜DCとする。さらに、制御部14は、フローグループFG1の乖離率DFG1を求める。そして、制御部14は、フローグループFG1の乖離率DFG1が分割閾値を超えた場合、フローグループFG1を分離する。このとき、DA>0,DB≦0,DC≦0だとすると、制御部14は、状態302のように、分割後のフローグループFG3にフローAを属させ、フローグループFG4にフローB及びCを属させる。すなわち、分割後のフローグループは、FG3={A}及びFG4={B,C}となる。
次に、ある複数のフローグループについて結合を行う場合、すなわち内部キュー232を結合するための判定について説明する。制御部14は、分割を行うにあたり使用可能な内部キュー232の数の上限を超えてしまう場合、キューの結合の実行を決定する。
ここでは、制御部14は、結合するフローグループに属するフローを新たなフローグループに属させる。これにより、結合前のフローグループに属していたフローは全て新しいフローグループに属することになる。この後、結合前のフローグループに割り当てられた内部キュー232に格納されていたパケットが全て出力されると、その内部キュー232は空になり、未使用の状態となる。これに対して、結合前のフローグループに属していたフローに含まれるパケットは、新しく作成されたフローグループに割り当てられた内部キュー232に格納されていく。このようにして、制御部14は、複数のフローグループを1つのフローグループにまとめる。
例えば、図7を参照して、制御部14によるフローグループの結合について説明する。図7は、フローグループの結合を説明するための図である。図7における状態303は、結合前の状態を表す。また、状態304は、結合後の状態を表す。ここで、図7では、使用しない内部キュー232は図示していない。また、図7におけるA〜Dは、それぞれがフローA〜Dに含まれるパケットを表す。
例えば、フローグループFG1及びFG2を結合してフローグループFG4とする場合について説明する。状態303では、フローグループFG1にフローAが属し、フローグループFG2にフローB及びCが属し、フローグループFG3にフローDが属するものとする。すなわち、FG1={A}、FG2={B,C}及びFG3={D}と表される。
制御部14は、フローグループFG4を作成する。そして、制御部14は、フローグループFG4にフローA〜Cを属させる。すなわち、FG4={A,B,C}となる。このとき、送信キュー23は状態304の状態となる。これにより、フローグループFG1及びFG2に割り当てられていた2つの内部キュー232が未使用となり、代わりにフローグループFG3に割り当てられた内部キュー232が使用中になる。すなわち、この結合により未使用の内部キュー232が1つ増える。
次に、制御部14によるスケジューリングパラメータ125の登録について説明する。制御部14は、予め送信キュー23毎に、その送信キュー23に含まれる内部キュー232のキュー番号を有する。例えば、送信キュー23にN個の内部キュー232が存在する場合、送信キュー23は、内部キュー232のキュー番号として#1〜#Nを有する。
また、制御部14は、送信キュー23に含まれる各内部キュー232の優先度及び平均パケット長の入力を制御情報送受信部11から受ける。
最初のスケジューリングパラメータ125の設定の場合、制御部14は、内部キュー232に割り当てられたキュー番号に対応させて優先度、重み及び平均パケット長をスケジューリングパラメータ125に登録する。ここで、最初の登録では、各内部キュー232の重みは全て同じでもよい。
その後、制御部14は、重み計算部114により内部キュー232の重みを算出する。以下に、1つの内部キュー232を例に、重み計算部114による重みの算出について説明する。ここでは、フローグループFG1に割り当てられた内部キュー232のバンド幅の設定を求める場合について説明する。重み計算部114は、廃棄閾値及びキュー長閾値を予め記憶する。
重み計算部114は、初期状態として、例えば、各内部キュー232をそれぞれ等しい重みとする。その後、重み計算部114は、フローグループFG1の各フローの設定バンド幅をポリシー情報124から取得する。そして、重み計算部114は、フローグループに属するフローの設定バンド幅の合計を算出し、内部キュー232のバンド幅とする。ここで、内部キュー232のバンド幅をBqとし、フローグループFG1に属するフローをflowとし、さらにflowのバンド幅をBWflowとする。このとき、重み計算部114は、Bq=Σflow∈FG1BWflowという式を用いて内部キュー232のバンド幅を算出する。
さらに、重み計算部114は、送信キュー23に含まれる全ての内部キュー232のバンド幅の合計を送信キュー23の全体のバンド幅とする。すなわち、送信キュー23の全体のバンド幅をSとし、対象とする送信キュー23に含まれる内部キュー232をqとし、その集合をQとすると、重み計算部114は、S=Σq∈QBqという式を用いて送信キュー23の全体のバンド幅を算出する。
次に、重み計算部114は、対象とする送信キュー23が繋がる送信ポート24のバンド幅が、算出した送信キュー23の全体のバンド幅(S)よりも大きい場合、各内部キュー232のバンド幅の正規化を行う。具体的には、重み計算部114は、各内部キュー232のバンド幅(Bq)を算出した送信キュー23の全体のバンド幅(S)で除算する。そして、送信ポート24のバンド幅をBWLとすると、重み計算部114は、除算結果に送信ポート24のバンド幅(BWL)を乗算した値を正規化後の内部キュー232のバンド幅とする。すなわち、正規化された内部キュー232のバンド幅をBWqとすると、重み計算部114は、BWq=(Bq/S)×BWLという式を用いて、正規化された内部キュー232のバンド幅を求める。
これに対して、対象とする送信キュー23が繋がる送信ポート24のバンド幅が、算出した送信キュー23の全体のバンド幅(S)以下の場合、重み計算部114は、算出した内部キュー232のバンド幅(Bq)を正規化後のバンド幅とする。
重み計算部114は、各内部キュー232に割り当てられたフローグループのフローグループ送信量、フローグループキュー長及びフローグループ廃棄数をフローグループ情報123から取得する。そして、重み計算部114は、フローグループ送信量と算出した内部キュー232の設定バンド幅とを比較する。フローグループ送信量が内部キュー232の設定バンド幅よりも小さい場合、重み計算部114は、その内部キュー232の重みを増加させる。また、フローグループ送信量が内部キュー232の設定バンド幅と同じ場合、重み計算部114は、その内部キュー232の重みを維持する。また、フローグループ送信量が内部キュー232の設定バンド幅よりも大きい場合、重み計算部114は、その内部キュー232の重みを減少させる。
また、重み計算部114は、フローグループ廃棄数と廃棄閾値とを比較する。フローグループ廃棄数が廃棄閾値よりも大きい場合、重み計算部114は、その内部キュー232の重みを増加させる。また、フローグループ廃棄数が廃棄閾値と同じ場合、重み計算部114は、その内部キュー232の重みを維持する。また、フローグループ廃棄数が廃棄閾値よりも小さい場合、重み計算部114は、その内部キュー232の重みを減少させる。
また、重み計算部114は、フローグループキュー長とキュー長閾値とを比較する。フローグループキュー長がキュー長閾値よりも大きい場合、重み計算部114は、その内部キュー232の重みを増加させる。また、フローグループキュー長がキュー長閾値と同じ場合、重み計算部114は、その内部キュー232の重みを維持する。また、フローグループキュー長がキュー長閾値よりも小さい場合、重み計算部114は、その内部キュー232の重みを減少させる。
ここで、重み計算部114による内部キュー232の重みの算出の一例についてさらに具体的に説明する。ここでは、現在の内部キュー232の重みをWCURRENTとし、新しく算出する重みをWNEWとする。この場合、重み計算部114は、内部キュー232の重みの算出に用いるための、スループットの重み(Kt)、破棄パケット数の重み(Kd)及びキュー長の重み(Kq)の入力を制御情報送受信部11から受ける。そして、重み計算部114は、フローグループ送信量(TP:Throughput)から設定バンド幅(設定BW:Band Width)を減算した値にスループットの重みを乗算した値を算出する。また、重み計算部114は、フローグループの廃棄数(Drop)から廃棄閾値を減算した値に破棄パケット数の重みを乗算した値を算出する。また、重み計算部114は、フローグループキュー長(Qlen:Q Length)からキュー長閾値を減算した値にキュー長の重みを乗算した値を算出する。そして、重み計算部114は、算出した3つの値を現在の重みに加算することで、新しい重みを算出する。すなわち、重み計算部114は、WNEW=WCURRENT+Kt(TP−設定BW)+Kd(Drop−Drop閾値)+Kq(Qlen−Qlen閾値)を計算することで、内部キュー232の新しい重みを算出する。
また、重み計算部114による内部キュー232の重みの算出の他の例ついては以下のような方法でもよい。重み計算部114は、フローグループ送信量から設定バンド幅を減算した値、フローグループの廃棄数から廃棄閾値を減算した値、フローグループキュー長からキュー長閾値を減算した値をキーとして、重みの変更値を決定するための3次元テーブルを有する。そして、重み計算部114は、算出した値をキーとして、3次元テーブルから重みの変更値を求める。そして、重み計算部114は、現在の重みに重みの変更値を加算して新しい重みを算出する。
図8は、重み計算における重みの変更の規則の一例を表す図である。以上に説明したように、図8に示す規則にしたがい、重み計算部114は、各内部キュー232におけるフローグループ送信量、フローグループ廃棄数及びフローグループキュー長を用いて、内部キュー232の重みを決定する。そして、重み計算部114は、求めた内部キュー232の重みを送信キュー23内で正規化して各内部キュー232の重みとする。例えば、内部キュー232として#1〜#4まである場合、正規化前の重みをW#1〜#4とすると、キュー番号が#1の内部キュー232の正規化後の重みは、W#1/(W#1+W#2+W#3+W#4)と表される。
そして、制御部14は、重み計算部114が算出した各内部キュー232の重みをスケジューリングパラメータ125に登録する。このように、制御部14は、フローグループの統計情報を用いて、各内部キュー232の状態に合わせて内部キュー232の重みを変更していく。この制御部14が、「グルーピング部」の一例にあたる。
スケジューラ13は、スケジューリングパラメータ125を用いてパケットを出力させる内部キュー232の順番を決定する。そして、スケジューラ13は、決定した順番にしたがいマルチプレクサ233に内部キュー232からパケットを取得させる。これにより、スケジューラ13は、公平性を維持しつつフローの出力を調整する。
具体的には、スケジューラ13は、スケジューリングパラメータ125における各内部キュー232の優先度を参照する。ここでは、上述したように、3を基準の優先度、7〜4を基準の優先度に優先する優先度、2〜0を基準の優先度より低い優先度とする。スケジューラ13は、まず、優先度が7〜4の内部キュー232の中で優先度が高いものからパケットの出力を行う。
次に、スケジューラ13は、優先度が3の内部キュー232の中で、WRR(Weight Round Robin)又はDDR(Deficit Round Robin)を用いてパケットを出力させる内部キュー232の順番を決定する。
例えば、WRRを用いる場合、スケジューラ13は、スケジューリングパラメータ125から内部キュー232の重み及び平均パケット長を取得する。そして、スケジューラ13は、内部キュー232の重みを内部キュー232の平均パケット長で除算して、内部キュー232の正規化された重みを算出する。
次に、スケジューラ13は、算出した正規化された重みの中から最小値を特定する。さらに、スケジューラ13は、各内部キュー232の正規化された重みを重みの最小値で除算して、内部キュー232毎の送信パケット数を求める。そして、スケジューラ13は、求めた送信パケット数分のパケットがそれぞれの内部キュー232から出力されるように、内部キュー232の出力順を決定する。そして、スケジューラ13は、決定した出力順で内部キュー232からパケットを取得するようにマルチプレクサ233を制御する。また、スケジューラ13は、内部キュー232が空になった場合、その内部キュー232からのパケットの取得の停止をマルチプレクサ233に指示する。
また、例えば、DRRを用いる場合、スケジューラ13は、1ラウンドでの送出可能量を制御情報送受信部11から取得する。そして、スケジューラ13は、内部キュー232の重みに送出可能量を乗算して各内部キュー232の1ラウンドあたりの通信量を算出する。
次に、スケジューラ13は、各内部キュー232の算出した1ラウンドあたりの通信量をスケジューリングパラメータ125のカウンタの領域に設定する。そして、スケジューラ13は、ある内部キュー232に出力可能なパケットが存在し、且つカウンタ数が負でなければ、その内部キュー232からパケットを取得するようにマルチプレクサ233を制御する。そして、スケジューラ13は、カウンタから出力した分のパケットの大きさを減算する。そして、ラウンドの最後に、スケジューラ13は、内部キュー232の重みに送出可能量を乗算した値をカウンタに登録する。スケジューラ13は、1ラウンドあたりの通信量の算出、カウンタの登録及びカウンタを減らしながらのパケットの出力の指示を出力するパケットがなくなるまで繰り返す。
そして、スケジューラ13は、優先度が3の内部キュー232のパケットの出力が終わると、次に、優先度が0〜2の内部キュー232の優先度にしたがって、パケットを出力させる。このスケジューラ13が、「スケジューリング部」の一例にあたる。
次に、図9を参照して、本実施例に係るスイッチ1におけるパケット転送の全体的な流れについて説明する。図9は、実施例1に係るスイッチにおけるパケット転送処理のフローチャートである。
受信ポート21は、外部の情報処理装置からパケットを受信する(ステップS1)。そして、受信ポート21は、受信したパケットをスイッチング部22へ出力する。
フロー識別部18は、受信ポート21からスイッチング部22へ出力されたパケットの送信元IPアドレス、送信先IPアドレス、送信先ポート番号、送信元ポート番号及びプロトコル番号を取得する。そして、フロー識別部18は、取得した情報に対応するフローIDをフロー管理情報121に含まれるフロー識別情報211から取得し、各パケットが属するフローを特定する(ステップS2)。フロー識別部18は、各パケットが属するフローのフローIDをスイッチング部22へ出力する。
スイッチング部22は、パケットの入力を受信ポート21から受ける。また、スイッチン部22は、受信したパケットが属するフローのフローIDをフロー識別部18から取得する。そして、スイッチング部22は、フロー管理情報121のフローグループ定義情報212から各パケットのフローグループを特定する。そして、スイッチング部22は、特定したフローグループにしたがい各パケットを出力する送信キュー23を決定し、決定した送信キュー23へ各パケットを送信する(ステップS3)。
キュー選択部16は、フロー管理情報121のフローグループ定義情報212から各パケットのフローグループを特定する。そして、キュー選択部16は、特定したフローグループに内部キュー232が割り当てられていない場合、未使用の内部キュー232の中から1つ選択しフローグループに割り当てる。そして、キュー選択部16は、フローグループ毎に、割り当てられた内部キュー232へパケットを格納する(ステップS4)。
制御部14の重み計算部114は、フローグループ送信量、フローグループキュー長及びフローグループ廃棄数を用いて各内部キュー232それぞれの重みを算出する。そして、制御部14は、重み計算部114により算出された内部キュー232の重みをスケジューリングパラメータ125へ登録し、スケジューリングパラメータ125を変更する(ステップS5)。
スケジューラ13は、スケジューリングパラメータ125から優先度を取得し、優先度が基準の優先度より高い内部キュー232のパケットを基準の優先度の内部キュー232より先に出力することを決定する。次に、スケジューラ13は、基準の優先度を有する内部キュー232において、内部キュー232の重みや内部キュー232の平均パケット長を取得し、カウンタを用いて、WRR又はDRRなどによりパケット送信のスケジュールを決定する。さらに、スケジューラ13は、優先度が基準の優先度より低い内部キュー232のパケットを基準の優先度の内部キュー232の後に出力することを決定する(ステップS6)。そして、スケジューラ13は、決定したスケジュールにしたがい内部キュー232からパケットを取得するようにマルチプレクサ233に指示する。
マルチプレクサ233は、スケジューラ13からの指示にしたがいパケットを取得する内部キュー232からパケットを取得し、送信ポート24を介して宛先の外部装置へパケットを送信する(ステップS7)。
その後、スケジューラ13及び制御部14は、スイッチ1の動作を終了するか否かを判定する(ステップS8)。スイッチ1の動作を終了しない場合(ステップS8:否定)、処理はステップS1へ戻る。
これに対して、スイッチ1の動作を終了する場合(ステップS8:肯定)、スケジューラ13及び制御部14は、パケットの転送処理を終了する。
次に、図10を参照して、制御部14によるフローグループの再構成の処理の流れについて説明する。図10は、フローグループの再構成の処理のフローチャートである。
制御部14は、フロー識別情報211を基にフローを識別し、各フローを含む初期のフローグループを作成する。そして、制御部14は、フローグループ定義情報212に各フローに対応するフローグループを登録する(ステップS11)。
その後、制御部14は、フローの送信量をフロー情報122から取得する。また、制御部14は、フローの設定バンド幅をポリシー情報124から取得する。そして、制御部14は、フローの送信量及びフローの設定バンド幅から乖離率を求める。さらに、制御部14は、求めた乖離率からフローグループ乖離率を算出する。そして、制御部14は、フローグループ乖離率が分割閾値を超えているか否かを判定する(ステップS12)。
フローグループ乖離率が分割閾値を超えていない場合(ステップS12:否定)、制御部14は、ステップS17へ進む。
これに対して、フローグループ乖離率が分割閾値を超えた場合(ステップS12:肯定)、制御部14は、フローグループを分割することを決定する(ステップS13)。
次に、制御部14は、分割により使用する内部キュー232の数が使用できる内部キュー232の数の上限を超えるか否かを判定する(ステップS14)。使用する内部キュー232の数が上限を超えない場合(ステップS14:否定)、制御部14は、ステップS16へ進む。
これに対して、使用する内部キュー232の数が上限を超える場合(ステップS14:肯定)、制御部14は、異なるフローグループに属する複数のフローが1つのフローグループに属するようにフローグループ定義情報212を変更してフローグループの結合を実行する(ステップS15)。具体的には、キュー選択部16が、変更されたフローグループ定義情報212にしたがってパケットの格納先をデマルチプレクサ231に指示することで、フローグループの結合が実現される。
次に、制御部14は、1つのフローグループに属する複数のフローが異なる複数のフローグループに属するようにフローグループ定義情報212を変更してフローグループの分割を実行する(ステップS16)。具体的には、キュー選択部16が、変更されたフローグループ定義情報212にしたがってパケットの格納先をデマルチプレクサ231に指示することで、フローグループの分割が実現される。
その後、制御部14は、スイッチ1の動作を終了するか否かを判定する(ステップS17)。スイッチ1の動作を終了しない場合(ステップS17:否定)、制御部14は、ステップS12に戻る。これに対して、スイッチ1の動作を終了する場合(ステップS17:肯定)、制御部14は、フローの再構成処理を終了する。
ここで、図9のステップS3及びS4における処理は、例えば、図10のフローにより定期的に更新されるフローグループ定義情報212が用いられる。
以上に説明したように、本実施例に係るスイッチは、フローグループに属する各フローのスループットが低下した場合に、そのフローグループを分割し、WRRやDRRなどにより各内部キューからパケットを出力する。これにより、スループットが低下したフローが複数の内部キューに格納されることになり、出力される確率が上昇する。したがって、スループットが低下したフローのスループットを向上させることができ、スイッチとしての全体的な通信性能の向上及びネットワーク資源のフェアな共有を実現することができる。
また、本実施例に係るスイッチは、優先度に応じてパケットを出力させる内部キューを選択するため、優先度に適合した通信品質を実現することができる。
(変形例)
次に、実施例1の変形例について説明する。実施例1では、送信側メータカウンタ15がフローの統計情報を取得してフロー情報121に格納した。しかし、フローグループとして同じ内部キュー232に格納されたフロー毎の統計情報を取得することは困難な場合が多い。そこで、本変形例に係る制御部14は、フローグループの統計情報から送信側のフローの統計情報を算出することが実施例1と異なる。本実施例に係るスイッチ1も図1のブロック図で表される。以下の説明では、実施例1と同じ各部の機能については説明を省略する。
送信側メータカウンタ15は、各送信キュー23の各内部キュー232から出力されたパケットに関する情報を取得する。そして、送信側メータカウンタ15は、フローグループ送信量、フローグループキュー長及びフローグループ廃棄数を算出する。
そして、送信側メータカウンタ15は、算出したフローグループ送信量、フローグループキュー長及びフローグループ廃棄数をフローグループ統計情報としてフローグループ情報123に登録する。
これに対して、本実施例では、送信側メータカウンタ15は、フロー毎の統計情報は取得しない。すなわち、フロー情報122には、送信側のフローの統計情報は格納されない。
制御部14は、フローグループ送信量、フローグループキュー長及びフローグループ廃棄数をフローグループ情報123から取得する。さらに、制御部14は、フロー情報122からフローの受信量を取得する。さらに、制御部14は、フローグループ定義情報212から各フローグループを構成するフローを特定する。
次に、制御部14は、フローの受信量をそのフローが属するフローグループに属するフローの受信量の総和で除算し、フローの重みを算出する。このフローの重みは、そのフローが属するフローグループの中で、そのフローがどの程度の割合を占めるかを表す。そして、制御部14は、フローグループ送信量に算出したフローの重みを乗算して、フロー送信量を算出する。また、制御部14は、フローグループキュー長に算出したフローの重みを乗算して、フローキュー長を算出する。また、制御部14は、フローグループ廃棄数にフローの重みを乗算して、フロー廃棄数を算出する。そして、制御部14は、算出したフロー送信量、フローキュー長及びフロー廃棄数をフロー情報122に登録する。
さらに、制御部14は、算出したフロー送信量を用いてフローグループの再構成を行う。
以上に説明したように、本実施例に係るスイッチは、フローグループの統計情報からフロー毎の統計情報を算出する。すなわち、本実施例に係るスイッチは、送信キューからのフロー毎の統計情報が取得困難な場合でも、フロー送信量が算出でき実施例1と同様にグルーピングを行うことができ、通信性能の向上及びネットワーク資源のフェアな共有を実現することができる。
次に、実施例2について説明する。本実施例に係るスイッチ1は、基準の優先度を有する内部キュー232に対して、スケジューラ13が、DRRに改良を加えたアルゴリズムを用いて送信要求を取得する内部キュー232を決定する。次に、スケジューラ13は、送信要求を取得する内部キュー232の中からパケットを出力する内部キュー232を選択する。そして、スケジューラ13は、送信要求の取得及びパケットを出力する内部キュー232の選択を繰り返す。本実施例に係るスイッチ1も図1のブロック図で表される。また、以下の説明では、実施例1と同様の各部の機能については説明を省略する。
まず、送信要求を取得する内部キュー232の決定について説明する。スケジューラ13は、各内部キュー232の1ラウンドの送出可能量を制御情報送受信部11から取得する。また、スケジューラ13は、制御部14によって変更される内部キュー232の重みをスケジューリングパラメータ125から取得する。
次に、スケジューラ13は、内部キュー232の1ラウンドの送出可能量に内部キュー232の重みを乗算する。そして、スケジューラ13は、算出した値をカウンタ値としてスケジューラ13のカウンタの領域に設定する。これにより、スケジューラ13は、内部キュー232の重みに応じたカウンタ値の設定が行える。
次に、スケジューラ13は、パケットの出力を指示する送信キュー23が有する内部キュー232を全て抽出する。
次に、スケジューラ13は、抽出した内部キュー232に格納されたパケットの情報を取得し、抽出した内部キュー232の中でパケットが有る内部キュー232を特定する。
さらに、スケジューラ13は、特定した内部キュー232のそれぞれのカウンタ値が0より大きいか否かを判定する。カウンタ値が0より大きい内部キュー232があれば、スケジューラ13は、その内部キュー232から送信要求を取得する。その後、スケジューラ13は、送信要求を取得した内部キュー232の中からパケットを出力する内部キュー232を選択する。
そして、スケジューラ13は、選択した内部キュー232からのパケットの出力をマルチプレクサ233に指示する。マルチプレクサ233は、スケジューラ13から指示された内部キュー232からパケットを取得し、送信ポート24へ出力する。
また、スケジューラ13は、送信パケット長を取得する。そして、スケジューラ13は、スケジューリングパラメータ125におけるパケットを出力させた内部キュー232のカウンタから送信パケット長を減算する。
その後、スケジューラ13は、送信キュー23に含まれる内部キュー232の内、選択されていない内部キュー232があるか否かを判定する。洗濯されてない内部キュー232がある場合、スケジューラ13は、選択されていない内部キュー232を抽出、送信要求の取得、内部キュー232の選択、パケットの出力及びカウンタからの平均パケット長の減算の処理を繰り返す。
また、送信キュー23に含まれる全ての内部キュー232を選択した場合、スケジューラ13は、パケットの残る内部キュー232のカウンタが全て0以下か否かを判定する。パケットの残る内部キュー232の中でカウンタが0より大きいものが存在する場合、スケジューラ13は、内部キュー232の選択履歴を消去し、内部キュー232の未選択の状態に戻る。その後、スケジューラ13は、選択されていない内部キュー232を抽出、送信要求の取得、内部キュー232の選択、パケットの出力及びカウンタからの平均パケット長の減算の処理を繰り返す。
これに対して、パケットの残る内部キュー232のカウンタ値が全て0以下の場合、スケジューラ13は、パケットの出力処理を終了する。その後、スケジューラ13は、カウンタの設定から上記処理を繰り返す。
次に、本実施例に係るスケジューラ13による送信要求を取得した内部キュー232からのパケットを出力させる内部キュー232の選択について説明する。ここで、スイッチ1では、制御部14によりフローグループの分割及び結合といった再構成が行われる。その場合、スケジューラ13は、再構成中の内部キュー232の集合からパケットを出力する内部キュー232を選択する1段目の選択を行う。さらに、スケジューラ13は、1段目で選択された内部キュー232と1段目に含まれない内部キュー232との中からパケットを出力する内部キュー232を選択する2段目の選択を行う。このように、スケジューラ13は、2段階の選択を含むスケジューリングを行う。そこで、この2段階の選択を含むスケジューリングについて詳細に説明する。以下では、1段目の選択は内部キュー232の優先度に応じて選択を行うので、1段目の選択を「優先度選択」という。また、2段目の選択はラウンドロビンを基にした選択なので「ラウンドロビン選択」という。
まず、スケジューラ13は、パケットが格納されており、カウンタが0より大きい値を有する内部キュー232を送信可能なパケットがある内部キュー232と判定する。そして、スケジューラ13は、送信可能な内部キュー232から送信要求を取得する。
例えば、送信キュー23に内部キュー232が4本ある場合で説明する。以下では、各内部キュー232にそれぞれ0〜3番の番号を振り、それぞれを内部キュー#0〜#3とする。そして、内部キュー#0の送信要求はX[0]とし、内部キュー#1の送信要求はX[1]とし、内部キュー#2の送信要求はX[2]とし、内部キュー#3の送信要求はX[3]とする。さらに、送信要求の値が1の場合、送信要求があるとし、送信要求の値が0の場合、送信要求が無いとする。また、以下の説明で、単に「X」と記した場合、X[0]〜X[3]の値を並べた4ビットの信号を表すものとする。このXが、上述したDRRに改良を加えたアルゴリズムを用いてスケジューラ13により取得される送信要求にあたる。
スケジューラ13は、このXを入力として次にサービスする内部キュー232、すなわち次にパケットを出力させる内部キュー232を選択する。
送信要求Xに対するスケジューラ13からのパケットを出力させる内部キュー232を示す応答をYとする。また、1段目の優先度選択の対象となりうる内部キュー232を4ビットの2進数表記で表すパラメータをSとする。例えば、S=4’b0111と表される。ここで、W’bnnnnは、nが2進数であり、Wビットの2進数表記を表すものとする。すなわち、Sは、nnnnの部分で後ろから順に内部キュー#0,1,2,3を表し、優先度選択の対象となりうる内部キュー232に対応する値が1となる。例えば、S=4’b0111であれば、内部キュー#1〜#3が1段目の選択の対象となる内部キュー232である。以下では、優先度選択の対象となりうる内部キュー232を、「1段目内部キュー232」という。また、優先度選択候補の内部キュー232以外の内部キュー232を、「2段目内部キュー232」という。
スケジューラ13は、1段目内部キュー232を表す情報Sを制御部14から取得する。スケジューラ13は、送信要求Xに対するパケットを出力させる内部キュー232を示す応答Yとして、Y=(K&S)?SP(X1):Kという応答を返す。ここで、X1=X&Sである。「&」は、論理積を表す。すなわち、X1は、1段目内部キュー232で、且つ送信可能なパケットがある内部キュー232を示す。例えば、X1=0は、1段目内部キュー232が無いことを示す。また、X2=X&NOT(S)である。「NOT(S)」は、Sを反転したものを表し、例えば、NOT(4’b0111)=4’b1000である。すなわち、X2は、2段目内部キュー232を表す。X2=0であれば、1段目内部キュー232しかないことになる。また、C=(X1)?SP(S):0である。(X1)?SP(S):0は、三項演算子を表し、X1≠0のときは、C=SP(S)であり、X1=0のときは、C=0となる。また「|」は、論理和を表す。さらに、K=RR(C|X2)である。「SP」及び「RR」については後で説明する。スケジューラ13は、KとSの論理積が0でなければ、Y=SP(X1)を応答として返し、KとSの論理積が0であれば、Y=RR(C|X2)を返す。
ここで、SP(X)はXの中から最も優先度の高い内部キュー232を選択する関数である。例えば、Y=SP(X)とした場合、Y[0]=X[0],Y[1]=NOT(X[0])&X[1],Y[2]=NOT(X[0])&NOT(X[1])&X[2],Y[3]=NOT(X[0])&NOT(X[1])&NOT(X[2])&X[3]となる。ここで、Y[0]〜[3]は、スケジューラ13からの応答であれば、それぞれ内部キュー#0〜#3への応答である。すなわち、スケジューラ13は、値が1の内部キュー232にパケットを出力させ、値が0の内部キュー232にはパケットを出力させない。この場合、SP(X1)は、内部キュー#0の優先度を最も高くし、内部キュー#1,#2,#3の順に優先度を低くして、スケジューラ13は、優先度の高い順に内部キュー232を選択する。
さらに、SP(S)は、1段目内部キュー232全てを対象として優先度の最も高い内部キュー232を選択することを表す。
また、Y=RR(X)は、以下に示す関数である。Y=C1|C2であり、C1=SP(X11),C2=(SP(X11)==0)?SP(X22):0である。ここで、「==」は、左辺と右辺を比較し、等しいときは1となり等しくないときは0となる。そして、X11=X&R1,R1=NEXT(R)である。ここで、Rは、前回の結果を4’bnnnnで表した値であり、「NEXT」は、図11で表される関数である。図11は、関数「NEXT」を説明するための図である。さらに、X22=X&R2,R2=NOT(R1)である。すなわち、X11は、R1の中で送信要求のあるものを表す。また、X22は、R2の中で送信要求のあるものを表す。
すなわち、スケジューラ13は、内部キュー232の内前回パケットを出力させたものより番号が大きい内部キュー232のグループと、前回パケットを出力させたもの以下の番号の内部キュー232のグループに分け、それぞれで優先度が高いものを選択する。そして、前回パケットを出力させた内部キュー232を含まないグループの内部キュー232を優先して選択する。その後、スケジューラ13は、前回のY=RR(X)で得られた結果をRとして保持し、次の選択時に使用する。
まとめると、スケジューラ13は、SP(X1)を優先度選択として、1段目内部キュー232の中から優先度の高い内部キュー232を選択する。さらに、スケジューラ13は、関数RRで、優先度選択で選ばれた内部キュー232と2段目内部キュー232との間でラウンドロビン選択を行う。そして、スケジューラ13は、ラウンドロビン選択までを行った場合の選択結果が、1段目内部キュー232であれば、優先度選択で選ばれた内部キュー232をパケットを出力する内部キュー232として選択させる。これに対して、ラウンドロビン選択を行った場合の選択結果が、1段目内部キュー232でなければ、ラウンドロビン選択で選ばれた内部キュー232をパケットを出力する内部キュー232として選択させる。これにより、スケジューラ13は、優先度の高い内部キュー232を優先度選択で選択し、その選択された内部キュー232と2段目内部キュー232との間でラウンドロビンを用いてパケットを出力する内部キュー232を選択する。
ここで、以上の説明は、内部キュー#0が最優先であり、#1〜#3の順で優先度が低い場合のスケジューリングである。しかし、実際には、優先度がキュー番号の順番になるとは限らない。そこで、スケジューラ13は、優先度に応じて以下の論理で組み替えを行う。
例えば、送信キュー23が内部キュー232を4つ有する場合、スケジューラ13は、Y=XCHG(X,P0,P1,P2,P3)として優先度に応じた組み換えを行う。ここで、Xは、送信要求である。また、P0〜3は、それぞれ各内部キュー#0〜#3の優先度を4ビットの2進数表記で表した値である。4ビットの内の右側のビットほど優先度が高いことを表す。例えば、P0=4‘b0010,P1=4‘b0100,P2=4‘b1000,P3=4‘b0001であれば、内部キュー#3の優先度が最も高いことを表す。また、以下では、Pn[k]は、Pnの右からk番目のビットを表す。
そして、Y[0]=X[0]&P0[0]|X[1]&P0[1]|X[2]&P0[2]|X[3]&P0[3]となる。また、Y[1]=X[0]&P1[0]|X[1]&P1[1]|X[2]&P1[2]|X[3]&P1[3]となる。また、Y[2]=X[0]&P2[0]|X[1]&P2[1]|X[2]&P2[2]|X[3]&P2[3]となる。また、Y[3]=X[0]&P3[0]|X[1]&P3[1]|X[2]&P3[2]|X[3]&P3[3]となる。
すなわち、スケジューラ13は、上記関数で優先度に合わせてビットの順番を入れ替え、優先度が高い内部キュー232の順に4ビットの左側から送信要求が並ぶように変更する。そして、スケジューラ13は、順番を入れ替えた送信要求を用いてパケットを出力させる内部キュー232を選択する。その後、スケジューラ13は、上記関数を用いて元の状態にビットの順番を入れ替える。そして、スケジューラ13は、元の状態に入れ替えたビットの状態を用いてマルチプレクサ233に内部キュー232を選択させる。
次に、図12を参照して、本実施例に係るスイッチのフローグループの分割時のパケットの出力について説明する。図12は、実施例2に係るスイッチのフローグループ分割時のパケットの出力を説明するための図である。図12の状態311は、分割前の状態を表す。状態312は、分割中の状態を表す。状態313は、分割後の状態を表す。
状態311では、分割前であるので、スケジューラ13は、優先度選択は行わず、ラウンドロビン選択のみを行う。状態311では、フローグループFG1にフローA及びフローBが属する。そして、フローグループFG1に割り当てられた内部キュー232が、フローAのパケットA1及びフローBのパケットB1を格納する。また、フローグループFG2にフローCが属する。そして、フローグループFG2に割り当てられた内部キュー232は、フローCのパケットC1及びC2を格納する。
状態311の状態で、制御部14がフローグループFG1の分割を開始する。この場合、制御部14は、新たにフローAが属するフローグループFG3及びフローBが属するフローグループFG4を作成する。そして、送信キュー23は、状態312に遷移する。状態312では、マルチプレクサ233Aが、優先度選択を行い、マルチプレクサ233Bが、ラウンドロビン選択を行う。フローグループFG3は、新たに入力されたフローAのパケットA2を格納する。また、フローグループFG4は、新たに入力されたフローBのパケットB2を格納する。制御部14は、分割前のフローグループFG1の優先度を、分割後のフローグループFG3及びFG4より高くする。
スケジューラ13は、フローグループFG1、FG3及びFG4の中で、最も優先度の高いフローグループに割り当てられた内部キュー232をマルチプレクサ233Aに選択させる。この場合、フローグループFG1に割り当てられた内部キュー232の優先度が高いので、マルチプレクサ233Aは、フローグループFG1の中のパケットがなくなるまでフローグループFG1に割り当てられた内部キュー232を選択する。これにより、送信キュー23から出力されるパケットの順番が入力された順番に維持される。さらに、スケジューラ13は、マルチプレクサ233Aが選択した内部キュー232及びフローグループFG2に割り当てられた内部キュー232の中からラウンドロビン選択によりマルチプレクサ233Bに内部キュー232を選択させる。そして、マルチプレクサ233Bは、選択した内部キュー232からパケットを取得し送信ポート24へ出力する。例えば、マルチプレクサ233Aが選択した内部キュー232の選択からラウンドロビンが始まる場合、マルチプレクサ233Bは、パケットA1、C1、B1の順でパケットを出力する。
パケットA1及びB1が出力されフローグループFG1のパケットが無くなると、制御部14は、フローグループFG1を削除し、フローグループFG1に割り当てられていた内部キュー232を未使用の状態にする。これにより、送信キュー23は、状態313に遷移する。フローグループの分割が終了したので、スケジューラ13は、フローグループFG2〜FG4の中でのラウンドロビン選択のみをマルチプレクサ233に行わせる。
このように、スケジューラ13は、優先度選択及びラウンドロビン選択を組み合わせたスケジューリングを行うことで、パケットの順序を反転させることなくフローグループの分割を実現することができ、パケット送信の公平性を維持することができる。
次に、図13を参照して、本実施例に係るスイッチ1のフローグループの結合時のパケットの出力について説明する。図13は、実施例2に係るスイッチのフローグループ結合時のパケットの出力を説明するための図である。図13の状態321は、結合前の状態を表す。状態322は、結合中の状態を表す。状態323は、結合後の状態を表す。
状態321では、結合前であるので、スケジューラ13は、優先度選択は行わず、ラウンドロビン選択のみを行う。状態321では、フローグループFG1にフローAが属し、フローグループFG2にフローBが属し、フローグループFG3にフローCが属する。そして、フローグループFG1に割り当てられた内部キュー232が、フローAのパケットA1を格納する。フローグループFG2に割り当てられた内部キュー232が、フローBのパケットB1を格納する。また、フローグループFG3に割り当てられた内部キュー232は、フローCのパケットC1及びC2を格納する。
状態321の状態で、制御部14がフローグループFG1及びFG2の結合を開始する。この場合、制御部14は、新たにフローA及びBが属するフローグループFG4を作成する。そして、送信キュー23は、状態322に遷移する。状態322では、マルチプレクサ233Aが、優先度選択を行い、マルチプレクサ223Bが、ラウンドロビン選択を行う。フローグループFG4は、新たに入力されたフローAのパケットA2及びフローBのパケットB2を格納する。制御部14は、結合前のフローグループFG1及びFG2の優先度を、結合後のフローグループFG4より高くする。
スケジューラ13は、フローグループFG1、FG2及びFG4の中で、最も優先度の高いフローグループに割り当てられた内部キュー232をマルチプレクサ233Aに選択させる。この場合、フローグループFG1及びFG2に割り当てられた内部キュー232の優先度が高いので、マルチプレクサ233Aは、フローグループFG1及びFG2の中のパケットがなくなるまでフローグループFG1及びFG2に割り当てられた内部キュー232を順次選択する。これにより、送信キュー23から出力されるパケットの順番が入力された順番に維持される。さらに、スケジューラ13は、マルチプレクサ233Aが選択した内部キュー232及びフローグループFG3に割り当てられた内部キュー232の中からラウンドロビン選択によりマルチプレクサ233Bに内部キュー232を選択させる。そして、マルチプレクサ233Bは、選択した内部キュー232からパケットを取得し送信ポート24へ出力する。例えば、マルチプレクサ233Aが選択した内部キュー232の選択からラウンドロビンの選択が始まる場合、マルチプレクサ233Bは、パケットA1、C1、B1の順でパケットを出力する。
パケットA1及びB1が出力されフローグループFG1及びFG2のパケットが無くなると、制御部14は、フローグループFG1及びFG2を削除し、フローグループFG1及びFG2に割り当てられていた内部キュー232を未使用の状態にする。これにより、送信キュー23は、状態323に遷移する。フローグループの結合が終了したので、スケジューラ13は、フローグループFG3及びFG4の中でのラウンドロビン選択のみをマルチプレクサ233に行わせる。
このように、スケジューラ13は、優先度選択及びラウンドロビン選択を組み合わせたスケジューリングを行うことで、パケットの順序を反転させることなくフローグループの結合を実現することができ、パケット送信の公平性を維持することができる。
次に、図14を参照して、本実施例に係るスケジューラ13による送信要求を取得する内部キュー232の決定の流れについて説明する。図14は、実施例2に係るスケジューラによる送信要求を取得する内部キューの決定のフローチャートである。
スケジューラ13は、各内部キュー232の1ラウンドの送出可能量を制御情報送受信部11から取得する。また、スケジューラ13は、制御部14によって変更される内部キュー232の重みをスケジューリングパラメータ125から取得する。次に、スケジューラ13は、内部キュー232の1ラウンドの送出可能量に内部キュー232の重みを乗算する。そして、スケジューラ13は、算出した値をカウンタ値としてスケジューラ13のカウンタの領域に設定することで、キューの重みに応じたカウンタ値を内部キュー232のそれぞれに対して設定する(ステップS101)。以下では、スケジューリングの対象とする送信キュー23が有する内部キュー232に連続する番号を振り、その番号をqとして表す。また、番号qの内部キュー232に設定したカウンタ値をCqとする。
次に、スケジューラ13は、パケットの出力を指示する送信キュー23が有する内部キュー232の中から未選択の内部キュー232を抽出する(ステップS102)。
次に、スケジューラ13は、抽出した内部キュー232において番号qの内部キュー232にパケットが格納されており、且つ、カウンタ値Cqが0より大きいかを判定する(ステップS103)。番号qの内部キュー232の全てにパケットが格納されていない、又は、全てのカウンタ値Cq≦0の場合(ステップS103:否定)、スケジューラ13は、ステップS107へ進む。
これに対して、番号qの内部キュー232にパケットが格納されており、且つ、カウンタ値Cqが0より大きい場合(ステップS103:肯定)、スケジューラ13は、パケットを格納し、且つカウンタ値Cqが0より大きい内部キュー232から送信要求を取得する(ステップS104)。
次に、スケジューラ13は、送信要求を取得した内部キュー232の中からパケットを出力する内部キュー232を選択する(ステップS105)。
そして、スケジューラ13は、選択した内部キュー232からのパケットの出力をマルチプレクサ233に指示する。マルチプレクサ233は、スケジューラ13から指示された内部キュー232からパケットを取得し、送信ポート24へ出力する。また、スケジューラ13は、平均パケット長をスケジューリングパラメータ125から取得する。そして、スケジューラ13は、スケジューリングパラメータ125におけるパケットを出力させた内部キュー232のカウンタ値から平均パケット長を減算する(ステップS106)。
その後、スケジューラ13は、送信キュー23に含まれる内部キュー232の内、選択されていない内部キュー232があるか否かを判定する(ステップS107)。選択されていない内部キュー232がある場合(ステップS107:肯定)、スケジューラ13は、ステップS102へ戻る。
これに対して、送信キュー23に含まれる全ての内部キュー232の選択が終わった場合(ステップS107:否定)、スケジューラ13は、パケットが存在する内部キュー232のカウンタ値が全て0以下か否かを判定する(ステップS108)。パケットが存在する内部キュー232の中でカウンタ値が0より大きいものが存在する場合(ステップS108:否定)、スケジューラ13は、内部キュー232の未選択の状態に戻る(ステップS109)。その後、スケジューラ13は、ステップS102へ戻る。
これに対して、パケットが存在する内部キュー232のカウンタ値が全て0以下の場合(ステップS108:肯定)、スケジューラ13は、パケットの出力処理を終了する。
次に、図15を参照して、本実施例に係るスケジューラ13によるパケットを出力させる内部キュー232の決定手順について説明する。図15は、実施例2に係るスケジューラによるパケットを出力させる内部キューの決定のフローチャートである。ここで、図15に記載したフローは、図14におけるステップS105で実施される処理の一例にあたる。
スケジューラ13は、1段目内部キュー232であることを示す情報Sの入力を制御部14から受ける(ステップS201)。
次に、スケジューラ13は、上述したXCHG関数を用いて、優先度に合わせて送信要求の順番を組み換える(ステップS202)。
次に、スケジューラ13は、1段目内部キュー232が有るか否かを判定する(ステップS203)。1段目内部キュー232が無い場合(ステップS203:否定)、スケジューラ13は、2段目内部キュー232に対してラウンドロビン選択を行う(ステップS205)。その後、スケジューラ13は、ステップS209へ進む。
これに対して、1段目内部キュー232がある場合(ステップS203:肯定)、スケジューラ13は、1段目内部キュー232に対して優先度選択を行う(ステップS204)。
次に、スケジューラ13は、2段目内部キュー232があるか否かを判定する(ステップS206)。2段目内部キュー232が無い場合(ステップS206:否定)、スケジューラ13は、優先度選択で選択された内部キュー232を選択する(ステップS207)。その後、スケジューラ13は、ステップS209へ進む。
これに対して、2段目内部キュー232がある場合(ステップS206:肯定)、スケジューラ13は、優先度選択で選択された内部キュー232と2段目内部キュー232とでラウンドロビン選択を行う(ステップS208)。
その後、スケジューラ13は、上述したXCHG関数を用いて優先度により組み換えた送信要求の順序を元に戻す(ステップS209)。
そして、スケジューラ13は、マルチプレクサ233に対して、選択した内部キュー232からパケットを送信させる(ステップS210)。
以上に説明したように、本実施例に係るスケジューラは、DRRを改良したアルゴリズムを用いて送信要求を取得する内部キューを決定する。その後、スケジューラは、送信要求を出力した内部キューの中から優先度選択及びラウンドロビン選択を用いてパケットを出力させる内部キューを決定する。これにより、パケットを出力する内部キューが順次変更されるため、1つの内部キューから連続してパケットが出力される状態を抑制でき、スイッチからのパケットの入力先となる受信機側の負荷を低減することができる。
そして、受信機側の負荷を低減することで、受信機側のバッファ資源の枯渇の防止や、受信機におけるスイッチングや受信性能不足の問題の低減に寄与することができる。
また、以上では、送信要求を取得する内部キューの決定に、DRRに改良を加えたアルゴリズムを用いたが、この送信要求の取得は、ある程度受信側の負荷が高くなるのを許容できるのであれば、例えば、従来のWRRやDRRなどを用いてもよい。その場合、スケジューラは、WRRやDRRなどのアルゴリズムを用いて決定した送信要求を取得する内部キューに対して、本実施例で説明した優先度選択及びラウンドロビン選択を用いることで、受信機側の負荷をある程度低減することができる。