以下に、本願の開示する情報処理装置、情報処理システム及び情報処理プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理システム及び情報処理プログラムが限定されるものではない。
図1は、情報処理システムの概略構成図である。図1に示すように本実施例に係る情報処理システム1は、スイッチ100及びサーバ201~206を有する。
サーバ201~206は、それぞれスイッチ100に接続される。そして、サーバ201~206は、それぞれが相互にスイッチ100を介してパケットの送受信を行う。以下では、サーバ201~206をそれぞれ区別せずに表す場合、サーバ200という。そして、パケットの送信元のサーバ200を「送信側のサーバ200」と呼び、パケットの送信先のサーバ200を「受信側のサーバ200」と呼ぶ。例えば、サーバ201がサーバ204にパケットを送信する場合、送信側のサーバ200であるサーバ201が「第1通信装置」の一例にあたり、受信側のサーバ200であるサーバ204が「第2通信装置」の一例にあたる。
スイッチ100は、送信側のサーバ200から送信された受信側のサーバ200宛てのパケットを受信する。そして、スイッチ100は、サーバ200に接続されたポートから受信側のサーバ200へ向けて、送信側のサーバ200から送信されたパケットを送信する。
ここで、図1では、1台のスイッチ100でサーバ200同士が接続される場合を図示したが、接続形態はこれに限らない、スイッチ100は他の通信機器を介して送信側のサーバ200と受信側のサーバ200とを接続してもよい。また、図1では、6台のサーバ201~206を図示したが、台数に特に制限は無い。
ここで、送信側のサーバ200から受信側のサーバ200へのパケット送信によるフローについて説明する。送信側のサーバ200と受信側のサーバ200とは、一連の関連するパケットを送信する通信を行う。このような、一連のパケットを送信する処理を「フロー」と言う。
パケットは、パケットの送受信を制御する情報を含むヘッダと送信するデータを含むペイロードを有する。パケットのヘッダには、フローを識別するための情報であるパケット情報が格納される。ここで、同じフローとして送受信されるパケットのそれぞれには、フローを識別するための情報として同じ情報が格納される。
例えば、パケットのヘッダには、宛先アドレス、送信元情報、宛先情報、プロトコル、並びに、送信元ポート番号及び宛先ポート番号などが格納される。例えば、送信元情報は送信元IP(Internet Protocol)などであり、宛先情報は宛先IPなどである。本実施例では、フローを識別する情報として、5-tupleと呼ばれる、送信元IP、宛先IP、送信元ポート番号、宛先ポート番号及びプロトコルの5つの情報を用いる。ただし、フローを識別する情報は、フローとして表される一連のパケットを送信する処理を特定できればよく、他の情報を用いてもよい。
次に、図2を参照して、スイッチ100の詳細について説明する。図2は、実施例に係るスイッチのブロック図である。このスイッチ100が、「情報処理装置」の一例にあたる。
スイッチ100は、図2に示すように、受信ポート111~112、中継処理部102、フロー識別部103、フロー判別処理部104、キュー切替処理部105、データ保持部106、送信キューセット171~172及び送信ポート181~182を有する。さらに、データ保持部106は、フロー識別テーブル161、転送量テーブル162及びキュー情報管理テーブル163を有する。
受信ポート111~112は、同じ機能を有しており、以下では、それぞれを区別しない場合、「受信ポート110」という。また、送信ポート181~182は、同じ機能を有しており、以下では、それぞれを区別しない場合、「送信ポート180」という。
受信ポート111~112は、図示しないが1つ又はいくつかのサーバ200に接続される。受信ポート111~112は、接続先の送信側のサーバ200からパケットの入力を受ける。そして、受信ポート111~112は、入力されたパケットを中継処理部102へ出力する。
中継処理部102は、パケットの入力を受信ポート110から受ける。中継処理部102は、ヘッダに格納された宛先情報及び宛先ポートなどの受信側のサーバ200の情報からそのパケットを出力する送信ポート180を決定する。そして、中継処理部102は、決定した送信ポート180の識別子である送信ポートID(IDentifier)とともに送信元IP、宛先IP、送信元ポート番号、宛先ポート番号及びプロトコルを含むパケット情報、並びにパケットをフロー識別部103へ出力する。ここで、パケット情報は、実際にはパケットのヘッダに含まれるため、パケットを送ることでパケット情報も送ることができる。ただし、ここでの説明では、パケット情報が授受されることを明示するため、パケットとともにパケット情報も送信するように説明する。
図3は、中継処理部から送信キューセットの間の各地点において受け渡される情報をまとめた図である。図3に示すように、中継処理部102からフロー識別部103へ送信されるパケット送信の制御情報として、パケット情報及び送信ポートIDを含む情報セット121が送信される。
図2に戻って説明を続ける。フロー識別テーブル161は、例えば、図4に示したテーブルである。図4は、フロー識別テーブルの一例を表す図である。
フロー識別テーブル161は、送信元IP、宛先IP、送信元ポート番号、宛先ポート番号及びプロトコルを含むヘッダ情報、アドレス及び頻度情報が対応付けられて登録される。頻度情報とは、ある時点での各フローに含まれるパケットが送られる頻度を表す。さらに、後述するようにフロー識別テーブル161のアドレスは、フローIDにあたる。
本実施例に係るフロー識別テーブル161は、情報の内容を与えることで、その情報が格納されたエントリのアドレスを与えるCAM(Content Addressable Memory)である。
フロー識別部103は、パケット情報及び送信ポートIDを含む情報セット121を取得する。さらに、フロー識別部103は、パケット本体の入力を受ける。次に、フロー識別部103は、取得したパケット情報に含まれる送信元IP、宛先IP、送信元ポート番号、宛先ポート番号及びプロトコルを含むヘッダ情報を用いてフロー識別テーブル161を検索する。
ヘッダ情報に一致するエントリが存在する場合、フロー識別部103は、そのヘッダ情報が表すフローの識別情報であるフローIDとして、そのヘッダ情報に対応するアドレスを取得する。このフローIDが取得したパケットが属するフローの識別子である。さらに、フロー識別部103は、そのフローIDに対応する頻度情報を1つインクリメントする。さらに、フロー識別部103は、一致するエントリが存在したことを表すFoundのメッセージをエントリの検索結果を表すエントリ情報とする。
また、ヘッダ情報に一致するエントリが存在せず、且つ、エントリに空きがある場合、フロー識別部103は、ヘッダ情報を空きエントリに登録し、頻度情報に1を登録する。そして、フロー識別部103は、登録したエントリのアドレスをそのヘッダ情報に対応するフローIDとして取得する。このフローIDが取得したパケットが属するフローの識別子となる。さらに、フロー識別部103は、エントリを新しく生成したことを表すNewのメッセージをエントリ情報とする。
また、ヘッダ情報に一致するエントリが存在せず、且つ、エントリに空きがない場合、フロー識別部103は、エントリが存在しないことを表すNotfoundのメッセージをエントリ情報とする。この場合、フロー識別部103は、フローIDが存在しないことを表す情報をフローIDとしてもよい。
その後、フロー識別部103は、パケット本体とともに、図3に示すようにパケット情報、送信ポートID、フローID及びエントリ情報を含む情報セット131をフロー判別処理部104へ出力する。
また、フロー識別部103は、フロー識別テーブル161のエントリの管理を一定の周期で行う。具体的には、フロー識別部103は、フロー識別テーブル161のエントリの管理を行う周期を予め記憶する。そして、フロー識別テーブル161のエントリの管理のタイミングが到来すると、フロー識別部103は、フロー識別テーブル161からエントリを1つずつ選択する。
そして、フロー識別部103は、選択したエントリにおける頻度情報が0か否かを判定する。頻度情報が0でない場合、フロー識別部103は、選択したエントリの頻度情報を1つデクリメントする。すなわち、フロー識別部103から出力されたパケットは、出力されてから十分な期間が経過すれば送信ポート180から既に出力された可能性が高い。そこで、フロー識別部103は、出力時に1つ増やした頻度情報を1つ減らすことでそのフローに属するスイッチ100内に滞留しているパケットの数を予測することができる。そして、頻度情報が0であればスイッチ100内にそのフローに属するパケットが存在していない蓋然性が高いと予測できる。
そこで、頻度情報が0の場合、フロー識別部103は、選択したエントリのフローIDに対応するキューカウンタの値をキュー情報管理テーブル163から取得する。そして、フロー識別部103は、キューカウンタが0か否かを判定する。キューカウンタが0であれば、フロー識別部103は、送信キューセット170の中にそのフローに属するパケットが残っていないことが確認できるので、スイッチ100内にそのフローに属するパケットが存在していないと予測できる。そこで、フロー識別部103は、選択したエントリを削除する。
フロー識別部103は、以上の処理をフロー識別テーブル161の全てのエントリに対して行い、フロー識別テーブル161を管理する。これにより、不要なエントリを削除することができ、フロー識別部103は、フロー識別テーブル161を有効に使用することができる。
転送量テーブル162は、各フローの転送量を表すテーブルである。図5は、転送量テーブルの一例を表す図である。図5に示すように、転送量テーブル162には、フローIDに対応させて各フローの特徴量として転送量が登録される。図5においてFIDはフローID(Flow ID)を表す。また、本実施例の場合、1つのフローIDに対して全ての送信ポート180のカウンタを1つのエントリで管理する。これは、通信の多くはユニキャスト通信であり、出力先となる送信ポート180は1つに限定されることが多い。そのため、1つのフローIDに対して全ての送信ポート180を1つのエントリで管理してもほとんどの場合は問題にならないことを理由とする。
フロー判別処理部104は、パケット本体とともに、図3に示すようにパケット情報、送信ポートID、フローID及びエントリ情報を含む情報セット131の入力をフロー識別部103から受ける。そして、フロー判別処理部104は、取得したエントリ情報を確認する。
エントリ情報がFoundの場合、フロー判別処理部104は、転送量テーブル162における取得したフローIDに対応するエントリを特定する。そして、フロー判別処理部104は、パケット情報からパケットのサイズを取得して、転送量テーブル162における取得したフローIDに対応するエントリの転送量にパケットの大きさを加算して書き込む。
エントリ情報がNewの場合、フロー判別処理部104は、転送量テーブル162にあらたにフローIDに対応するエントリを作成する。そして、フロー判別処理部104は、転送量を初期化する。その後、フロー判別処理部104は、パケット情報からパケットのサイズを取得して、作成したエントリの転送量にパケットの大きさを書き込む。
次に、エントリ情報がFound又はNewのいずれの場合も、フロー判別処理部104は、パケット情報を確認して、そのパケットの出力キューとして特定キューが指定されているか否かを判定する。ここで、出力キューとは、パケットを入力して保持させ、その後、送信ポート180へ保持させたパケットを出力させるキューを指す。例えば、パケットの優先度が高い場合には、優先的に処理される予め決められた特定キューが出力キューとしてそのパケットに指定される。
パケットに特定キューが指定されている場合、フロー判別処理部104は、指定された特定キューを出力キューの候補として指定する候補キューとする。具体的には、フロー判別処理部104は、パケット情報に格納されたパケットの優先度を確認する。例えば、パケットの優先度は0~7で表される。この場合、数字が大きくなるほど優先度が高い。そして、パケットの優先度が7であれば、フロー判別処理部104は、優先的に処理される特定キューをそのパケットの候補キューとする。
一方、パケットに特定キューが指定されていない場合、フロー判別処理部104は、転送量が予め決められた閾値以上か否かを判定する。転送量が予め決められた閾値以上の場合、フロー判別処理部104は、送信ポート181に接続する送信キューセット170が有する複数のキューの内のロングキューを、そのパケットの候補キューとする。ロングキューとは、転送量の大きいフローに属するパケットを格納するために割り当てられたキューであり、スループットを高くすることを目的とするキューである。送信キューセット170については後で詳細に説明する。このロングキューが、「第1キュー」の一例にあたる。
これに対して、転送量が予め決められた閾値未満の場合、フロー判別処理部104は、送信ポート181に接続する送信キューセット170が有する複数の送信キューの内のショートキューを、そのパケットの候補キューとする。ショートキューとは、転送量の小さいフローに属するパケットを格納するために割り当てられたキューであり、レイテンシを低くすることを目的とするキューである。このショートキューが、「第2キュー」の一例にあたる。
一方、エントリがNotfoundの場合、フロー判別処理部104は、デフォルトのキューを、そのパケットの候補キューとする。
その後、フロー判別処理部104は、パケット本体とともに、図3に示すパケット情報、フローID、エントリ情報及び候補キューの識別情報である候補キューIDを含む情報セット141をキュー切替処理部105へ出力する。このフロー判別処理部104が、「特徴量取得部」の一例にあたる。
キュー情報管理テーブル163は、フロー毎に、そのフローのパケットの出力キューの情報及び各フローに対する出力キューの状態を表すテーブルである。図6は、キュー情報管理テーブルの一例を表す図である。キュー情報管理テーブル163は、フローIDとQ(Que)IDとを対応付けて記憶する。QIDは、各フローIDを有するフローのパケットが送信されたキュー、すなわち各フローIDを有するフローの現在のキューを表す。また、キュー情報管理テーブル163は、フローID毎に、各フローIDを有するフローの現在のキューに格納されたそのフローのパケット数を表すキューカウンタを有する。
キュー切替処理部105は、パケット本体とともに、パケット情報、フローID、エントリ情報及び候補キューIDを含む情報セット141の入力をフロー判別処理部104から受ける。そして、キュー切替処理部105は、エントリ情報を確認する。
エントリ情報がFoundの場合、キュー切替処理部105は、取得したフローIDの現在のキューのキューIDをキュー情報管理テーブル163から取得する。そして、キュー切替処理部105は、候補キューIDと現在のキューのキューIDが一致するか否かにより、キューの切り替えが発生するか否かを判定する。キューの切り替えが発生しない場合、キュー切替処理部105は、出力キューを候補キューとする。この場合、出力キューを現在のキューのまま維持することになる。
一方、キューの切り替えが発生する場合、キュー切替処理部105は、キュー情報管理テーブル163における取得したフローIDに対応するキューカウンタの値が0か否かを判定する。キューカウンタの値が0であれば、そのフローの現在のキューにそのフローのパケットが残っていないといえる。すなわち、キュー切替処理部105は、そのフローの現在のキューに、そのフローのパケットが残っている状態か否かを判定する。そして、キューカウンタの値が0であれば、現在のキューにパケットが残っていないので、キュー切替処理部105は、そのフローの出力キューを現在のキューから候補キューに変更する。
これに対して、キューカウンタの値が0でなく、現在のキューにパケットが残っている場合、キュー切替処理部105は、そのフローの出力キューを候補キューとされなかった現在のキューのまま維持する。これにより、パケットが特定のキューに残っているにも関わらず他のキューにパケットを格納することを回避することができ、パケットの順序逆転を回避することができる。
また、エントリ情報がNewの場合、キュー切替処理部105は、キュー情報管理テーブル163に新たに取得したフローIDを登録して対応するエントリを作成する。さらに、キュー切替処理部105は、生成したエントリのキューカウンタ値を0にして初期化する。そして、キュー切替処理部105は、そのフローの出力キューを候補キューに設定する。
また、エントリ情報がNotfoundの場合、キュー切替処理部105は、そのフローの出力キューを候補キューに設定する。
その後、キュー切替処理部105は、そのフローの出力キューとして決定したキューを有する送信キューセット170へパケット、パケット情報及びそのパケットが属するフローのFIDを出力する。さらに、パケットの出力とともに、キュー切替処理部105は、出力したパケットの出力キューのキューIDをパケットの出力先の送信キューセット170へ出力する。また、キュー切替処理部105は、出力したパケットが属するフローのフローID及び加算を指示するコマンドをキュー情報管理テーブル163へ出力する。これにより、キュー切替処理部105は、キュー情報管理テーブル163における指定したフローIDに対応するキューカウンタを1つインクリメントさせる。このキュー切替処理部105が、「送信制御部」の一例にあたる。
図7は、送信キューセットのブロック図である。送信キューセット170は、図7に示すように、セレクタ701、マルチプレクサ703、スケジューラ704及び複数のキュー721~723を有する。以下では、キュー721~723のそれぞれを区別しない場合、「キュー720」という。
セレクタ701は、パケット情報、フローID及びパケットの入力をキュー切替処理部105から受ける。さらに、セレクタ701は、そのパケットの出力キューを表すキューIDの入力をキュー切替処理部105から受ける。すなわち、セレクタ701は、図3に示すパケット情報、フローID及びキューIDを含む情報セット151、並びに、パケットの入力をキュー切替処理部105から受ける。
そして、セレクタ701は、指定されたキューIDを有するキュー720にパケット情報、フローID及びパケットを出力する。
キュー切替処理部105から入力されたキューIDで出力キューとして指定されたキュー720は、パケット情報、フローID及びパケットの入力をセレクタ701から受ける。そして、キュー720は、入力されたパケット情報、フローID及びパケットを格納する。その後、キュー720は、取得タイミングの古い順に保持するパケット情報、フローID及びパケットをマルチプレクサ703へ順次出力していく。
スケジューラ704は、マルチプレクサ703が出力するパケットの調停を行う。例えば、スケジューラ704は、ラウンドロビンなどでパケットを出力するキュー720を選択してマルチプレクサ703から出力させる。
マルチプレクサ703は、スケジューラ704から指定されたキュー720からパケット情報、フローID及びパケットを取得する。そして、マルチプレクサ703は、取得したパケット情報及びパケットを送信ポート180へ出力する。さらに、マルチプレクサ703は、パケットが属するフローのフローIDを、減算を指示するコマンドとともにキュー情報管理テーブル163へ出力する。これにより、送信キューセット170は、キュー情報管理テーブル163における指定したフローIDに対応するキューカウンタを1つデクリメントさせる。
図2に戻って説明を続ける。送信ポート180は、パケット情報に含まれる宛先情報で指定された受信側のサーバ200に向けてパケットを送信する。
次に、図8を参照して、フロー識別部103によるフローの識別処理の流れについて説明する。図8は、フロー識別部によるフローの識別処理のフローチャートである。
フロー識別部103は、パケットとともにパケット情報及び送信ポートIDの入力を中継処理部102から受ける。そして、フロー識別部103は、パケット情報を用いてフロー識別テーブル161を検索する(ステップS101)。本実施例では、フロー識別部103は、パケット情報に含まれる送信元IP、宛先IP、送信ポート番号、宛先ポート番号及びプロトコルをフロー識別テーブル161へ出力することで検索を行う。
そして、フロー識別部103は、パケットが属するフローに該当するフローを検出する(ステップS102)。本実施例の場合、フロー識別テーブル161がCAMであるので、フロー識別部103は、送信した情報に対応する情報を有するエントリがある場合、そのエントリに対応するフローIDをフロー識別テーブル161から取得する。そして、フローIDを取得することができた場合、フロー識別部103は、該当するフローを検出したと判定する。
該当するフローを検出した場合(ステップS102:肯定)、フロー識別部103は、パケットのエントリ情報をFoundとする。さらに、フロー識別部103は、そのフロー識別テーブル161におけるそのフローIDに対応する頻度情報を1つインクリメントする(ステップS103)。
これに対して、該当するフローを検出しない場合(ステップS102:否定)、フロー識別部103は、フロー識別テーブル161に空エントリが存在するか否かを判定する(ステップS104)。
空エントリが存在する場合(ステップS104:肯定)、フロー識別部103は、パケットのエントリ情報をNewとする。さらに、フロー識別部103は、フロー識別テーブル161の空エントリにフローの識別情報を登録し、頻度情報を1とする(ステップS105)。そして、フロー識別部103は、登録した空エントリの識別情報をフローIDとして取得する。
これに対して、空エントリが存在しない場合(ステップS104:否定)、フロー識別部103は、パケットのエントリ情報をNotfoundとする(ステップS106)。この場合、フロー識別部103は、フローIDが存在しないことを表す情報をフローIDとして取得する。
次に、図9を参照して、フロー識別部103によるエントリ管理の流れについて説明する。図9は、フロー識別部によるエントリ管理のフローチャートである。
フロー識別部103は、判定タイミングが到来したか否かを判定する(ステップS201)。判定タイミングが到来していない場合(ステップS201:否定)、フロー識別部103は、判定タイミングが到来するまで待機する。
これに対して、判定タイミングが到来した場合(ステップS201:肯定)、フロー識別部103は、未判定のエントリをフロー識別テーブル161から1つ選択する(ステップS202)。
そして、フロー識別部103は、選択したエントリにおける頻度情報が0か否かを判定する(ステップS203)。頻度情報が0でない場合(ステップS203:否定)、フロー識別部103は、選択したエントリの頻度情報を1つデクリメントする(ステップS204)。
これに対して、頻度情報が0の場合(ステップS203:肯定)、フロー識別部103は、選択したエントリのフローIDに対応するキューカウンタの値をキュー情報管理テーブル163から取得する。そして、フロー識別部103は、キューカウンタが0か否かを判定する(ステップS205)。
キューカウンタが0の場合(ステップS205:肯定)、フロー識別部103は、選択したエントリを削除する(ステップS206)。これに対して、キューカウンタが0でない場合(ステップS205:否定)、フロー識別部103は、ステップS207へ進む。
その後、フロー識別部103は、未判定のエントリが残っているか否かを判定する(ステップS207)。未判定のエントリが残っている場合(ステップS207:肯定)、フロー識別部103は、ステップS202へ戻る。
これに対して、未判定のエントリが残っていない場合(ステップS207:否定)、フロー識別部103は、エントリの管理処理を終了する。
次に、図10を参照して、フロー判別処理部104によるフロー判別処理の流れについて説明する。図10は、フロー判別処理部によるフロー判別処理のフローチャートである。
フロー判別処理部104は、パケット情報、送信ポートID、フローID及びエントリ情報の入力をフロー識別部103から受ける。そして、フロー判別処理部104は、エントリ情報がFoundか否かを判定する(ステップS301)。エントリ情報がFoundの場合(ステップS301:肯定)、フロー判別処理部104は、ステップS304へ進む。
これに対して、エントリ情報がFoundでない場合(ステップS301:否定)、フロー判別処理部104は、エントリ情報がNewか否かを判定する(ステップS302)。
エントリ情報がNewの場合(ステップS302:肯定)、フロー判別処理部104は、転送量テーブル162に新たに取得したフローIDに対応するエントリを作成して転送量を初期化する(ステップS303)。
エントリ情報がFound又はステップS303の後に、フロー判別処理部104は、取得したフローIDに対応する転送量テーブル162の転送量に取得したパケットの大きさを加算して登録する(ステップS304)。
その後、フロー判別処理部104は、パケットに特定キューが出力キューとして指定されているか否かを判定する(ステップS305)。
特定キューが指定されていない場合(ステップS305:否定)、フロー判別処理部104は、取得したフローIDに対応する転送量が閾値以上か否かを判定する(ステップS306)。
取得したフローIDに対応する転送量が閾値以上の場合(ステップS306:肯定)、フロー判別処理部104は、ロングキューをそのパケットの候補キューとする(ステップS307)。
これに対して、取得したフローIDに対応する転送量が閾値未満の場合(ステップS306:否定)、フロー判別処理部104は、ショートキューをそのパケットの候補キューとする(ステップS308)。
一方、特定キューが指定されている場合(ステップS305:肯定)、フロー判別処理部104は、特定キューをそのパケットの候補キューとする(ステップS309)。
また、エントリ情報がNewでない場合(ステップS302:否定)、すなわち、エントリ情報がNotfoundの場合、フロー判別処理部104は、デフォルトのキューをそのパケットの候補キューとする(ステップS310)。
次に、図11を参照して、キュー切替処理部105によるキューの切り替え処理の流れについて説明する。図11は、キュー切替処理部によるキューの切り替え処理のフローチャートである。
キュー切替処理部105は、パケット情報、フローID、エントリ情報及び候補キューIDの入力をフロー判別処理部104から受ける。そして、キュー切替処理部105は、エントリ情報がFoundか否かを判定する(ステップS401)。
エントリ情報がFoundの場合(ステップS401:肯定)、キュー切替処理部105は、候補キューと現在のキューのキューIDが同一か否かにより、キューの切り替えが発生するか否かを判定する(ステップS402)。
キューの切り替えが発生する場合(ステップS402:肯定)、キュー切替処理部105は、キュー情報管理テーブル163における取得したフローIDに対応するキューカウンタの値が0か否かを判定する(ステップS403)。
キューカウンタが0の場合(ステップS403:肯定)、キュー切替処理部105は、パケットの出力キューを候補キューに切り替える(ステップS404)。
これに対して、キューの切り替えが発生しない場合(ステップS402:否定)及びキューカウンタが0でない場合(ステップS403:否定)、キュー切替処理部105は、出力キューを現在のキューに維持する(ステップS406)。
一方、エントリ情報がFoundでない場合(ステップS401:否定)、キュー切替処理部105は、エントリ情報がNewか否かを判定する(ステップS405)。エントリ情報がNewでない場合(ステップS405:否定)、すなわち、エントリ情報がNotfoundの場合、キュー切替処理部105は、ステップS408に進む。
これに対して、エントリ情報がNewの場合(ステップS405:肯定)、キュー切替処理部105は、キュー情報管理テーブル163に取得したフローIDに対応するエントリを作成して作成したエントリを初期化し(ステップS407)、ステップS408に進む。
キュー切替処理部105は、出力キューを候補キューに設定する(ステップS408)。
次に、図12を参照して、キュー720に対するエンキュー処理の流れについて説明する。図12は、キューに対するエンキュー処理のフローチャートである。
キュー切替処理部15は、出力するパケットが属するフローIDに対応するキュー情報管理テーブル163のエントリのキューカウンタを1つインクリメントする(ステップS501)。
次に、キュー切替処理部15は、キューIDに対応するキュー720にパケット情報、フローID及びパケットをエンキューする(ステップS502)。
次に、図13を参照して、キュー720に対するデキュー処理の流れについて説明する。図13は、キューに対するデキュー処理のフローチャートである。
キュー720は、パケット情報、フローID及びパケットをデキューして、送信ポート180へ出力する(ステップS601)。
その後、キュー720は、フローIDに対応するキュー情報管理テーブル163のエントリのキューカウンタを1つデクリメントする(ステップS602)。
ここで、本実施例では、候補キューを決定するための特徴量として転送量を用いる場合で説明したが、特徴量はフローの種類を判別できる情報であれば他の情報を用いてもよい。例えば、単位時間あたりの転送量の増分を表す転送量の増加速度を特徴量として用いてもよい。この場合、フロー判別処理部104は、一定期間毎に転送量の増分を測定し、測定結果が予め決められた増分閾値以上の場合はロングキューを候補キューとし、測定結果が増分閾値未満の場合はショートキューを候補キューとする。
また、本実施例では、特定キュー以外に、ロングキューとショーキューという2種類のキュー720にパケットの送信先を分ける場合で説明したが、キュー720の数及び種類はこれに限らず、フローの種類に応じた分類が可能であれば他の数や種類のキュー720を用いてもよい。
例えば、フロー識別部103が、パケット情報を用いて、フローの種類として、ストレージトラフィック、ストリーミング及びそれ以外のフローという分類を行う場合を考える。この場合、キュー720は、ストレージトラフィック、ストリーミング及びそれ以外のフローのそれぞれに対応する3種類のキュー720が用意される。そして、キュー切替処理部105は、フロー判別処理部104により判別されたフローの種類に応じてパケットの出力キューを決定する。
また、これらのキューの構成を組み合わせることも可能である。例えば、キュー720を、優先キューである特定キュー、ストレレージトラフィックにおけるロングキュー及びショートキュー、ストリーミング用のキュー、並びに、それ以外のトラフィックにおけるロングキュー及びショートキューの6本用意してもよい。
以上に説明したように、本実施例に係るスイッチは、パケットを受信すると、パケットが属するフローを識別し、そのフローに関する特徴量に応じて出力キューの候補を決定する。さらに、スイッチは、候補キューにそのフローに属するパケットが残っていない場合に、候補キューに出力キューを切り替えパケットを切替後の出力キューに格納する。これにより、本実施例に係るスイッチは、パケットの順番を守りつつ、フローの特徴量に応じて自動且つ高速度のフローの判別が可能となり、パケットを格納するキューを動的且つ高速で切り替えることができる。したがって、フローレベルでの制御によりキューの切り替えを行うことができ、通信性能を向上させることができる。
特に、本実施例に係るスイッチは、フロー毎の転送量に応じてパケットの出力キューを切り替えることができ、短いパケットと長いパケットとを分別してキューに格納することができる。これにより、低レイテンシが求められるキューと、高スループットが求められるキューとを分けることができ、各フローの特性に応じたキューの選択を行うことで通信性能を向上させることができる。
次に、実施例2について説明する。本実施例に係るスイッチは、フロー識別テーブルとしてハッシュ値により検索を行うテーブルを用いることが実施例1と異なる。本実施例に係るスイッチも図2のブロック図で表される。以下の説明では、実施例1と同様の各部の動作については説明を省略する。
図14は、実施例2に係るフロー識別テーブルの一例を示す図である。図14に示すように、本実施例に係るフロー識別テーブル161は、パケット情報に基づくハッシュ値に対応させたアドレスにヘッダ情報が登録される。例えば、本実施例では、送信元IP、宛先IP、送信元ポート、宛先ポート及びプロトコルから求めたハッシュ値が用いられる。
フロー識別部103は、中継処理部102から取得したパケット情報から送信元IP、宛先IP、送信元ポート、宛先ポート及びプロトコルを取得する。そして、フロー識別部103は、取得した送信元IP、宛先IP、送信元ポート、宛先ポート及びプロトコルからハッシュ値を求める。
次に、フロー識別部103は、算出したハッシュ値をアドレスとしてフロー識別テーブル161を読み出す。そのエントリが使用中であり、読み出したエントリのヘッダ情報がパケットのヘッダ情報と一致する場合、フロー識別部103は、パケットのエントリ情報をFoundとする。また、フロー識別部103は、読み出したエントリのアドレス、すなわちハッシュ値をフローIDとして取得する。さらに、フロー識別部103は、ハッシュ値をアドレスとするエントリの頻度情報を1つインクリメントする。
これに対して、ハッシュ値をアドレスとするエントリが未使用の場合、フロー識別部103は、その空きエントリにパケットのヘッダ情報を登録して頻度情報を1とする。そして、フロー識別部103は、パケットのエントリ情報をNewとする。
また、ハッシュ値をアドレスとするエントリが使用中であり、そのエントリのヘッダ情報がパケットのヘッダ情報と一致しない場合、フロー識別部103は、そのエントリの頻度情報が0であるかどうかを判定する。そして、頻度情報が0であった場合、フロー識別部103は、そのエントリに対応するフローIDのキューカウンタの値をキュー情報管理テーブル163から取得する。そして、フロー識別部103は、キューカウンタが0であれば、そのエントリのヘッダ情報を登録して頻度情報を1とする。さらに、フロー識別部103は、パケットのエントリ情報をNewとする。頻度情報が0でない場合、あるいは頻度情報が0であるがキューカウンタが0でない場合、フロー識別部103は、パケットのエントリ情報をNotfoundとする。
これらと並行して、フロー識別部103は、実施例1と同様に、フロー識別テーブル161を定期的にスキャンし、0を最小値として各エントリの頻度情報を1つデクリメントする。
次に、図15を参照して、本実施例に係るフロー識別部103によるフロー識別処理の流れについて説明する。図15は、実施例2に係るフロー識別部によるフロー識別処理のフローチャートである。
フロー識別部103は、中継処理部102から取得したパケット情報から送信元IP、宛先IP、送信元ポート、宛先ポート及びプロトコルを取得する。そして、フロー識別部103は、取得した送信元IP、宛先IP、送信元ポート、宛先ポート及びプロトコルからハッシュ値を算出する(ステップS701)。
次に、フロー識別部103は、算出したハッシュ値を用いてフロー識別テーブル161からフローを検索する(ステップS702)。
そして、フロー識別部103は、パケットが属するフローに該当するフローがフロー識別テーブル161に登録されているか否かを判定する(ステップS703)。
該当するフローが登録済みの場合(ステップS703:肯定)、フロー識別部103は、エントリ情報をFoundとして、頻度情報を1つインクリメントする(ステップS704)。
該当するフローが登録されていない場合(ステップS703:否定)、フロー識別部103は、算出したハッシュ値をアドレスとしてフロー識別テーブル161を読み出し、読み出したエントリが未使用エントリであるかいなかを判定する(ステップS705)。未使用エントリである場合(ステップS705:肯定)、フロー識別部103は、パケットのエントリ情報をNewとする。さらに、フロー識別部103は、空きエントリにハッシュ値を登録して、そのエントリの頻度情報を1とする(ステップS706)。
これに対して、エントリが使用中の場合(ステップS705:否定)、フロー識別部103は、頻度情報が0で且つキューカウンタも0か否かを判定する(ステップS707)。
頻度情報が0で且つキューカウンタも0である場合(ステップS707:肯定)、フロー識別部103は、パケットのエントリ情報をNewとする。さらに、フロー識別部103は、空きエントリにハッシュ値を登録して、そのエントリの頻度情報を1とする(ステップS706)。
これに対して、頻度情報が0でない、又は、キューカウンタが0でない場合(ステップS707:否定)、フロー識別部103は、パケットのエントリ情報をNotfoundとする(ステップS708)。
これらに並行して、フロー識別部103は、フロー識別テーブル161をスキャンし、0と最小値として各エントリの頻度情報を1つデクリメントする。
ここで、本実施例では、フロー識別部103は、パケットを受信した際に空のエントリが無ければその都度、フロー識別テーブル161の管理を行う場合で説明したが、フロー識別テーブル161の管理のタイミングはこれに限らない。例えば、フロー識別部103は、実施例1と同様に一定周期でフロー識別テーブル161の管理を繰り返してもよい。逆に、実施例1において、本実施例で説明したタイミングでフロー識別テーブル161を管理してもよい。
以上に説明したように、本実施例に係るスイッチは、ハッシュ値を用いてパケットが属するフローが登録済みか否かの判定を行う。このように、CAMを用いずにハッシュテーブルを用いてフローを検索する場合であっても、スイッチは、フローレベルでの制御によりキューの切り替えを行うことができ、通信性能を向上させることができる。この場合、通常の大容量メモリでフロー識別テーブルを保持することができ、CAMと比べて、回路規模を小さくすることができ、且つ、消費電力も抑えることができる。
次に、実施例3について説明する。本実施例に係るスイッチは、各フローについて送信ポート毎に異なるエントリを有するキュー情報管理テーブルを用いることが実施例1と異なる。本実施例に係るスイッチも図2のブロック図で表される。以下の説明では、実施例1と同様の各部の動作については説明を省略する。
図16は、実施例3に係るキュー情報管理テーブルの一例を表す図である。本実施例に係るキュー情報管理テーブル163は、1つのフローIDに対応するエントリが送信ポート180毎に登録される。図16は各フローIDに対応して送信ポート181~182に対応するエントリが登録された状態を表す。ただし、キュー情報管理テーブル163は、には、フローIDに属するパケットの現在のキューとして使用中のキュー720が接続する送信ポート180が登録されていれば、全ての送信ポート181~182が登録されなくてもよい。
キュー切替処理部105は、キュー情報管理テーブル163を用いて、各送信ポート180に接続される送信キューセット170毎に、パケットの格納状態を管理する。この場合も、キュー切替処理部105は、送信ポート180毎に、現在のキューと候補キューが異なる場合には、そのパケットが属するフローに対応するキューカウンタが0であれば、候補キューを出力キューとする。
このように、本実施例に係るスイッチは、各フローについて送信ポート毎にエントリを有するキュー情報管理テーブルを用いることで、送信ポート毎の出力キューの切替制御を行うことが可能となる。したがって、本実施例に係るスイッチは、実施例1の場合に比べてより適切なタイミングでキューの切り替えを行うことができ、通信性能をより向上させることができる。
図17は、実施例4に係るスイッチのブロック図である。本実施例に係るスイッチ100は、パケット本体はキュー720に送らずに、パケットの位置を示すポインタを送ることが実施例1と異なる。以下の説明では、実施例1と同様の各部の動作については説明を省略する。本実施例に係るスイッチ100は、実施例1の各部に加えて、パケットバッファ191及び制御部192を有する。
受信ポート110は、パケットを受信すると、パケットバッファ191に受信したパケットを格納し、パケットバッファ191におけるパケットの格納場所を示すポインタを取得する。そして、受信ポート110は、パケットの格納場所を示すポインタとともに、中継処理部102にパケット情報を出力する。
中継処理部102、フロー識別部103、フロー判別処理部104、キュー切替処理部105はそれぞれ、パケット本体に代えて、パケットの格納場所を示すポインタを送信する。
そして、送信キューセット170における出力キューとされたキュー720には、パケット情報、フローID及びパケットの格納場所を示すポインタが格納される。
制御部192は、出力するパケットのパケット情報及びパケットの格納場所を示すポインタの入力を送信キューセット170から受ける。そして、制御部192は、パケットの格納場所を示すポインタを用いてパケットバッファ191に格納されたパケット本体を取得する。そして、制御部192は、パケット情報とパケット本体とを合わせて、パケットを出力した送信キューセット170に対応する送信ポート180へ出力する。
以上に説明したように、本実施例に係るスイッチは、パケット本体はキューに流さずにパケットの位置を示すポインタを流して、キューから出力されたポインタに応じてパケット本体を取得して出力する。このように、パケットを他の場所に格納した状態で処理を行っても、実施例1と同様の効果を得ることができる。
(ハードウェア構成)
ここで、以上の各実施例で説明したスイッチ100は、例えば、LSI(Large Scale Integration)で実現可能である。例えば、図2及び17で例示したデータ保持部160及び送信キューセット170、並びに、図17で例示したパケットバッファ191は、LSIを用いた記憶装置により実現される。さらに、LSIを用いた記憶装置には、図2及び17で例示された中継処理部102、フロー識別部103、フロー判別処理部104及びキュー切替処理部105、並びに、図17に例示した制御部192の機能を実現するプログラムを含む各種プログラムが格納される。
そして、LSIを用いた制御回路が、記憶装置から各種プログラムを読み出して実行することで、中継処理部102、フロー識別部103、フロー判別処理部104、キュー切替処理部105は及び制御部192の機能を実現する。特に、LSI化されたスイッチ100の場合、実施例4で示した態様を有する場合が多い。
ストレージトラフィックをイーサネット(登録商標)で実現する技術として、NVMeoF(Non Volatile Memory express(登録商標) over Fabric)及びRoCE(RDMA(Remote Direct Memory Access ) over Converged Ethernet)といった技術が提案されている。そして、RoCEでは、DCQCN(Data Center Quantized Congestion Notification)という輻輳制御アルゴリズムが用いられることが多い。一方、短時間に通信が集中するマイクロバーストにより、通信性能が低下する現象が発生するおそれがあるため、そのような現象への対応も求められる。
以前は、ネットワークにおける輻輳制御の技術として、キューがいっぱいになった場合に、パケットの破棄を行い、そのパケットの破棄を検出した場合に送信レートを下げているテールドロップと呼ばれる手法が用いられていた。その後、ECN(Explicit Congestion Notification)と呼ばれるネットワークにおける輻輳制御技術が用いられてきた。ECNは以下のような動作で実現される。スイッチが、予めキューの閾値を設定し、キューの長さに応じてパケットにマークを付ける。受信側装置は、パケットにつけられたマークを検出することで輻輳を検知し、送信側装置に輻輳の発生を通知する。送信側装置は、輻輳の発生の通知を受けて送信レートを下げる制御を行う。
その後、マイクロバーストを抑制する輻輳制御技術として、MA(Microburst Aware)-ECNという技術が提案された。MA-ECNでは、フローの初期時点ではECNの閾値の小さいキューにパケットを送信し、マイクロバーストが発生した際の突入時のスループットを抑えることで、他のフローへの影響を軽減させる。TCP(Transmission Control Protocol)通信では、MA-ECNによってマイクロバースト発生時でも通信スループットの低下が抑えられた。
しかしながら、RoCEでは、MA-ECNを用いても通信スループットの低下が発生する場合がある。これには、以下のような理由がある。RoCEで用いる輻輳制御方式のDCQCNでは、フローの初期段階から高いレートでパケットを送信し、且つ、キュー長が閾値付近になるように制御がなされる。これは、比較的高い通信レートが求められることと、パケットロスト防ぐためにPFCというフロー制御の技術を用いるためである。この場合、フローの開始時にマイクロバーストが発生した場合にショートキューからの出力が抑制されず、結果的にロングキューからの出力パケットにECNのためのマークが多く付加されてしまい、ロングキューを用いるフローの転送レートが下がってしまうおそれがある。そこで、DCQCNを用いる構成でマイクロバーストの発生時にも転送レートを低下させないことが求められる。
図18は、輻輳制御を行うスイッチのブロック図である。本実施例に係るスイッチ100は、ショートキューの帯域制御を行うことと、輻輳制御を行い且つロングキューのキュー長によってロングキューの輻輳状態を判定し、輻輳状態でなければショートキューを候補とするパケットであってもロングキューへ回すことが実施例1と異なる。以下の説明では、実施例1と同じ各部の機能については説明を省略する。
ここで、本実施例では、図18に示すように中継処理部102をフロー判別処理部104とキュー切替処理部105との間に配置した。これにより、パケットを出力する送信ポート180の決定処理が実施例1よりも後に移動するが、処理の位置の変更以外の変更はほぼない。すなわち、中継処理部102は、実施例1と同様にフロー識別部103の前に配置してもよい。
各部の間で受け渡しされるデータは、図19のように示される。図19は、実施例5におけるスイッチの各地点において受け渡される情報をまとめた図である。すなわち、受信ポート110からフロー識別部103へ送信される情報として、パケット情報を含む情報セット211が送信される。また、フロー識別部103からフロー判別処理部104へ送信される情報として、パケット情報、フローID及びエントリ情報を含む情報セット212が送信される。また、フロー判別処理部104から中継処理部102へ送信される情報として、パケット情報、フローID、エントリ情報及び候補キューIDを含む情報セット213が送信される。また、中継処理部102からキュー切替処理部105へ送信される情報として、パケット情報、フローID、エントリ情報、候補キューID及び送信ポートIDを含む情報セット214が送信される。また、キュー切替処理部105から送信キューセット170へ送信される情報として、パケット情報、フローID及びキューIDを含む情報セット215が送信される。
本実施例に係るキュー情報管理テーブル163は、図20に示すようにFID、QID及びキューカウンタに加えて、輻輳情報が登録される。図20は、実施例5におけるキュー情報管理テーブルの一例を示す図である。輻輳情報は、対応するQIDを有するキュー720に輻輳が発生しているか否かを表す情報である。ここで本実施例では、全てのポートを1つのエントリで管理したが、キュー情報管理テーブル163に、ポート毎にエントリを登録することも可能である。
キュー切替処理部105は、パケット本体とともに、パケット情報、フローID、エントリ情報、候補キューID及び送信ポートIDを含む情報セット214の入力を中継処理部102から受ける。そして、キュー切替処理部105は、エントリ情報を確認する。
エントリ情報がFoundの場合、キュー切替処理部105は、候補キューIDを確認し、候補キューがショートキューか否かを判定する。候補キューがロングキューであれば、キュー切替処理部105は、その候補キューを維持する。
これに対して、候補キューがショートキューの場合、キュー切替処理部105は、キュー情報管理テーブル163における各ロングキューの輻輳情報を確認して各ロングキューに輻輳が発生しているか否かを判定する。輻輳が発生していなければ、キュー切替処理部105は、候補キューをロングキューとする。これに対して、輻輳が発生している場合、キュー切替処理部105は、候補キューをショートキューのまま維持する。
すなわち、キュー切替処理部105は、候補キューがショートキューであっても、ロングキューに輻輳が発生していなければ、ロングキューの転送レートは未だ余裕があるので、パケットをロングキューへ出力する。一方、輻輳が発生している場合、キュー切替処理部105は、ロングキューの転送レートを維持するため、ショートキューにパケットを振り分ける。
その後、キュー切替処理部105は、キューの切り替えが発生するか否かを判定する。キューの切り替えが発生しない場合、キュー切替処理部105は、出力キューを候補キューとする。この場合、出力キューを現在のキューのまま維持することになる。
一方、キューの切り替えが発生する場合、キュー切替処理部105は、キュー情報管理テーブル163における取得したフローIDに対応するキューカウンタの値が0であれば、そのフローの出力キューを現在のキューから候補キューに変更する。
これに対して、キューカウンタの値が0でない場合、キュー切替処理部105は、そのフローの出力キューを候補キューとされなかった現在のキューのまま維持する。
また、エントリ情報がNewの場合、キュー切替処理部105は、キュー情報管理テーブル163に新たに取得したフローIDを登録して対応するエントリを作成する。そして、キュー切替処理部105は、そのフローの出力キューを候補キューに設定する。
また、エントリ情報がNotfoundの場合、キュー切替処理部105は、そのフローの出力キューを候補キューに設定する。
その後、キュー切替処理部105は、そのフローの出力キューとして決定したキューを有する送信キューセット170へパケット、パケット情報及びそのパケットが属するフローのFIDを出力する。さらに、パケットの出力とともに、キュー切替処理部105は、出力したパケットの出力キューのキューIDをパケットの出力先の送信キューセット170へ出力する。また、キュー切替処理部105は、出力したパケットが属するフローのフローID及び加算を指示するコマンドをキュー情報管理テーブル163へ出力する。
図21は、実施例5に係る送信キューセットのブロック図である。送信キューセット170は、実施例1と同様に、セレクタ701、マルチプレクサ703、スケジューラ704及び複数のキュー721~723を有する。
セレクタ701は、パケット情報、フローID及びパケットの入力をキュー切替処理部105から受ける。さらに、セレクタ701は、そのパケットの出力キューを表すキューIDの入力をキュー切替処理部105から受ける。そして、セレクタ701は、指定されたキューIDを有するキュー720にパケット情報、フローID及びパケットを出力する。
キュー切替処理部105から入力されたキューIDで出力キューとして指定されたキュー720は、パケット情報、フローID及びパケットの入力をセレクタ701から受ける。そして、キュー720は、入力されたパケット情報、フローID及びパケットを格納する。その後、キュー720は、取得タイミングの古い順に保持するパケット情報、フローID及びパケットをマルチプレクサ703へ順次出力していく。さらに、キュー720は、自己のキュー長と予め決められた輻輳閾値とを比較し、キュー長が閾値以上の場合、輻輳情報として輻輳発生をキュー情報管理テーブル163に登録する。これに対して、キュー長が閾値未満の場合、キュー720は、輻輳情報として輻輳未発生をキュー情報管理テーブル163に登録する。
輻輳制御部109は、各送信キューセット171における輻輳を判定するためのキュー長である輻輳判定閾値を有する。そして、輻輳制御部109は、各送信キューセット171のキュー長を取得する。図18では、図示の都合上、輻輳制御部109と送信キューセット171との間の通信経路を示したが、実際には、輻輳制御部109は、他の送信キューセット170と間にも通信経路を有する。輻輳制御部109は、あるキュー700のキュー長が輻輳判定閾値を超えた場合、そのキュー700から出力されるパケットに輻輳発生を表すマークを付加する。輻輳制御部109がマークを付加することで、スイッチ100を介してパケットの送受信を行うサーバ200は、マークにしたがってパケットの送信量を制御して輻輳を解消することができる。
スケジューラ704は、各キュー720のそれぞれの出力帯域についての帯域指定値を予め有する。この帯域指定地が、「所定値」の一例にあたる。そして、スケジューラ704は、各キュー720について、空でければ単位時間の出力データ量である出力帯域を算出する。そして、スケジューラ704は、あるキュー720について、算出した出力帯域が帯域指定値未満の場合、そのキュー720からのパケットの出力を決定する。その後、スケジューラ704は、出力を決定した複数のキュー720に対してマルチプレクサ703が出力するパケットの調停を行う。このスケジューラ704が、「帯域制御部」の一例にあたる。
マルチプレクサ703は、スケジューラ704からの指定にしたがって、パケット情報及びパケットを送信ポート180へ出力する。さらに、マルチプレクサ703は、パケットが属するフローのフローIDを、減算を指示するコマンドとともにキュー情報管理テーブル163へ出力する。
次に、図22を参照して、本実施例に係るキュー切替処理部105によるキューの切り替え処理の流れについて説明する。図22は、実施例5に係るキュー切替処理部によるキューの切り替え処理のフローチャートである。
キュー切替処理部105は、パケット情報、フローID、エントリ情報、候補キューID及び送信ポートIDの入力を中継処理部102から受ける。そして、キュー切替処理部105は、エントリ情報がFoundか否かを判定する(ステップS801)。
エントリ情報がFoundの場合(ステップS801:肯定)、キュー切替処理部105は、候補キューがショートキューであり、且つ、輻輳が発生していないロングキューが存在するか否かを判定する。ここで、輻輳が発生していないロングキューとは、キュー長が輻輳閾値未満のロングキューである(ステップS802)。候補キューがロングキューである、又は、輻輳が発生していないロングキューが存在しない場合(ステップS802:否定)、キュー切替処理部105は、ステップS804へ進む。
候補キューがショートキューであり、輻輳が発生していないロングキューが存在する場合(ステップS802:肯定)、キュー切替処理部105は、ロングキューを候補キューとする(ステップS803)。
次に、キュー切替処理部105は、候補キューと現在のキューのキューIDが同一か否かにより、キューの切り替えが発生するか否かを判定する(ステップS804)。
キューの切り替えが発生する場合(ステップS804:肯定)、キュー切替処理部105は、キュー情報管理テーブル163における取得したフローIDに対応するキューカウンタの値が0か否かを判定する(ステップS805)。
キューカウンタが0の場合(ステップS805:肯定)、キュー切替処理部105は、パケットの出力キューを候補キューに切り替える(ステップS806)。
これに対して、キューの切り替えが発生しない場合(ステップS804:否定)及びキューカウンタが0でない場合(ステップS805:否定)、キュー切替処理部105は、出力キューを現在のキューに維持する(ステップS807)。
一方、エントリ情報がFoundでない場合(ステップS801:否定)、キュー切替処理部105は、エントリ情報がNewか否かを判定する(ステップS808)。エントリ情報がNewでない場合(ステップS808:否定)、すなわち、エントリ情報がNotfoundの場合、キュー切替処理部105は、ステップS810に進む。
これに対して、エントリ情報がNewの場合(ステップS808:肯定)、キュー切替処理部105は、キュー情報管理テーブル163に取得したフローIDに対応するエントリを作成して作成したエントリを初期化し(ステップS809)、ステップS810に進む。
キュー切替処理部105は、出力キューを候補キューに設定する(ステップS810)。
以上に説明したように、本実施例に係るスイッチは、ロングキューの輻輳状態からショートキューを候補キューと判定したパケットをロングキューに回すかショートキューに回すかを判定する。その後、スイッチは、予め決められた帯域幅に抑えられるようにデータを出力させるキューを決定する。これにより、ロングキューの出力レートを高く維持することができ、マイクロバーストなどによる急激な輻輳制御の発生を回避することができる。
次に、実施例6に係るスイッチについて説明する。本実施例に係るスイッチのブロック図も図18で表される。本実施例に係るスイッチ100は、輻輳制御を行い、且つ、DRR(Deficit Round Robin)を用いてパケットを出力させるキュー720のスケジューリングを行うことが実施例5と異なる。以下の説明では、実施例5と同じ各部の機能については説明を省略する。
本実施例に係るキュー情報管理テーブル163は、例えば、図6と同様のフォーマットを有する。すなわち、本実施例に係るキュー情報管理テーブル163は、輻輳情報を有さなくてもよい。この場合も、キュー情報管理テーブル163は、ポート毎にエントリを有してもよい。
そして、本実施例に係るキュー切替処理部105は、実施例1と同様の処理を行い、各フローに含まれるパケットの出力キューを決定する。すなわち、キュー切替処理部105は、出力キューの決定に各キュー720の輻輳状態を考慮しなくてもよい。
さらに、本実施例に係る送信キューセット170は、例えば、図7に示す構成を有する。すなわち、本実施例に係る送信キューセット170では、キュー721は、輻輳状態を判定してキュー情報管理テーブル163に登録しなくてもよい。
そして、スケジューラ704は、DRRアルゴリズムを用いて、各キュー720の出力帯域が予め指定された割合になるように、パケットを出力させるキュー720を選択する。この処理が、「パケットの送信レートが所定の割合になるように制御する」処理の一例にあたる。ここで本実施例では、DDRアルゴリズムを用いたが、スケジューラ704は、各キューの出力帯域を維持するアルゴリズムであれば他のアルゴリズムを用いてもよく、例えば、WRR(Weighted Round Robin)やWFQ(Weighted Fair Queuing)などを用いてもよい。
以上に説明したように、本実施例に係るスイッチは、DRRを用いた帯域制御により、ロングキューにパケットが無い場合に、ショートキューの帯域が制限されずに出力される。これにより、ロングキュー及びショートキューの何れにおいても、データ転送の性能を維持することが可能となる。
図23は、実施例7に係る情報処理システムのブロック図である。本実施例に係る情報処理システム1は、フロー識別の処理及びフロー判別処理をサーバ200が行い、スイッチ100はキュー切替処理を行うことが実施例6と異なる。実施例1と同じ符号を有する各部は特に説明のない限り同じ機能を有する。
サーバ200は、通信部221、フロー判別部222、フロー判別テーブル223及び受信バッファ224を有する。
通信部221は、通信相手との間で接続を確立する。そして、通信部221は、データの送受信を行いフローを処理する。データ送信時、通信部221は、データをフロー判別部222へ出力する。
また、通信部221は、図示を省略するが、スイッチ100の送信ポート181と接続される。そして、通信部221は、送信ポート181から出力されたパケットを受信する。受信したパケットにACK(Acknowledgement)を含む場合、通信部221は、ACKに対するプロトコル処理を実行する。そして、通信部221は、ACKの受信をフロー判別部222へ通知する。また、受信したパケットにデータが含まれる場合、通信部221は、データを受信バッファ224に格納する。データの送受信完了後、通信部221は、接続を切断する。
フロー判別テーブル223は、例えば、図24に示すようなプライオリティとフロー種別との対応を表す情報を有する。プライオリティとは、パケットヘッダのVLAN(Virtual Local Area Network)タグに存在するプライオリティのフィールドに登録される値である。図24は、フロー判別テーブルの一例を表す図である。本実施例では、プライオリティは、0~7の値が存在する。そして、値が3のプライオリティに対応するフロー種別は、転送量の大きいフローを表す「ロング」というフロー種別である。また、値が4のプライオリティに対応するフロー種別は、転送量の小さいフローを表す「ショート」というフロー種別である。それ以外の、値が0~2及び5~7のプライオリティに対応するフロー種別は、「その他」のフロー種別を表す。
フロー判別部222は、通信部221による通信相手との接続の確立が完了すると、自己が保持するフローの送信量の情報を初期化して0にする。次に、フロー判別部222は、送信するパケットを通信部221から取得する。次に、フロー判別部222は、フローの送信量が予め決められた判別閾値以上か否かを判定する。送信量が判別閾値未満であれば、フロー判別部222は、フロー判別テーブル223からショートのフローに対応するプライオリティを表す値である「3」を取得する。そして、フロー判別部222は、パケットヘッダのVLANタグのプライオリティのフィールドに「3」を登録する。
これに対して、送信量が判別閾値以上の場合、フロー判別部222は、そのフローに属するパケットの前回送信時において使用したキューがショートキューか否かを判定する。前回の送信時にロングキューを使用した場合、フロー判別部222は、フロー判別テーブル223からロングのフローに対応するプライオリティを表す値である「4」を取得する。そして、フロー判別部222は、パケットヘッダのVLANタグのプライオリティのフィールドに「4」を登録する。
これに対して、前回の送信時にショートキューを使用した場合、フロー判別部222は、前回のパケット送信に対するACKの受信の通知を通信部221から受けたか否かを判定する。前回のパケット送信に対するACKの受信の通知を通信部221から受けていない場合、パケットがキュー720に溜まっている可能性があることからパケットの追い越しを防止するため、フロー判別部222は、パケットの送信処理を終了する。
これに対して、前回のパケット送信に対するACKの受信の通知を通信部221から受けた場合、フロー判別部222は、パケットがキュー720に溜まっている可能性はないと判定する。次に、フロー判別部222は、フロー判別テーブル223からロングのフローに対応するプライオリティを表す値である「4」を取得する。そして、フロー判別部222は、パケットヘッダのVLANタグのプライオリティのフィールドに「4」を登録する。
そして、フロー判別部222は、プライオリティフィールドに値が設定されたパケットをスイッチ100へ送信する。さらに、フロー判別部222は、フローの送信量にパケット長を加算する。その後、フロー判別部222は、そのフローに属する次のパケットの送信の処理に移る。このフロー判別部222が、「第1通信装置における送信制御部」の一例にあたる。
スイッチ100は、受信ポート110、中継処理部102、キュー切替処理部105、輻輳制御部109、送信キューセット170、送信ポート180及び中継テーブル121を有する。中継テーブル121は、アドレスに対応する送信ポート180の情報が登録される。送信ポート180の情報には、送信ポート180へパケットを出力するキュー700のキューIDや送信ポート180の識別情報などが含まれる。
受信ポート110は、プライオリティフィールドに値が設定されたパケットをサーバ220から受信する。そして、受信ポート110は、受信したパケットをフロー判別処理部104へ出力する。
フロー判別処理部104は、パケットの入力を受信ポート110から受ける。そして、フロー判別処理部104は、パケットヘッダのプライオリティフィールドに設定された値を取得する。プライオリティフィールドに設定された値が3の場合、フロー判別処理部104は、パケットの出力キューをロングキューとする。また、プライオリティフィールドに設定された値が4の場合、フロー判別処理部104は、パケットの出力キューをショートキューとする。そして、キュー切替処理部105は、出力キューの指定情報とともにパケットを中継処理部102へ出力する。
中継処理部102は、出力キューの指定情報とともにパケットの入力をフロー判別処理部104から受ける。そして、中継処理部102は、パケットヘッダから宛先のアドレスを取得する。次に、中継処理部102は、取得したアドレスに対応する送信ポート180の情報を中継テーブル121から取得する。その後、中継処理部102は、パケットを送信する送信ポート180の情報及び出力キューの指定情報とともにパケットをキュー切替処理部105へ出力する。
キュー切替処理部105は、送信ポート180の情報及び出力キューの指定情報とともにパケットの入力を中継処理部102から受ける。そして、キュー切替処理部105は、送信ポート180の情報で指定された送信キューセット170におけるキュー720のうち、出力キューの指定情報に応じたキュー720へパケットを格納する。
スケジューラ704は、DRRアルゴリズムを用いて、各キュー720の出力帯域が予め指定された割合になるように、パケットを出力させるキュー720を選択する。ここで本実施例では、DDRアルゴリズムを用いたが、スケジューラ704は、各キューの出力帯域を維持するアルゴリズムであれば他のアルゴリズムを用いてもよく、例えば、WRRやWFQなどを用いてもよい。マルチプレクサ703は、スケジューラ704により選択されたキュー720からパケットを取得して送信ポート180へ出力する。
次に、図25~27を参照して、本実施例に係るサーバ200によるフロー管理処理の流れについて説明する。図25は、実施例7に係るサーバによるフロー管理の全体的な処理のフローチャートである。図26は、実施例7に係るサーバによる送信処理のフローチャートである。図27は、実施例7に係るサーバによる受信処理のフローチャートである。
図25を参照して、本実施例に係るサーバ200によるフロー管理処理の全体的な流れを説明する。
通信部221は、通信相手との間の接続を確立する(ステップS901)。
フロー判別部222は、フローの送信量の情報を初期化して0にする(ステップS902)。
次に、フロー判別部222は、通信相手にパケットを送信する送信処理を実行する(ステップS903)。
その後、通信部221は、通信相手からパケットを受信する受信処理を実行する(ステップS904)。
通信部221は、通信相手との接続を切断するか否かを判定する(ステップS905)。接続を切断しない場合(ステップS905:否定)、フロー管理の処理はステップS903へ戻る。
これに対して、接続を切断する場合(ステップS905:肯定)、通信部221は、通信相手との接続を切断し通信を終了する(ステップS906)。これにより、フロー管理の処理も終了する。
次に、図26を参照して、サーバ200におけるパケットの送信処理の流れについて説明する。図26に記載したフローに含まれる各処理は、図25におけるステップS903で実行される処理の一例にあたる。
フロー判別部222は、通信部221からパケットの入力を受けたか否かにより、送信パケットがあるか否かを判定する(ステップS911)。送信するパケットがない場合(ステップS911:否定)、フロー判別部222は、パケットの送信処理を終了する。
これに対して、送信するパケットがある場合(ステップS911:肯定)、フロー判別部222は、送信量が判別閾値以上か否かを判定する(ステップS912)。送信量が判別閾値未満の場合(ステップS912:否定)、フロー判別部222は、フロー種別を表す情報としてショートの情報をパケットに付加する(ステップS913)。
これに対して、送信量が判別閾値以上の場合(ステップS912:肯定)、フロー判別部222は、そのフローに属するパケットの前回送信時において使用したキューがショートキューか否かを判定する(ステップS914)。前回の送信時にロングキューを使用した場合(ステップS914:否定)、フロー判別部222は、ステップS916へ進む。
これに対して、前回の送信時にショートキューを使用した場合(ステップS914:肯定)、フロー判別部222は、前回のパケット送信に対するACKを受信したか否かを判定する(ステップS915)。前回のパケット送信に対するACKを受信していない場合(ステップS915:否定)、フロー判別部222は、パケットの送信処理を終了する。
これに対して、前回のパケット送信に対するACKの受信の通知を通信部221から受けた場合(ステップS915:肯定)、フロー種別を表す情報としてロングの情報をパケットに付加する(ステップS916)。
次に、フロー判別部222は、プライオリティフィールドに値が設定されたパケットをスイッチ100へ送信する(ステップS917)。
次に、フロー判別部222は、フローの送信量にパケット長を加算する(ステップS918)。その後、フロー判別部222は、ステップS911に戻る。
次に、図27を参照して、サーバ200におけるパケットの受信処理の流れについて説明する。図27に記載したフローにおける各処理は、図25におけるステップS904で実行される処理の一例にあたる。
通信部221は、受信パケットがあるか否かを判定する(ステップS921)。受信パケットがない場合(ステップS921:否定)、通信部221は、パケットの受信処理を終了する。
これに対して、受信パケットがある場合(ステップS921:肯定)、通信部221は、パケットを受信する(ステップS922)。
次に、通信部221は、受信したパケットがACKを含むパケットであれば、ACKを含むプロトコル処理を実行する(ステップS923)。そして、通信部221は、ACKの受信をフロー判別部222へ通知する。
次に、通信部221は、受信したパケットにデータが含まれる場合、パケットからデータを取得して受信バッファ224に格納する(ステップS924)。その後、通信部221は、ステップS921へ戻る。
以上に説明したように、本実施例に係る情報処理システムは、サーバ側でフローの種別の管理やパケットの追い越し防止の処理を実行し、スイッチ側で輻輳の発生を抑えるキュースケジューリングを実行する。このように、フローの管理処理と輻輳制御の処理をサーバとスイッチで分離しても、ロングキュー及びショートキューの何れにおいても、データ転送の性能を維持することができる。また、本実施例に係る構成の場合、スイッチでは通常の輻輳制御を行うため、特別なスイッチを用意しなくてもよい。そのため、本実施例に係る情報処理システムは導入が容易である。
図28は、実施例5のスイッチを用いた場合の効果を説明するための図である。グラフ91は、実施例5のスイッチ100を用いない場合のマイクロバースト発生時のスループットの変化を表す。また、グラフ95は、実施例5のスイッチ100を用いた場合のマイクロバースト発生時のスループットの変化を表す。グラフ91及び95ともに縦軸でスループットを表し、横軸で時間を表す。
グラフ91における線分92がロングキューにおけるスループットを表す。また、線分93がショートキューにおけるスループットを表す。そして、線分94がロングキューとショートキューとを合わせたスループットを表す。
線分93に示すように、マイクロバーストの発生によりショートキューでは時々スループットが急上昇する。そして、線分92に示すように、ショートキューにおけるスループットの急上昇に影響を受けて、ロングキューのスループットは、マイクロバースト発生時に降下する。これにより、全体のスループットも、線分94に示すようにマイクロバースト発生時に低下する。
一方、グラフ95における線分96がロングキューにおけるスループットを表す。また、線分97がショートキューにおけるスループットを表す。そして、線分98がロングキューとショートキューとを合わせたスループットを表す。
線分97に示すように、グラフ91と同様に、マイクロバーストの発生によりショートキューでは時々スループットが急上昇する。しかしながら、ショートキューにおけるスループットの急上昇が発生しても、線分96に示すように、ロングキューのスループットは影響をほぼ受けずに速度が維持される。この場合、全体のスループットも、線分98に示すようにマイクロバーストが発生しても速度を維持することができる。ここでは、実施例5のスイッチ100を例にしたが、実施例6及び7のスイッチ100でもほぼ同様の効果を得ることが可能である。したがって、実施例5~7で説明したスイッチ100を用いることで、DCQCNによる輻輳制御を行っても、マイクロバースト発生時における大きな性能低下を回避することができることが分かる。
実施例5~7で説明したスイッチ100の機能も、例えば、LSIで実現可能である。例えば、LSIを用いた記憶装置には、図18及び23で例示された中継処理部102、フロー識別部103、フロー判別処理部104及びキュー切替処理部105の機能を実現するプログラムを含む各種プログラムが格納される。そして、LSIを用いた制御回路が、記憶装置から各種プログラムを読み出して実行することで、中継処理部102、フロー識別部103、フロー判別処理部104及びキュー切替処理部105の機能を実現する。
また、実施例7で説明したサーバ200は、CPU(Central Processing Unit)及びメモリを有する。メモリには、例えば、図23で例示した、通信部221及びフロー判別部222の機能を実現するプログラムを含む各種プログラムが格納される。また、メモリは、受信バッファ224の機能を実現する。また、メモリは、フロー判別テーブル223を格納する。CPUは、メモリから各種プログラムを読み出して展開して実行することで、通信部221及びフロー判別部222の機能を実現する。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)前記フローに関する特徴量を取得する特徴量取得部と、
前記特徴量取得部により取得された前記特徴量を基に前記フローの前記パケットの送信を制御する送信制御部と
を備えたことを特徴とする情報処理装置。
(付記2)前記パケットを格納し、格納した前記パケットを順次出力する複数のキューをさらに備え、
前記送信制御部は、前記特徴量取得部により取得された前記特徴量を基に前記フローの前記パケットを送信するキューを決定し、前記フローの前記パケットを決定した前記キューに送信する
ことを特徴とする付記1に記載の情報処理装置。
(付記3)前記送信制御部は、前記フローの前記パケットが前記キューのいずれにも蓄積されていない場合に、前記フローの前記パケットを決定した前記キューに送信することを特徴とする付記2に記載の情報処理装置。
(付記4)前記送信制御部は、前記特徴量に関する閾値を予め有し、前記フローの前記特徴量が前記閾値以上の場合に第1キューを前記フローの前記パケットを送信するキューと決定し、前記フローの前記特徴量が前記閾値未満の場合に第2キューを前記フローのパケットを送信するキューに決定することを特徴とする付記2又は3に記載の情報処理装置。
(付記5)前記特徴量取得部は、前記特徴量として前記パケットの転送量を取得し、
前記送信制御部は、転送量閾値を予め有し、前記転送量が前記転送量閾値以上の場合に第1キューを前記フローの前記パケットを送信する送信キューと決定し、前記転送量が前記転送量閾値未満の場合に第2キューを前記フローの前記パケットを送信するキューに決定することを特徴とする付記2~4のいずれか一つに記載の情報処理装置。
(付記6)前記パケットの送信レートが所定値以下となるように制御する帯域制御部と、
前記パケットの輻輳を抑制する輻輳制御部とをさらに備え、
前記送信制御部)は、前記特徴量に加えて前記パケットの滞留量を基に、前記パケットを送信するキューを決定する
ことを特徴とする付記1~5のいずれか一つに記載の情報処理装置。
(付記7)前記パケットの送信レートが所定の割合になるように制御する帯域制御部と、
前記パケットの輻輳を抑制する輻輳制御部と
をさらに備えたことを特徴とする付記1~5のいずれか一つに記載の情報処理装置。
(付記8)第1通信装置、第2通信装置との間でパケット処理部を介して通信を行う情報処理システムであって、
前記第1通信装置は、前記第2通信装置を送信先とするパケットを前記パケット処理部を介して送信し、
前記第2通信装置は、前記第1通信装置を送信元とするパケットを前記パケット処理部を介して受信し、
前記パケット処理部は、
前記第1通信装置から送信された前記第2通信装置宛の複数のパケットの送信処理のフローを識別するフロー識別部と、
前記フローに関する特徴量を取得する特徴量取得部と、
前記特徴量取得部により取得された前記特徴量を基に前記フローの前記パケットの前記第2通信装置への送信を制御する送信制御部とを備えた
ことを特徴とする情報処理システム。
(付記9)前記第1通信装置と第2の通信装置との間に設けられたスイッチを備え、
前記スイッチは、前記パケット処理部を備える
ことを特徴とする付記8記載の情報処理システム。
(付記10)前記第1通信装置と前記第2通信装置との間に設けられたスイッチを備え、
前記第1通信装置は、前記パケット処理部を備え、
前記スイッチは、
前記パケットの送信レートが所定の割合になるように制御する帯域制御部と、
前記パケットの輻輳を抑制する輻輳制御部とを備え、
前記第2通信装置は、前記第1通信装置を送信元とするパケットを前記スイッチから受信する
ことを特徴とする付記8記載の情報処理システム。
(付記11)複数のパケットを送信する処理のフローを識別し、
前記フローに関する特徴量を取得し、
取得した前記特徴量を基に前記フローの前記パケットの送信を制御する
処理をコンピュータに実行させることを特徴とする情報処理プログラム。