JP2018181134A - 情報処理装置、情報処理方法および情報処理プログラム - Google Patents
情報処理装置、情報処理方法および情報処理プログラム Download PDFInfo
- Publication number
- JP2018181134A JP2018181134A JP2017082661A JP2017082661A JP2018181134A JP 2018181134 A JP2018181134 A JP 2018181134A JP 2017082661 A JP2017082661 A JP 2017082661A JP 2017082661 A JP2017082661 A JP 2017082661A JP 2018181134 A JP2018181134 A JP 2018181134A
- Authority
- JP
- Japan
- Prior art keywords
- thread
- queue
- stored
- reception
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/10—Flow control; Congestion control
- H04L47/26—Flow control; Congestion control using explicit feedback to the source, e.g. choke packets
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
Abstract
【課題】データの受信が完了したかの確認処理負荷を軽減する。【解決手段】制御部1bは、スレッド11の実行により、情報処理装置2からのデータの受信要求を通信インタフェース1aに発行した後、受信要求に対応する受信データを受信したことを示す完了通知がキュー1cに格納されたかを確認し、完了通知が格納されていない場合には、スレッド11をサスペンド状態に遷移させる。また、制御部1bは、スレッド11〜13のうち起床状態のスレッド12,13の中から次に実行させるスレッドを選択する選択処理と、キュー1cを確認する確認処理とを交互に実行する処理を実行し、確認処理によってキュー1cに完了通知が格納されたことを検知した場合、受信データをスレッド11に受け渡してスレッド11をサスペンド状態から復帰させる。【選択図】図1
Description
本発明は、情報処理装置、情報処理方法および情報処理プログラムに関する。
装置間で通信するためのバスの規格として、InfiniBand(登録商標)が知られている。InfiniBandを用いた通信では、送信側装置と受信側装置のそれぞれにおいて、要求された通信処理が完了したことを示す完了通知が格納されるキューが用いられる。このキューは、CQ(Completion Queue)と呼ばれる。例えば、受信側装置で実行されるスレッドは、データの受信が完了したかを確認するために、CQのポーリングを行う。受信側装置がデータを受信すると、完了通知がCQに格納される。スレッドは、ポーリングによってCQから完了通知を取得できたとき、データの受信が完了したことを認識する。
また、InfiniBandに関する技術の例として、受信メッセージにQP(Queue Pair)番号が付加されているかを判定し、付加されている場合だけQP番号のチェックを行うことで、チェック効率を高めた情報処理装置が提案されている。
また、ネットワークインタフェースに関する技術の例として、それぞれRDMA(Remote Direct Memory Access)に対応する主要なNIC(Network Interface Controller)と代替のNICとが共有する待ち行列ペアを作成し、スイッチオーバイベントの検出に応答して、待ち行列ペアの扱いを主要なNICから代替のNICに切り替える方法が提案されている。
ところで、InfiniBandの受信側装置では、装置の処理負荷や伝送路の負荷によって、スレッドがCQのポーリングを開始してからCQに完了通知が格納されるまでの遅延時間が長くなる場合がある。その場合、スレッドは、CQのポーリングを一定回数行った後にサスペンドし、その後にスレッドスケジューラによって起床され、CQのポーリングを再度行う。遅延時間が長くなるほど、ポーリングを行うためのスレッドの起床とサスペンドとが繰り返し実行されるようになる。スレッドの起床やサスペンドの際には、処理負荷の高いコンテキストスイッチが発生するので、遅延時間が長くなるほど、受信が完了したかを確認するための処理負荷が増大してしまう。
1つの側面では、本発明は、データの受信が完了したかの確認処理負荷を軽減することが可能な情報処理装置、情報処理方法および情報処理プログラムを提供することを目的とする。
1つの案では、情報処理装置が提供される。この情報処理装置は、他の情報処理装置と通信するための通信インタフェースと、次のような処理を実行する制御部とを有する。制御部は、複数のスレッドのうち一のスレッドの実行により、他の情報処理装置からのデータの受信要求を通信インタフェースに発行した後、受信要求に対応する受信データを受信したことを示す完了通知がキューに格納されたかを確認し、完了通知が格納されていない場合には、一のスレッドをサスペンド状態に遷移させる第1の処理を実行する。また、制御部は、複数のスレッドのうちサスペンド状態でないスレッドの中から次に実行させるスレッドを選択する選択処理と、キューを確認する確認処理とを交互に実行する第2の処理を実行する。ここで、制御部は、確認処理によってキューに完了通知が格納されたことを検知した場合、受信データを一のスレッドに受け渡して一のスレッドをサスペンド状態から復帰させる。
また、1つの案では、上記の情報処理装置と同様の処理をコンピュータが実行する情報処理方法が提供される。
さらに、1つの案では、上記の情報処理装置と同様の処理をコンピュータに実行させる情報処理プログラムが提供される。
さらに、1つの案では、上記の情報処理装置と同様の処理をコンピュータに実行させる情報処理プログラムが提供される。
1つの側面では、データの受信が完了したかの確認処理負荷を軽減できる。
以下、本発明の実施の形態について図面を参照して説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る情報処理システムの構成例および処理例を示す図である。図1に示す情報処理システムは、情報処理装置1,2を有する。情報処理装置1と情報処理装置2とは、例えばInfiniBandによって接続され、互いに通信することが可能になっている。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る情報処理システムの構成例および処理例を示す図である。図1に示す情報処理システムは、情報処理装置1,2を有する。情報処理装置1と情報処理装置2とは、例えばInfiniBandによって接続され、互いに通信することが可能になっている。
情報処理装置1は、通信インタフェース1aと制御部1bを有する。通信インタフェース1aは、情報処理装置2との間で通信を行う。制御部1bは、例えば、情報処理装置1が備えるプロセッサとして実現される。
制御部1bは、スレッド11〜13を実行する。スレッド11〜13のそれぞれの処理は、情報処理装置2からのデータ受信処理を含む。ここで、情報処理装置1でのデータ受信処理は、基本的に次のような手順で行われる。
制御部1bは、通信インタフェース1aに対してデータの受信要求を発行し、受信待ち状態になる。通信インタフェース1aが情報処理装置2からのデータを受信すると、発行された受信要求に対応する受信処理が完了したことを示す完了通知が、キュー1cに登録される。キュー1cは、FIFO(First In First Out)方式で完了通知を保持する。なお、受信されたデータは、例えば、バッファ1dに一時的に格納される。
制御部1bは、受信要求の発行後、受信要求に対応する完了通知がキュー1cに格納されたかを確認する。そして、制御部1bは、完了通知がキュー1cに格納されたことを検知した場合、すなわち、完了通知をキュー1cから取得できた場合に、受信処理が完了したことを認識し、バッファ1dに格納された受信データを取得する。
このような処理手順によれば、受信要求の発行から完了通知がキュー1cに格納されるまでの遅延時間が長い場合、制御部1bは、完了通知を取得できるまで何回もキュー1cを確認する。ここで、例えば、制御部1bが、スレッド11の実行によって受信要求を発行した場合に、スレッド11の処理によって、対応する完了通知がキュー1cから取得できるまでキュー1cの確認を繰り返すケースを仮定する。1つのスレッド11が制御部1bを長時間独占することはできないため、上記のケースでは、スレッド11の実行により何回かキュー1cを確認しても完了通知を取得できない場合、制御部1bは、スレッド11をサスペンドさせて、他のスレッドの実行を開始する。その後、制御部1bは、スレッド11をサスペンド状態から復帰させて実行することで、キュー1cの確認を再度実行する。しかし、完了通知を取得できない場合、制御部1bは、スレッド11を再度サスペンドさせて他のスレッドの実行を開始する。
このように、上記ケースでスレッド11の処理だけによってキュー1cの確認を行うものとすると、スレッド11による受信要求の発行から完了通知がキュー1cに格納されるまでの遅延時間が長い場合、スレッド11がサスペンドと復帰とを何度も繰り返す。スレッド11のサスペンドや復帰の際には、処理負荷の高いコンテキストスイッチが発生する。このため、上記の遅延時間が長くなるほど、受信が完了したかを確認するための制御部1bの処理負荷が増大してしまう。
このような問題に対して、本実施の形態では、制御部1bは、スレッドをサスペンドさせたままキュー1cの確認を実行できるようにすることで、スレッドのサスペンドや復帰の回数を低減し、処理負荷を抑制する。以下、制御部1bの具体的な処理について説明する。
制御部1bは、次のような第1の処理を実行する(ステップS1)。ここでは例として、スレッド11の実行によって受信要求が発行されるものとする。制御部1bは、スレッド11の実行により、受信要求を通信インタフェース1aに発行する。その後、制御部1bは、発行した受信要求に応じた受信処理の完了を示す完了通知がキュー1cに格納されたかを確認する。この確認処理は、例えば、一定回数を上限として実行される。ここで、該当する完了通知がキュー1cに格納されたことを検知できなかった場合、制御部1bは、スレッド11をサスペンド状態に遷移させる。
また、制御部1bは、スレッド11〜13のうちサスペンド状態でないスレッド12,13の中から、次に実行させるスレッドを選択する選択処理(ステップS2a)と、キュー1cの確認処理(ステップS2b)とを交互に実行する第2の処理を実行する(ステップS2)。この第2の処理では、実行させるスレッドの選択処理が繰り返し実行されることで、制御部1bはスレッドスケジューラとして動作する。
ここで、選択処理と確認処理とが繰り返し実行されるうちに、あるタイミングで、ステップS1で発行された受信要求に対応するデータ10が、通信インタフェース1aによって受信され、バッファ1dに格納されたとする。この場合、制御部1bは、データ10の受信後に実行したキュー1cの確認処理(ステップS2b)により、ステップS1で発行された受信要求に応じた受信処理の完了を示す完了通知が、キュー1cに格納されたことを検知する。すると、制御部1bは、受信されたデータ10をスレッド11に受け渡す。そして、制御部1bは、スレッド11をサスペンド状態から復帰させて、選択処理の対象にスレッド11を復帰させる。
以上の処理によれば、制御部1bは、スレッド11の実行によるステップS1での確認処理によって完了通知がキュー1cに格納されたことを検知できなかった場合、スレッド11をサスペンド状態にさせる。それ以後、制御部1bは、スレッド11をサスペンドさせた状態のまま、キュー1cの確認を周期的に実行する。そして、制御部1bは、完了通知がキュー1cに格納されたことを検知すると、受信されたデータ10をスレッド11に受け渡して、スレッド11を復帰させる。
これにより、スレッド11は、一度サスペンドした後は、キュー1cの確認のために復帰することはなく、第2の処理(ステップS2)の実行によって該当する完了通知がキュー1cから検知されると復帰する。したがって、スレッド11がサスペンドと復帰とを繰り返すことがなくなり、データの受信が完了したかを確認するための制御部1bの処理負荷を軽減できる。その結果、情報処理装置1によるデータ受信処理全体の負荷を軽減し、データ受信処理を効率化することができる。
〔第2の実施の形態〕
図2は、第2の実施の形態に係るストレージシステムの構成例を示す図である。図2に示すストレージシステムは、ノード100−1〜100−4を有する。ノード100−1,100−2,100−3,100−4には、それぞれストレージ200−1,200−2,200−3,200−4が接続されている。そして、ノード100−1,100−2,100−3,100−4は、それぞれストレージ200−1,200−2,200−3,200−4に対するアクセスを制御するストレージ制御装置として動作する。
図2は、第2の実施の形態に係るストレージシステムの構成例を示す図である。図2に示すストレージシステムは、ノード100−1〜100−4を有する。ノード100−1,100−2,100−3,100−4には、それぞれストレージ200−1,200−2,200−3,200−4が接続されている。そして、ノード100−1,100−2,100−3,100−4は、それぞれストレージ200−1,200−2,200−3,200−4に対するアクセスを制御するストレージ制御装置として動作する。
なお、ストレージ200−1〜200−4のそれぞれには、1台または複数台の不揮発性記憶装置が搭載されている。不揮発性記憶装置は、例えば、SSD(Solid State Drive)やHDD(Hard Disk Drive)である。また、ノード100−1とストレージ200−1、ノード100−2とストレージ200−2、ノード100−3とストレージ200−3、ノード100−4とストレージ200−4は、それぞれストレージノードを形成する。なお、ストレージシステムに含まれるストレージノードの数は、図2のように4ノードに限定されるものではなく、2以上の任意の数とすることができる。
ノード100−1〜100−4は、スイッチ300を介して互いに接続されている。本実施の形態では、ノード100−1〜100−4は、InfiniBandで互いに接続されている。また、ノード100−1〜100−4は、ネットワーク400を介してホスト装置410,420と接続されている。ノード100−1〜100−4とホスト装置410,420との間は、例えば、SAS(Serial Attached SCSI,SCSI:Small Computer System Interface)やFC(Fibre Channel)を用いたSAN(Storage Area Network)によって接続されている。
このストレージシステムは、例えば、ホスト装置410,420から書き込みが要求されたデータが分散して格納される分散ストレージシステムとして動作する。例えば、次のようなストレージアクセス制御が実行される。
ストレージシステムは、ホスト装置410,420に対して複数の論理ボリュームを提供する。ホスト装置410,420は、ある論理ボリュームにアクセスする際、ノード100−1〜100−4のいずれかに対してIO(Input/Output)要求を送信する。また、論理ボリュームにおける書き込みアドレスの範囲ごとに、データの格納を行う担当ノードがあらかじめ決められている。
例えば、あるノードがIO要求として書き込み要求を受信したとする。書き込み要求を受信したノードは、書き込みアドレスを解析して、ノード100−1〜100−4の中から担当ノードを判別し、担当ノードに対して書き込みデータを転送する。担当ノードは、転送された書き込みデータを一旦キャッシュに格納した後、非同期のタイミングで、担当ノードに接続されているストレージに書き込みデータを格納する。
また、例えば、担当ノードは、書き込みデータのハッシュ値に基づいて決められていてもよい。この場合、担当ノードは、書き込みデータのハッシュ値に基づいて、同一内容のデータが重複してストレージに格納されないように制御する「重複除去」を行うこともできる。
なお、ストレージシステムに接続可能なホスト装置の台数は、図2のように2台に限定されるものではない。
図3は、ノードのハードウェア構成例を示す図である。図3に示すノード100は、図2に示したノード100−1〜100−4のいずれかを示す。以下の説明では、ノード100−1〜100−4のそれぞれを特に区別せずに示す場合には、「ノード100」と記載する場合がある。
図3は、ノードのハードウェア構成例を示す図である。図3に示すノード100は、図2に示したノード100−1〜100−4のいずれかを示す。以下の説明では、ノード100−1〜100−4のそれぞれを特に区別せずに示す場合には、「ノード100」と記載する場合がある。
ノード100は、例えば、図3に示すようなコンピュータとして実現される。ノード100は、CPU(Central Processing Unit)101a〜101c、メモリ102、SSD103、読み取り装置104、ホストインタフェース105、ドライブインタフェース106およびHCA(Host Channel Adapter)107を有する。
CPU101a〜101cは、ノード100全体を統括的に制御する。なお、CPUの個数は3つに限定されるものではない。メモリ102は、DRAM(Dynamic Random Access Memory)などの揮発性記憶装置であり、ノード100の主記憶装置として使用される。メモリ102には、CPU101a〜101cに実行させるOS(Operating System)プログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、CPU101a〜101cによる処理に必要な各種データが格納される。
SSD103は、ノード100の補助記憶装置として使用される。SSD103には、OSプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、HDDなどの他の種類の不揮発性記憶装置が用いられてもよい。読み取り装置104には、可搬型記録媒体104aが脱着される。読み取り装置104は、可搬型記録媒体104aに記録されたデータを読み取ってCPU101a〜101cに送信する。可搬型記録媒体104aとしては、光ディスク、光磁気ディスク、半導体メモリなどがある。
ホストインタフェース105は、ネットワーク400を介してホスト装置410,420との間で通信するためのインタフェース装置である。ドライブインタフェース106は、ストレージ200との間で通信するためのインタフェース装置である。HCA107は、スイッチ300を介して他のノード100と通信するための、InfiniBandに準拠したインタフェース装置である。
以上のハードウェア構成によってノード100(ノード100−1〜100−4)の処理機能を実現することができる。なお、ホスト装置410,420も、ノード100と同様にCPUやメモリなどを有するコンピュータとして実現することができる。
<スレッドに対するキューの割り当て>
次に、ノードで実行されるスレッドに対する、ノード間の通信で用いられるキューの割り当てについて説明する。ここではまず、図4、図5を用いて、InfiniBandを用いたノード間通信の比較例について説明し、その後に本実施の形態におけるノード間通信について説明する。
次に、ノードで実行されるスレッドに対する、ノード間の通信で用いられるキューの割り当てについて説明する。ここではまず、図4、図5を用いて、InfiniBandを用いたノード間通信の比較例について説明し、その後に本実施の形態におけるノード間通信について説明する。
図4は、送信側ノードと受信側ノードとの間の基本的な通信処理手順について説明するための図である。図4では、HCA511を有するノード510と、HCA521を有するノード520とを示し、ノード510からノード520に対してInfiniBandを介してデータが送信される場合について説明する。
InfiniBandでは、送信用のQP512と、受信用のQP522とを用いて通信が行われる。送信用のQP512は、送信要求を示すエントリを格納するFIFOであり、「SQ(Send Queue)」とも呼ばれる。QP512に格納されるエントリには、例えば、送信メッセージが格納されている送信バッファのアドレスなどが含まれる。また、受信用のQP522は、受信要求を示すエントリを格納するFIFOであり、「RQ(Receive Queue)」とも呼ばれる。QP522に格納されるエントリには、例えば、受信メッセージが格納される受信バッファのアドレスなどが含まれる。
送信側のノード510において、アプリケーション513は、メッセージを送信する際、送信関数「send」(例えば、ibv_post_send())を発行する。すると、送信要求を示すエントリがQP512に格納されるとともに、引数として指定されたアドレスが示す送信バッファに送信メッセージがセットされる。なお、QP512に格納されるエントリはWQE(Work Queue Element)と呼ばれる。HCA511は、QP512から取得したエントリに基づいて送信メッセージを送信する。
また、InfiniBandでは、QPに加えてCQが用いられる。CQは、完了を示すエントリを格納するFIFOである。CQに格納されるエントリは、CQE(Completion Queue Entry)と呼ばれる。このエントリが示す「完了(Completion)」の内容としては、QPのエントリに対応する処理が正常に終了したことを示す「Successful Completion」と、エラーで終了したことを示す「Completion Error」とがある。
HCA511によるメッセージ送信処理が完了すると、完了を示すエントリがCQ514に格納される。アプリケーション513は、送信関数「send」の発行後にCQ514のポーリングを行うことで、送信要求に応じた処理の完了を示すエントリをCQ514から取得する。
一方、受信側のノード520において、アプリケーション523は、メッセージを受信する際、受信関数「recv」(例えば、ibv_post_recv())を発行する。すると、受信要求を示すエントリがQP522に格納される。HCA521は、QP522から取得したエントリに基づいてメッセージを受信し、エントリに含まれるアドレスが示す受信バッファに受信メッセージをセットする。また、HCA521によるメッセージ受信処理が完了すると、完了を示すエントリがCQ524に格納される。アプリケーション523は、受信関数「recv」の発行後にCQ524のポーリングを行うことで、受信要求に応じた処理の完了を示すエントリをCQ524から取得する。アプリケーション523は、取得したエントリに含まれるアドレスが示す受信バッファから、受信メッセージを取得する。
このように、InfiniBandを通じて通信する場合、アプリケーションは、メッセージの送信または受信を要求した後、CQをポーリングすることで、要求した処理が完了したことを検知する。
図5は、複数スレッド同士での通信処理の比較例を示す図である。なお、これ以後、「QP/CQ」とは、送信用のQPと、これに対応するCQと、受信用のQPと、これに対応するCQとを含むものとする。ただし、CQは、送信用のQPと受信用のQPとで共用することも可能である。
ここでは、あるノードで実行される特定のスレッドと、それとは異なるノードで実行される特定のスレッドとの間で通信が行われる場合を想定する。この場合には、一方のノードの1つのスレッドと他方のノードの1つのスレッドとの間で、論定的な通信路であるコネクションを確立し、コネクションごとに個別のQP/CQを割り当てる方法が最も単純な方法である。なぜなら、この方法によれば、各スレッドは、送信や受信を要求した後、割り当てられたCQをポーリングするだけで、自分宛てのエントリを容易に取得できるからである。
例えば図5では、ノード510でスレッド515a〜515dが実行され、ノード520でスレッド525a〜525dが実行されている。そして、スレッド515aとスレッド525aとの間、スレッド515bとスレッド525bとの間、スレッド515cとスレッド525cとの間、スレッド515dとスレッド525dとの間で、それぞれ通信が行われる。
この場合、スレッド515aとスレッド525aとの間のコネクション531aにおいては、スレッド515aに対してQP/CQ516aが割り当てられ、スレッド525aに対してQP/CQ526aが割り当てられる。同様に、スレッド515bとスレッド525bとの間のコネクション531bにおいては、スレッド515bに対してQP/CQ516bが割り当てられ、スレッド525bに対してQP/CQ526bが割り当てられる。また、スレッド515cとスレッド525cとの間にコネクション531cにおいては、スレッド515cに対してQP/CQ516cが割り当てられ、スレッド525cに対してQP/CQ526cが割り当てられる。さらに、スレッド515dとスレッド525dとの間のコネクション531dにおいては、スレッド515dに対してQP/CQ516dが割り当てられ、スレッド525dに対してQP/CQ526dが割り当てられる。
このような構成とすることで、例えば、QP/CQ526aのCQには、スレッド525a宛てのエントリだけが格納される。そのため、スレッド525aは、メッセージの受信を要求した後、QP/CQ526aのCQを監視するだけで、受信要求に対応する完了のエントリを容易に取得できる。
しかしながら、このような構成では、スレッド間で確立されたコネクションの数が多くなった場合に次のような問題がある。
スレッド間で確立されたコネクション531a〜531dは、共通の物理的な通信経路上に存在する。そのため、確立されたコネクションの数が多いほど、スレッドが送信または受信を要求してから、その要求に対応する完了のエントリをCQから取得できるまでの遅延時間が長くなる可能性がある。
スレッド間で確立されたコネクション531a〜531dは、共通の物理的な通信経路上に存在する。そのため、確立されたコネクションの数が多いほど、スレッドが送信または受信を要求してから、その要求に対応する完了のエントリをCQから取得できるまでの遅延時間が長くなる可能性がある。
また、コネクション531a〜531dの間で通信頻度に偏りがある場合、通信頻度が高いスレッドに対応するCQには、上記の遅延時間が長くなったとしても、CQに対して時間当たりに格納されるエントリの数が多くなる。そのため、通信頻度が高いコネクション上のスレッドほど、CQに対してポーリングしたときに完了のエントリを取得できる確率が高まる。しかし、その一方で、通信頻度が低いコネクション上のスレッドほど、CQに対してポーリングしたときに完了のエントリを取得できる確率が低下する。このように通信頻度が低いコネクション上のスレッドは、無駄なポーリングを多く実行していることになり、CPUやメモリなどのリソースを浪費するという問題がある。
このような問題に対して、本実施の形態では、次の図6のようにQP/CQが配置される。
図6は、本実施の形態におけるQP/CQの配置を示す図である。本実施の形態では、1つのノードは、通信相手のノードごとにQP/CQをそれぞれ1つだけ有する。具体的には、図6に示すように、ノード100−1は、ノード100−2,100−3,100−4とそれぞれ通信するためのQP/CQ111a−1,111b−1,111c−1を有する。ノード100−2は、ノード100−1,100−3,100−4とそれぞれ通信するためのQP/CQ111a−2,111b−2,111c−2を有する。ノード100−3は、ノード100−1,100−2,100−4とそれぞれ通信するためのQP/CQ111a−3,111b−3,111c−3を有する。ノード100−4は、ノード100−1,100−2,100−3とそれぞれ通信するためのQP/CQ111a−4,111b−4,111c−4を有する。
図6は、本実施の形態におけるQP/CQの配置を示す図である。本実施の形態では、1つのノードは、通信相手のノードごとにQP/CQをそれぞれ1つだけ有する。具体的には、図6に示すように、ノード100−1は、ノード100−2,100−3,100−4とそれぞれ通信するためのQP/CQ111a−1,111b−1,111c−1を有する。ノード100−2は、ノード100−1,100−3,100−4とそれぞれ通信するためのQP/CQ111a−2,111b−2,111c−2を有する。ノード100−3は、ノード100−1,100−2,100−4とそれぞれ通信するためのQP/CQ111a−3,111b−3,111c−3を有する。ノード100−4は、ノード100−1,100−2,100−3とそれぞれ通信するためのQP/CQ111a−4,111b−4,111c−4を有する。
このように、本実施の形態では、1つのノード内で他の1つのノードとの通信で用いられるQP/CQが1つだけに限定される。そして、次の図7に示すように、1つのノードでは、他の1つのノードと通信する複数のスレッドが、1つのQP/CQを共用する。
図7は、複数スレッド同士の通信について説明するための図である。図7では、例として、ノード100−1とノード100−2との間の通信について説明する。また、ノード100−1でスレッド515a〜515dが実行され、ノード100−2でスレッド525a〜525dが実行されるものとする。そして、スレッド515aとスレッド525aとの間、スレッド515bとスレッド525bとの間、スレッド515cとスレッド525cとの間、スレッド515dとスレッド525dとの間で、それぞれ通信が行われるものとする。
ノード100−1は、ノード100−2との通信のためのQP/CQ111a−1を有する。そして、QP/CQ111a−1は、ノード100−2との通信の際にスレッド515a〜515dによって共用される。一方、ノード100−2は、ノード100−1との通信のためのQP/CQ111a−2を有する。そして、QP/CQ111a−2は、ノード100−1との通信の際にスレッド525a〜525dによって共用される。
ただし、この構成では、例えばスレッド525a〜525dからそれぞれ受信要求が発行された場合、QP/CQ111a−2のCQには、スレッド525a〜525dのそれぞれを宛先とする完了のエントリが混在する。このとき、スレッド525a〜525dは、QP/CQ111a−2のCQに格納されたエントリがどのスレッド宛てのものかを判別できない。
そこで、本実施の形態では、スレッド間で確立されたコネクションごとに、システム全体でユニークな識別番号である「XID」が付与される。そして、あるスレッドから他のノードのスレッド宛てにメッセージが送信される際に、それらのスレッド間のコネクションに対応するXIDが送信メッセージに付加される。これにより、受信側ノードのスレッドは、CQから取得したエントリに基づいて受信メッセージを取得したとき、受信メッセージに含まれるXIDから、エントリが自分宛てであるか否かを判別できるようになる。
XIDは、XIDの発行元ノードを示すノード番号と、発行のたびにシーケンシャルに変更される番号とを組み合わせて生成される。XIDが発行元ノード番号を含むことで、他のいずれのノードでも同じXIDが生成されないようにすることができる。なお、後述するように、XIDは、スレッド間のコネクションが確立される際に生成される。「発行元ノード」とは、コネクションの確立を持ちかけたノードを指す。
さらに、本実施の形態では、あるスレッドがポーリングによりCQからエントリを取得したとき、そのエントリが他のスレッド宛てであった場合には、その旨を他のスレッドに認識させることが可能となっている。例えば、スレッド525aがQP/CQ111a−2のCQをポーリングして、受信完了を示すエントリを取得したとき、そのエントリがスレッド525b宛てであった場合には、スレッド525aは、エントリに対応する受信メッセージをスレッド525bに受け渡す。スレッド525bは、その受信メッセージを用いて処理を継続することができる。
以上のように、本実施の形態では、1つのノード内で他の1つのノードとの通信で用いられるCQが1つだけに限定される。また、ノード上のスレッドは、ポーリングによりCQからエントリを取得したとき、そのエントリがどのスレッド宛てのものかをXIDから判別し、宛先のスレッドに対してそのエントリに対応する通信処理の完了を認識させる。
これにより、スレッド間で通信頻度に偏りがある場合でも、各スレッドがCQのポーリングを行ったときに、どのスレッド宛てのエントリも取得できないという確率が低くなる。その結果、無駄なポーリングの回数を減少させることができ、CPUやメモリなどのリソースの利用効率が向上する。また、ノードにおけるリソースの利用効率が向上することで、ホスト装置からのIO要求に対する応答速度を高めることもできる。
なお、QP/CQは、例えば、ストレージシステムの運用を開始した初期段階において、各ノードのメモリ領域に作成される。例えば、各ノードは、他のノードのHCA107のアドレスを指定することでそのHCA107のデバイス情報を取得し、デバイス情報を基に他のノードに対応するQP/CQを作成する。接続されたノード間でQP/CQの作成完了が認識されることで、ノード間の通信が可能になる。
<ノードの処理機能>
図8は、ノードが備える処理機能の構成例を示すブロック図である。ノード100は、記憶部110、アプリケーション120、スレッドスケジューラ131〜133およびHCAドライバ140を有する。
図8は、ノードが備える処理機能の構成例を示すブロック図である。ノード100は、記憶部110、アプリケーション120、スレッドスケジューラ131〜133およびHCAドライバ140を有する。
記憶部110は、例えば、メモリ102の記憶領域として実装される。記憶部110には、QP/CQ111a〜111c、XID−Qstr対応テーブル112、コネクションプール113、スレッド−関数対応テーブル114およびReadyキュー115a〜115cが記憶される。
QP/CQ111a〜111cは、他のノードとの通信で使用されるQP/CQである。前述のように、QP/CQ111a〜111cは、それぞれ個別のノードに対応付けられている。
XID−Qstr対応テーブル112は、XIDと待ち合わせ構造体(Q−Structure)との対応関係を保持する。XID−Qstr対応テーブル112には、ノード間のコネクションが確立されて新たなXIDが発行されるたびに、XIDと待ち合わせ構造体を示す情報とを含むレコードが追加登録される。なお、待ち合わせ構造体とは、後述するように、サスペンド状態のスレッドを管理するためのデータ構造体であり、1つのXIDに対して1つ生成される。
コネクションプール113は、未使用のコネクション構造体を保持する。コネクション構造体とは、後述するように、スレッド間のコネクションを介した通信のために使用されるデータ構造体であり、1つのXIDに対して1つ使用される。
スレッド−関数対応テーブル114は、スレッドの処理内容の種別と、その種別のスレッドで実行される関数との対応関係を保持する。
Readyキュー115a〜115cは、実行されるスレッドに対応するエントリを格納するキューである。Readyキュー115a,115b,115cは、それぞれスレッドスケジューラ131,132,133から参照される。
Readyキュー115a〜115cは、実行されるスレッドに対応するエントリを格納するキューである。Readyキュー115a,115b,115cは、それぞれスレッドスケジューラ131,132,133から参照される。
アプリケーション120の処理は、例えば、CPU101a〜101cによって所定のアプリケーションプログラムが実行されることで実現される。アプリケーション120は、例えば、ストレージのアクセス制御処理を実行する。アプリケーション120の処理は、複数のスレッドを含む。
スレッドスケジューラ131〜133およびHCAドライバ140の処理は、例えば、CPU101a〜101cによってOSプログラムが実行されることで実現される。
スレッドスケジューラ131は、Readyキュー115aに基づいて、アプリケーション120のスレッドのうち、CPU101aによって実行されるスレッド121a,121b,・・・の実行順を制御する。スレッドスケジューラ132は、Readyキュー115bに基づいて、アプリケーション120のスレッドのうち、CPU101bによって実行されるスレッド122a,122b,・・・の実行順を制御する。スレッドスケジューラ133は、Readyキュー115cに基づいて、アプリケーション120のスレッドのうち、CPU101cによって実行されるスレッド123a,123b,・・・の実行順を制御する。
スレッドスケジューラ131は、Readyキュー115aに基づいて、アプリケーション120のスレッドのうち、CPU101aによって実行されるスレッド121a,121b,・・・の実行順を制御する。スレッドスケジューラ132は、Readyキュー115bに基づいて、アプリケーション120のスレッドのうち、CPU101bによって実行されるスレッド122a,122b,・・・の実行順を制御する。スレッドスケジューラ133は、Readyキュー115cに基づいて、アプリケーション120のスレッドのうち、CPU101cによって実行されるスレッド123a,123b,・・・の実行順を制御する。
HCAドライバ140は、HCA107の動作を制御する。また、HCAドライバ140は、アプリケーション120に対して、HCA107を使用するためのAPI(Application Programming Interface)を提供する。
<CQのポーリングとスレッドスケジューリング>
次に、CQのポーリングとスレッドスケジューリングについて説明する。まず、図9、図10を用いて、スレッドスケジューリングの比較例について説明した後、図11を用いて、本実施の形態のスレッドスケジューリングについて説明する。
次に、CQのポーリングとスレッドスケジューリングについて説明する。まず、図9、図10を用いて、スレッドスケジューリングの比較例について説明した後、図11を用いて、本実施の形態のスレッドスケジューリングについて説明する。
図9は、スレッドスケジューリングの第1の比較例を示す図である。図9では例として、スレッドスケジューラ131によるスレッドのスケジューリングについて示す。スレッドスケジューラ131は、Readyキュー115aからエントリを順に取得し、取得したエントリに対応するスレッドの実行を開始させる。スレッドは、ある一定の長さを限度とする処理を実行すると、サスペンドして、制御をスレッドスケジューラ131に移す。
例えば、図9に示すように、スレッドスケジューラ131は、スレッド121aの実行を開始させる。スレッド121aは、処理A1を実行した後、サスペンドして、制御をスレッドスケジューラ131に移す。次に、スレッドスケジューラ131は、スレッド121bの実行を開始させる。スレッド121bは、処理B1を実行した後、サスペンドして、制御をスレッドスケジューラ131に移す。次に、スレッドスケジューラ131は、スレッド121cの実行を開始させる。スレッド121cは、処理C1を実行した後、サスペンドして、制御をスレッドスケジューラ131に移す。次に、スレッドスケジューラ131は、スレッド121aの実行を開始させる。スレッド121aは、処理A1の次の処理A2を実行する。
図10は、スレッドスケジューリングの第2の比較例を示す図である。この図10では、スレッド121a,121bが実行され、スレッド121aによってメッセージの受信処理が行われる場合の例を示す。
まず、スレッドスケジューラ131は、スレッド121aの実行を開始させる(タイミングT11)。スレッド121aは、HCAドライバ140に対して受信関数「recv」を発行する。これにより、受信メッセージに対応するエントリがQPに登録される。また、スレッド121aは、メッセージの受信待ち状態となり、CQに対してポーリングするための関数(ibv_poll_cq)を、受信要求に対応するエントリをCQから取得できるまでの間、一定時間ごとに発行する。しかし、所定回数だけ関数を発行しても対応するエントリを取得できなかった場合、スレッド121aは、一旦サスペンドして、制御をスレッドスケジューラ131に移す(タイミングT12)。
スレッドスケジューラ131は、スレッド121bの実行を開始させる(タイミングT13)。スレッド121bは、処理B1を実行した後、サスペンドして、制御をスレッドスケジューラ131に移す(タイミングT14)。スレッドスケジューラ131は、スレッド121aを起床させる(タイミングT15)。起床したスレッド121aは、ポーリングのための関数の発行を再度繰り返す。しかし、所定回数だけ関数を発行しても対応するエントリを取得できなかった場合、スレッド121aは、サスペンドして、制御をスレッドスケジューラ131に移す(タイミングT16)。
スレッドスケジューラ131は、スレッド121bの実行を開始させる(タイミングT17)。スレッド121bは、処理B1の次の処理B2を実行した後、サスペンドして、制御をスレッドスケジューラ131に移す(タイミングT18)。スレッドスケジューラ131は、スレッド121aを起床させる(タイミングT19)。起床したスレッド121aは、ポーリングのための関数の発行を再度繰り返す。しかし、所定回数だけ関数を発行しても対応するエントリを取得できなかった場合、スレッド121aは、サスペンドして、制御をスレッドスケジューラ131に移す(タイミングT20)。スレッドスケジューラ131は、スレッド121bの実行を開始させ(タイミングT21)、スレッド121bは、処理B2の次の処理B3を実行する。
以上の例のように、受信関数「recv」の発行後に長期間受信メッセージが到着しない場合、スレッド121aは、起床、ポーリング、サスペンドという動作を何度も繰り返すことになる。スレッド121aの起床やサスペンドが行われるたびに、コンテキストスイッチが発生する。コンテキストスイッチは、レジスタのデータ退避などの処理を伴うため、CPUの処理負荷が大きい。このため、上記のようにスレッド121aの起床やサスペンドが繰り返されると、CPUの処理負荷が増大して、実行可能な他のスレッド121bの処理が遅延してしまい、処理効率が低下するという問題がある。
このような問題に対して、本実施の形態では、スレッドだけでなく、スレッドスケジューラもCQのポーリングを実行可能にする。そして、スレッドは、受信関数「recv」の発行後、CQのポーリングを1回だけ実行し、自分宛てのメッセージが到着していない場合にはサスペンドする。このスレッドに対応するエントリを取得するためのポーリングは、それ以後、スレッドスケジューラ(または他のスレッド)によって実行される。
図11は、本実施の形態でのスレッドスケジューリングの例を示す図である。図11では、図10の比較例と同様に、スレッド121a,121bが実行され、スレッド121aによってメッセージの受信処理が行われる場合の例を示す。
まず、スレッドスケジューラ131は、スレッド121aの実行を開始させる(タイミングT31)。スレッド121aは、HCAドライバ140に対して受信関数「recv」を発行し、その後1回だけCQのポーリングを行う。このとき、対応するエントリを取得できなかった場合、スレッド121aは、即座にサスペンドして、制御をスレッドスケジューラ131に移す(タイミングT32)。
一方、スレッドスケジューラ131は、制御が移されるたびに、次に実行させるスレッドのスケジューリングとともに、CQのポーリングを行う。図11の例では、タイミングT32でスレッド121aから制御が移されると、スレッドスケジューラ131は、次に実行させるスレッドとしてスレッド121bを選択するとともに、CQのポーリングを行う。そして、それが終了すると、スレッドスケジューラ131はスレッド121bの実行を開始させる(タイミングT33)。
スレッド121bによる処理B1の実行が終了すると、制御がスレッドスケジューラ131に移り(タイミングT34)、スレッドスケジューラ131によるスケジューリングとポーリングとが行われる。スレッド121aに対応するエントリをCQから取得できない場合、スレッド121bが起床して後続の処理B2を実行する(タイミングT35)。
処理B2の実行が終了すると、制御がスレッドスケジューラ131に移り(タイミングT36)、スレッドスケジューラ131によるスケジューリングとポーリングとが行われる。ここでもスレッド121aに対応するエントリをCQから取得できない場合、スレッド121bが起床して後続の処理B3を実行する(タイミングT37)。
処理B3の実行が終了すると、制御がスレッドスケジューラ131に移り(タイミングT38)、スレッドスケジューラ131によるスケジューリングとポーリングとが行われる。ここで、スレッド121aに対応するエントリをCQから取得できた場合、スレッドスケジューラ131は、スレッド121aを起床させる(タイミングT39)。スレッド121aは、受信メッセージを取得して、後続の処理を再開する。
以上のように、スレッド121aは、受信関数「recv」の発行後、CQのポーリングを1回だけ実行し、対応するエントリを取得できなかった場合にはサスペンドする。このスレッドに対応するエントリを取得するためのポーリングは、それ以後、スレッドスケジューラ131によって実行される。そして、スレッドスケジューラ131によってスレッド121aに対応するエントリがCQから取得された場合、スレッド121aが起床する。
このような処理により、ポーリングに失敗したスレッド121aが起床とサスペンドを何度も繰り返すことが防止される。このため、無駄なコンテキストスイッチの発生回数が少なくなり、CPUの処理負荷が低下する。その結果、CPUの処理効率が向上し、実行可能なスレッド121bの実行遅延を小さくすることができる。
図12は、スレッドスケジューリングで使用されるデータ構造の例を示す図である。本実施の形態では、上記のようなスレッドスケジューリングを実現するための、コネクション構造体151および待ち合わせ構造体152が使用される。
コネクション構造体151は、スレッド間のコネクションが確立されるたびに、そのコネクションの両側のスレッドによってそれぞれ作成され、各スレッドが他方のスレッドとの通信を行うために使用される。コネクション構造体151は、自ノード側スレッド、他ノード側スレッドの各識別番号、XID、QP/CQへのポインタ、および待ち合わせ構造体へのポインタを保持する。
自ノード側スレッドは、コネクションの両側のノードのうち、自ノードのスレッドを示し、他ノード側スレッドは、他ノードのスレッドを示す。XIDは、前述のように、スレッド間のコネクションごとに生成される固有の番号である。QP/CQへのポインタは、通信相手のスレッドとの通信で用いられるQP/CQ111内のQPおよびCQの位置を示す。待ち合わせ構造体へのポインタは、対応する待ち合わせ構造体152の位置を示す。
待ち合わせ構造体152は、自ノード側のスレッドの状態を管理するために使用されるデータ構造体である。待ち合わせ構造体152は、Blockedキュー152aとメッセージ情報キュー152bとを保持する。Blockedキュー152aには、サスペンド状態のスレッドに対応するエントリが、Readyキュー115a〜115cから取り出されて格納される。メッセージ情報キュー152bには、受信メッセージを格納するためのバッファ領域を示すポインタを含むエントリが格納される。
図13は、キュー間のエントリ移動によるサスペンドおよび起床動作について説明するための図である。受信関数「recv」を発行したスレッドは、ポーリングに失敗すると、対応するエントリをReadyキュー115a〜115cのいずれかから取り出し、待ち合わせ構造体152のBlockedキュー152aに格納することで、サスペンド状態に遷移する。このとき、スレッドは、受信メッセージを格納するためのバッファ領域を示すポインタを含むエントリを、待ち合わせ構造体152のメッセージ情報キュー152bに登録する。このバッファ領域は、HCAドライバ140によって受信バッファに格納された受信メッセージを退避するためのメモリ領域である。
その後、スレッドスケジューラまたは他のスレッドによって、受信バッファに格納された受信メッセージがバッファ領域にセットされ、対応するエントリがBlockedキュー152aから取り出され、Readyキュー115a〜115cのいずれかに登録される。これにより、このエントリに対応するスレッドが起床する。
なお、スレッドが起床している状態とは、対応するエントリがReadyキュー1151a〜115cのいずれかに登録されており、そのスレッドが、スレッドスケジューラが次に実行させるスレッドを選択する際の選択対象に含まれている状態を指す。そして、そのエントリがReadyキュー115a〜115cのいずれかからスレッドスケジューラに取り出されることで、そのエントリに対応するスレッドの実行が開始される。
以下、図14、図15を用いて、スレッドの状態遷移の具体例について説明する。図14、図15では、例として、ノード100−1においてスレッド#0とスレッド#1が実行される場合について示す。
図14は、スレッドの状態遷移についての第1の例を示す図である。図14の初期状態では、スレッド#0と、他のノードのスレッド(ここでは、ノード100−2のスレッド#01とする)とのコネクションが確立されている。そして、このコネクションにXID「0」が付与され、XID−Qstr対応テーブル112において、XID「0」に対して待ち合わせ構造体Qstr#0が対応付けられている。また、スレッド#1と、ノード100−2の他のスレッド(スレッド#11とする)とのコネクションが確立されている。そして、このコネクションにXID「1」が付与され、XID−Qstr対応テーブル112において、XID「1」に対して待ち合わせ構造体Qstr#1が対応付けられている。
さらに、スレッド#0は、メッセージの受信を要求した後にサスペンド状態になっており、待ち合わせ構造体Qstr#0のBlockedキュー152aには、スレッド#0に対応するエントリが格納されている。また、待ち合わせ構造体Qstr#0のメッセージ情報キュー152bには、受信メッセージを格納するためのバッファ領域B0を示すポインタを含むエントリが登録されている。
なお、InfiniBandでは、メッセージの送信順序や受信順序は入れ替わらないことが保証されている。
上記状態から、スレッドスケジューラ131が、Readyキュー115aからスレッド#1に対応するエントリを取得し、スレッド#1の実行を開始させたとする(ステップS11)。スレッド#1は、受信関数「recv」をHCAドライバ140に発行して、メッセージの受信を要求する(ステップS12)。これにより、スレッド#1からの受信要求に対応するエントリがQP/CQ111aのQPに格納される。さらに、スレッド#1は、QP/CQ111aのCQに対するポーリングを行う(ステップS13)。
上記状態から、スレッドスケジューラ131が、Readyキュー115aからスレッド#1に対応するエントリを取得し、スレッド#1の実行を開始させたとする(ステップS11)。スレッド#1は、受信関数「recv」をHCAドライバ140に発行して、メッセージの受信を要求する(ステップS12)。これにより、スレッド#1からの受信要求に対応するエントリがQP/CQ111aのQPに格納される。さらに、スレッド#1は、QP/CQ111aのCQに対するポーリングを行う(ステップS13)。
スレッド#1は、CQからエントリE0を取得し、エントリE0が示す受信バッファR0から受信メッセージを取得する。ここで、仮に、取得した受信メッセージがXID「1」を含んでいれば、スレッド#1は、エントリが自分宛てであることを認識し、受信メッセージを用いて後続の処理を実行できる。
しかし、図14の例では、取得した受信メッセージがXID「0」を含んでいたとする。この場合、スレッド#0が受信を要求したメッセージがHCA107によって受信済みであり、その受信メッセージが受信バッファR0に格納されている。スレッド#1は、取得したエントリが自分宛てではないことを認識して、XID−Qstr対応テーブル112を参照し、XID「0」に対応する待ち合わせ構造体Qstr#0を特定する(ステップS14)。
スレッド#1は、待ち合わせ構造体Qstr#0のメッセージ情報キュー152bからエントリを取得し、取得したエントリが示すバッファ領域B0に、受信バッファR0に格納されている受信メッセージを書き込む(ステップS15)。さらに、スレッド#1は、待ち合わせ構造体Qstr#0のBlockedキュー152aからエントリを取り出して、このエントリをReadyキュー115aに移動させる(ステップS16)。これにより、スレッド#0が起床する。すなわち、移動されたエントリがスレッドスケジューラ131に取得されてスレッド#0の実行が開始されたとき、スレッド#0は、バッファ領域B0に書き込まれた受信メッセージを用いて処理を続行できる。
なお、バッファ領域B0は、受信バッファR0に格納された受信メッセージを退避するために用いられる。ステップS13のポーリングが完了することにより、取得されたエントリE0が示す受信バッファR0は解放されてしまう。しかし、受信バッファR0に格納されていた受信メッセージがバッファ領域B0に退避されることで、スレッド#0は、ポーリングの完了後にバッファ領域B0から受信メッセージを取得できるようになる。
スレッド#1は、以上の処理が完了すると、ステップS11でReadyキュー115aから取得されたエントリを、待ち合わせ構造体Qstr#1のBlockedキュー152aに移動させる(ステップS17)。さらに、スレッド#1は、待ち合わせ構造体Qstr#1のメッセージ情報キュー152bに、受信メッセージを格納するためのバッファ領域B1を示すポインタを含むエントリを格納する。これにより、スレッド#1はサスペンドする。
図15は、スレッドの状態遷移についての第2の例を示す図である。図14に示したようにスレッド#1がサスペンドした後に、スレッドスケジューラ131によるQP/CQ111aのCQのポーリングによって、エントリE1が取得される。そして、取得されたエントリE1が示す受信バッファR1から、XID「1」を含む受信メッセージが取得されたとする(ステップS21)。
スレッドスケジューラ131は、XID−Qstr対応テーブル112を参照し、XID「1」に対応する待ち合わせ構造体Qstr#1を特定する(ステップS22)。スレッドスケジューラ131は、待ち合わせ構造体Qstr#1のメッセージ情報キュー152bからエントリを取得し、取得したエントリが示すバッファ領域B1に、受信バッファR1に格納されている受信メッセージを書き込む(ステップS23)。さらに、スレッドスケジューラ131は、待ち合わせ構造体Qstr#1のBlockedキュー152aからエントリを取り出して、このエントリをReadyキュー115aに移動させる(ステップS24)。
これにより、スレッド#1が起床する。すなわち、移動されたエントリがスレッドスケジューラ131に取得されてスレッド#1の実行が開始されたとき、スレッド#1は、バッファ領域B1に書き込まれた受信メッセージを用いて処理を続行できる。
以上の図14、図15の例のように、本実施の形態では、CQのポーリングに1回失敗したスレッドは、それ以上ポーリングを行わずにサスペンドする。その後、スレッドスケジューラまたは他のスレッドによるCQのポーリングにより、サスペンドしたスレッドに対応するエントリがCQから取得されることで、サスペンドしたスレッドが起床する。
このような仕組みにより、ポーリングに失敗してサスペンドしたスレッドは、要求したメッセージが受信されるまで起床しない。そのため、ポーリングに失敗したスレッドがポーリングの再実行のために起床とサスペンドを何度も繰り返すことがなくなり、無駄なコンテキストスイッチの発生回数が減少する。その結果、CPUの処理効率を向上させることができる。
また、上記の仕組みにより、CQに格納されたあるスレッド宛てのエントリは、そのスレッドによるポーリングだけでなく、他のスレッドやスレッドスケジューラによるポーリングによっても取得される。そして、取得されたエントリに対応する受信メッセージを、宛先のスレッドが利用できるようになる。これにより、ポーリングを行ったときに、どのスレッド宛てのエントリも取得できないという確率が低くなる。その結果、無駄なポーリングの回数を減少させることができ、CPUやメモリなどのリソースの利用効率が向上する。
<フローチャート>
次に、ノード100の処理についてフローチャートを用いて説明する。
図16は、スレッド間のコネクション確立を要求する処理手順の例を示すフローチャートである。ここでは例として、ノード100−1のスレッド#11が、ノード100−2のスレッド#21との間でコネクションを確立するケースについて示す。
次に、ノード100の処理についてフローチャートを用いて説明する。
図16は、スレッド間のコネクション確立を要求する処理手順の例を示すフローチャートである。ここでは例として、ノード100−1のスレッド#11が、ノード100−2のスレッド#21との間でコネクションを確立するケースについて示す。
[ステップS51]スレッド#11は、コネクションプール113から未使用のコネクション構造体151を取得する。このとき、未使用の待ち合わせ構造体152も取得される。スレッド#11は、取得したコネクション構造体151に対して、自ノード側スレッドとしてスレッド#11を登録し、他ノード側スレッドとしてスレッド#21を登録する。また、スレッド#11は、取得したコネクション構造体151に対して、ノード100−2との通信に使用するQP/CQ111aに対するポインタと、取得した待ち合わせ構造体152に対するポインタとを登録する。
さらに、スレッド#11は、新たなXIDを発行して、取得したコネクション構造体151に登録する。XIDは、ノード100−1の番号と、直前に発行されたシーケンシャル番号に「1」を加算した値とを組み合わせることによって算出される。ここでは、説明を簡単にするためにXID「11」が発行されたとする。
[ステップS52]スレッド#11は、発行したXID「11」と、取得した待ち合わせ構造体152を示す情報とを含むレコードを、XID−Qstr対応テーブル112に新たに登録する。
[ステップS53]スレッド#11は、コネクション確立依頼フラグと、通信相手のスレッド#21の種別を示すスレッド種別番号tidと、XID「11」とを、送信バッファにセットする。コネクション確立依頼フラグは、コネクションの確立要求であることを示す「1」にセットされる。
[ステップS54]スレッド#11は、HCAドライバ140に対して送信関数「send」を発行する。このとき、スレッド#11は、引数として、コネクション構造体151へのポインタと、送信バッファのアドレスとをセットする。
これにより、QP/CQ111aのQPに、コネクション確立のための送信要求を示すエントリが登録される。HCAドライバ140は、このエントリを取得すると、送信バッファにセットされた情報をノード100−2に送信する。これにより、新たに発行されたXID「11」が相手のノード100−2に伝達される。
図17は、メッセージの送信を要求する処理手順の例を示すフローチャートである。ここでは例として、図16の処理によってスレッド#21とのコネクションが確立された後に、スレッド#11がスレッド#21に対してメッセージを送信するケースについて示す。
[ステップS61]スレッド#11は、自ノード側スレッドとしてスレッド#11が登録され、他ノード側スレッドとしてスレッド#21が登録されたコネクション構造体151を参照し、このコネクション構造体151からXID「11」を取得する。
[ステップS62]スレッド#11は、コネクション確立依頼フラグと、通信相手のスレッド#21の種別を示すスレッド種別番号tidと、XID「11」とが付加された送信メッセージを、送信バッファにセットする。コネクション確立依頼フラグは、コネクションの確立要求でないことを示す「0」にセットされる。
[ステップS63]スレッド#11は、HCAドライバ140に対して送信関数「send」を発行する。このとき、スレッド#11は、引数として、コネクション構造体151へのポインタと、送信バッファのアドレスとをセットする。
これにより、QP/CQ111aのQPに、メッセージの送信要求を示すエントリが登録される。HCAドライバ140は、このエントリを取得すると、送信バッファにセットされた送信メッセージをノード100−2に送信する。これにより、送信メッセージとともにXID「11」が相手のノード100−2に伝達される。
図18〜図20は、メッセージの受信を要求する処理手順の例を示すフローチャートである。ここでは例として、ノード100−2のスレッド#22が、ノード100−1のスレッド#12から送信されるメッセージを受信するケースについて示す。なお、スレッド#12とスレッド#22との間のコネクションは確立済みであり、このコネクションに対してXID「12」が付与されているものとする。
[ステップS71]スレッド#22は、自ノード側スレッドとしてスレッド#22が登録され、他ノード側スレッドとしてスレッド#12が登録されたコネクション構造体151を参照し、このコネクション構造体151からXID「12」を取得する。
[ステップS72]スレッド#22は、HCAドライバ140に対して受信関数「recv」を発行する。このとき、スレッド#22は、引数として、ステップS71で参照したコネクション構造体151へのポインタと、受信バッファのアドレスとをセットする。
これにより、QP/CQ111aのQPに、メッセージの受信要求を示すエントリが登録される。HCAドライバ140は、このエントリを取得すると、ノード100−2からメッセージを受信して受信バッファにセットする。そして、HCAドライバ140は、QP/CQ111aのCQに、受信完了を示すエントリを登録する。ただし、次のステップS73の実行時点では、このエントリがCQに登録されているとは限らない。
[ステップS73]スレッド#22は、HCAドライバ140に対して、ノード100−1との通信用のCQ、すなわち、QP/CQ111aのCQにポーリングするための関数を発行する。これにより、CQのポーリングが行われる。
[ステップS74]スレッド#22は、ポーリングの結果として、受信完了を示すエントリをCQから取得できたかを判定する。スレッド#22は、該当エントリを取得できた場合、図19のステップS81の処理を実行し、取得できなかった場合、ステップS75の処理を実行する。
なお、ステップS74で取得されるエントリは、ステップS72による受信要求に対応する受信完了を示すとは限らない。
また、ステップS74では、送信完了を示すエントリが取得される場合もある。この場合、スレッド#22は、送信要求を行ったスレッドを起床させた後、ステップS75の処理を実行する。
また、ステップS74では、送信完了を示すエントリが取得される場合もある。この場合、スレッド#22は、送信要求を行ったスレッドを起床させた後、ステップS75の処理を実行する。
[ステップS75]スレッド#22は、Readyキューからスレッドスケジューラによって取得された、スレッド#22に対応するエントリを、待ち合わせ構造体152のBlockedキュー152aに移動させる。移動先の待ち合わせ構造体152は、ステップS71で参照されたコネクション構造体151に登録されたポインタによって示される待ち合わせ構造体152である。
また、スレッド#22は、この待ち合わせ構造体152のメッセージ情報キュー152bに、受信メッセージを格納するためのバッファ領域を示すポインタを含むエントリを格納する。以上のステップS75の処理により、スレッド#22はサスペンド状態に遷移する。
以下、図19を用いて説明を続ける。
[ステップS81]スレッド#22は、HCAドライバ140によって受信されたメッセージが格納されている受信バッファから、ステップS74で取得されたエントリに対応する受信メッセージを取得する。スレッド#22は、受信メッセージから、コネクション確立依頼フラグと、スレッド種別番号tidと、XIDとを取得する。
[ステップS81]スレッド#22は、HCAドライバ140によって受信されたメッセージが格納されている受信バッファから、ステップS74で取得されたエントリに対応する受信メッセージを取得する。スレッド#22は、受信メッセージから、コネクション確立依頼フラグと、スレッド種別番号tidと、XIDとを取得する。
[ステップS82]スレッド#22は、コネクション確立依頼フラグが「1」の場合、ステップS83の処理を実行し、「0」の場合、図20のステップS91の処理を実行する。
[ステップS83]コネクション確立依頼フラグが「1」の場合、スレッド間のコネクションを新たに確立することが要求されている。ここでは例として、図16の処理によってスレッド#11とスレッド#21との間のコネクションの確立が要求されたものとして説明する。この場合、受信メッセージにはXID「11」が含まれている。
スレッド#22は、まず、待ち合わせ構造体152を新たに作成する。
[ステップS84]スレッド#22は、受信メッセージから取得したXID「11」と、ステップS83で作成した待ち合わせ構造体152を示すポインタとを含むレコードを、XID−Qstr対応テーブル112に対して新たに登録する。
[ステップS84]スレッド#22は、受信メッセージから取得したXID「11」と、ステップS83で作成した待ち合わせ構造体152を示すポインタとを含むレコードを、XID−Qstr対応テーブル112に対して新たに登録する。
[ステップS85]スレッド#22は、スレッド−関数対応テーブル114を参照し、受信メッセージから取得したスレッド種別番号tidに対応付けられたスレッド#21を特定する。スレッド#22は、特定されたスレッド#21を起動する。この後、スレッド#22は、図18のステップS75の処理を実行して、サスペンド状態に遷移する。
[ステップS86]ステップS85で起動したスレッド#21は、コネクションプール113から未使用のコネクション構造体151を取得する。スレッド#21は、取得したコネクション構造体151に対して、自ノード側スレッドとしてスレッド#21を登録し、他ノード側スレッドとしてスレッド#11を登録する。また、スレッド#21は、取得したコネクション構造体151に対して、ステップS81で受信メッセージから取得したXIDを登録する。さらに、スレッド#21は、ノード100−1との通信に使用するQP/CQ111aに対するポインタと、ステップS83で作成された待ち合わせ構造体152に対するポインタとを登録する。これにより、スレッド#11とスレッド#21とのコネクションが確立される。
なお、この後、起動したスレッド#21は、スレッドスケジューラの制御の下で後続の処理を実行する。
以下、図20を用いて説明を続ける。
以下、図20を用いて説明を続ける。
[ステップS91]図19のステップS82でコネクション確立依頼フラグが「0」の場合、CQから取得されたエントリは受信完了を示すエントリである。スレッド#22は、受信メッセージから取得したXIDが、図18のステップS71で取得したXID「12」と一致するかを判定する。XIDが一致した場合、CQから取得されたエントリはスレッド#22宛てのエントリである。この場合、スレッド#22は、ステップS92の処理を実行する。一方、XIDが一致しない場合、CQから取得されたエントリはスレッド#22以外の他のスレッド宛てのエントリである。この場合、スレッド#22は、ステップS93の処理を実行する。
[ステップS92]スレッド#22は、取得した受信メッセージを用いて後続の処理を実行する。
[ステップS93]スレッド#22は、XID−Qstr対応テーブル112を参照し、受信メッセージから取得したXIDに対応する待ち合わせ構造体152を特定する。
[ステップS93]スレッド#22は、XID−Qstr対応テーブル112を参照し、受信メッセージから取得したXIDに対応する待ち合わせ構造体152を特定する。
[ステップS94]スレッド#22は、特定された待ち合わせ構造体152のメッセージ情報キュー152bからエントリを取得し、取得したエントリが示すバッファ領域に受信メッセージを書き込む。さらに、スレッド#22は、この待ち合わせ構造体152のBlockedキュー152aからエントリを取り出して、このエントリをReadyキューに移動させる。CQから取得されたエントリが、例えばスレッド#23宛てであったとすると、ステップS94の処理により、スレッド#23が起床する。
スレッド#22は、この後、図18のステップS75の処理を実行して、サスペンド状態に遷移する。
図21、図22は、スレッドスケジューラの処理手順の例を示すフローチャートである。ここでは例として、ノード100−2のスレッドスケジューラ131の処理について示す。なお、図21、図22の処理は、繰り返し実行される。
図21、図22は、スレッドスケジューラの処理手順の例を示すフローチャートである。ここでは例として、ノード100−2のスレッドスケジューラ131の処理について示す。なお、図21、図22の処理は、繰り返し実行される。
[ステップS101]スレッドスケジューラ131は、ノード100−2のCQの中にポーリングしていないCQがあるかを判定する。スレッドスケジューラ131は、ポーリングしていないCQがある場合、ステップS102の処理を実行し、すべてのCQについてポーリング済みである場合、ステップS104の処理を実行する。
[ステップS102]スレッドスケジューラ131は、ポーリングしていないCQに対してポーリングを行う。
[ステップS103]スレッドスケジューラ131は、ポーリングの結果として、受信完了を示すエントリをCQから取得できたかを判定する。スレッドスケジューラ131は、該当エントリを取得できた場合、図22のステップS111の処理を実行し、取得できなかった場合、ステップS101の処理を実行する。
[ステップS103]スレッドスケジューラ131は、ポーリングの結果として、受信完了を示すエントリをCQから取得できたかを判定する。スレッドスケジューラ131は、該当エントリを取得できた場合、図22のステップS111の処理を実行し、取得できなかった場合、ステップS101の処理を実行する。
[ステップS104]スレッドスケジューラ131は、Readyキュー115aから先頭のエントリを取得し、そのエントリに対応するスレッドの実行を開始させる。
以下、図22を用いて説明を続ける。
以下、図22を用いて説明を続ける。
[ステップS111]スレッドスケジューラ131は、HCAドライバ140によって受信されたメッセージが格納されている受信バッファから、図21のステップS103で取得されたエントリに対応する受信メッセージを取得する。スレッドスケジューラ131は、受信メッセージから、コネクション確立依頼フラグと、スレッド種別番号tidと、XIDとを取得する。
[ステップS112]スレッドスケジューラ131は、コネクション確立依頼フラグが「1」の場合、ステップS113の処理を実行し、「0」の場合、ステップS116の処理を実行する。
[ステップS113]コネクション確立依頼フラグが「1」の場合、スレッド間のコネクションを新たに確立することが要求されている。ここでは例として、図16の処理によってスレッド#11とスレッド#21との間のコネクションの確立が要求されたものとして説明する。この場合、受信メッセージにはXID「11」が含まれている。
スレッドスケジューラ131は、まず、待ち合わせ構造体152を新たに作成する。
[ステップS114]スレッドスケジューラ131は、受信メッセージから取得したXID「11」と、ステップS113で作成した待ち合わせ構造体152を示すポインタとを含むレコードを、XID−Qstr対応テーブル112に対して新たに登録する。
[ステップS114]スレッドスケジューラ131は、受信メッセージから取得したXID「11」と、ステップS113で作成した待ち合わせ構造体152を示すポインタとを含むレコードを、XID−Qstr対応テーブル112に対して新たに登録する。
[ステップS115]スレッドスケジューラ131は、スレッド−関数対応テーブル114を参照し、受信メッセージから取得したスレッド種別番号tidに対応付けられたスレッド#21を特定する。スレッドスケジューラ131は、特定されたスレッド#21を起動する。この後、スレッドスケジューラ131は、図21のステップS101の処理を実行する。
[ステップS116]スレッドスケジューラ131は、XID−Qstr対応テーブル112を参照し、受信メッセージから取得したXIDに対応する待ち合わせ構造体152を特定する。
[ステップS117]スレッドスケジューラ131は、特定された待ち合わせ構造体152のメッセージ情報キュー152bからエントリを取得し、取得したエントリが示すバッファ領域に受信メッセージを書き込む。さらに、スレッドスケジューラ131は、この待ち合わせ構造体152のBlockedキュー152aからエントリを取り出して、このエントリをReadyキューに移動させる。CQから取得されたエントリが、例えばスレッド#23宛てであったとすると、ステップS117の処理により、スレッド#23が起床する。
この後、スレッドスケジューラ131は、図21のステップS101の処理を実行する。
<スレッドの具体例>
次に、スレッドの具体的な処理例について説明する。
<スレッドの具体例>
次に、スレッドの具体的な処理例について説明する。
図23は、スレッドの処理例を示す図である。図23の例では、ノード100−1のスレッド#15と、ノード100−2のスレッド#25との間でコネクションが確立されているものとする。スレッド#15は、ホスト装置からの書き込み要求を受け付けるスレッドであり、スレッド#25は、書き込みデータの格納を担当する「担当ノード」において、他のノードから転送された書き込みデータを受け付けるスレッドである。
[ステップS121]スレッド#15は、ホスト装置から、書き込み要求および書き込みデータを受信する。
[ステップS122]スレッド#15は、書き込みアドレスを解析して、ノード100−2を担当ノードと判別する。
[ステップS122]スレッド#15は、書き込みアドレスを解析して、ノード100−2を担当ノードと判別する。
[ステップS123]スレッド#15は、担当ノードであるノード100−2に対して書き込みデータを送信する。
[ステップS124]スレッド#25は、書き込みデータを受信する。
[ステップS124]スレッド#25は、書き込みデータを受信する。
[ステップS125]スレッド#25は、受信した書き込みデータをキャッシュに書き込む。
[ステップS126]スレッド#25は、書き込みの完了通知をノード100−1に送信する。
[ステップS126]スレッド#25は、書き込みの完了通知をノード100−1に送信する。
[ステップS127]スレッド#15は、完了通知を受信し、ホスト装置に対して書き込みが完了したことを通知する。
[ステップS128]スレッド#15は、次の書き込みデータの受信待ち状態になる。
[ステップS128]スレッド#15は、次の書き込みデータの受信待ち状態になる。
以上の処理において、スレッド#25は、例えば、ステップS124で書き込みデータを受信するために受信関数「recv」を発行し、続いてCQをポーリングする。スレッド#25は、ポーリングにより自分宛てのエントリを取得できなかった場合、サスペンドして受信待ち状態となる。その後、スレッド#15とスレッド#25とのコネクションに対応するXIDが付加された書き込みデータが受信されると、ノード100−2上の他のスレッドまたはスレッドスケジューラによるポーリングによって、CQからスレッド#25宛てのエントリが取得される。すると、スレッド#25は起床し、受信された書き込みデータを取得して、ステップS125からの後続処理の実行を開始する。
このような処理により、スレッド#25は、ポーリングによる書き込みデータの取得に失敗するとサスペンドし、書き込みデータの受信が完了するまで起床しない。このため、スレッド#25のサスペンドおよび起床の回数が低減されて、コンテキストスイッチの発生が抑制され、その結果、ノード100−2のCPUの利用効率が向上される。
一方、スレッド#15は、例えば、ステップS123の書き込みデータ送信が完了した後、ステップS127で完了通知を受信するために受信関数「recv」を発行し、続いてCQをポーリングする。スレッド#15は、ポーリングにより自分宛てのエントリを取得できなかった場合、サスペンドして受信待ち状態となる。その後、スレッド#15とスレッド#25とのコネクションに対応するXIDが付加された完了通知が受信されると、ノード100−1上の他のスレッドまたはスレッドスケジューラによるポーリングによって、CQからスレッド#15宛てのエントリが取得される。すると、スレッド#15は起床し、受信された完了通知を取得して、ステップS128からの後続処理の実行を開始する。
このような処理により、スレッド#15は、ポーリングによる完了通知の取得に失敗するとサスペンドし、完了通知の受信が完了するまで起床しない。このため、スレッド#15のサスペンドおよび起床の回数が低減されて、コンテキストスイッチの発生が抑制され、その結果、ノード100−1のCPUの利用効率が向上される。
なお、上記の各実施の形態に示した装置(例えば、情報処理装置1,2、ノード100,100−1〜100−4)の処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供され、そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置(HDD)、フレキシブルディスク(FD)、磁気テープなどがある。光ディスクには、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc-Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。光磁気記録媒体には、MO(Magneto-Optical disk)などがある。
プログラムを流通させる場合には、例えば、そのプログラムが記録されたDVD、CD−ROMなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムまたはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムにしたがった処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムにしたがった処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムにしたがった処理を実行することもできる。
1,2 情報処理装置
1a 通信インタフェース
1b 制御部
1c キュー
1d バッファ
10 データ
11〜13 スレッド
S1,S2,S2a,S2b ステップ
1a 通信インタフェース
1b 制御部
1c キュー
1d バッファ
10 データ
11〜13 スレッド
S1,S2,S2a,S2b ステップ
1つの案では、情報処理装置が提供される。この情報処理装置は、他の情報処理装置と通信するための通信インタフェースと、次のような処理を実行する制御部とを有する。制御部は、複数のスレッドのうち一のスレッドの実行により、他の情報処理装置からのデータの受信要求を通信インタフェースに発行した後であって、複数のスレッドのうちサスペンド状態でないスレッドの中から次に実行させるスレッドを選択する選択処理が実行されるよりも前に、受信要求に対応する受信データを受信したことを示す完了通知がキューに格納されたかを確認し、完了通知が格納されていない場合には、一のスレッドをサスペンド状態に遷移させる第1の処理を実行する。また、制御部は、選択処理と、選択処理によって選択されたスレッドについてキューを確認する確認処理とを実行する第2の処理を実行する。ここで、制御部は、確認処理によってキューに一のスレッドに対応する完了通知が格納されたことを検知した場合、受信データを一のスレッドに受け渡して一のスレッドをサスペンド状態から復帰させる。
Claims (7)
- 他の情報処理装置と通信するための通信インタフェースと、
複数のスレッドのうち一のスレッドの実行により、前記他の情報処理装置からのデータの受信要求を前記通信インタフェースに発行した後、前記受信要求に対応する受信データを受信したことを示す完了通知がキューに格納されたかを確認し、前記完了通知が格納されていない場合には、前記一のスレッドをサスペンド状態に遷移させる第1の処理と、
前記複数のスレッドのうちサスペンド状態でないスレッドの中から次に実行させるスレッドを選択する選択処理と、前記キューを確認する確認処理とを交互に実行する第2の処理であって、前記確認処理によって前記キューに前記完了通知が格納されたことを検知した場合、前記受信データを前記一のスレッドに受け渡して前記一のスレッドをサスペンド状態から復帰させる、前記第2の処理と、
を実行する制御部と、
を有する情報処理装置。 - 前記複数のスレッドをそれぞれ識別する第1の識別子を記憶する記憶部をさらに有し、
前記他の情報処理装置から送信されるデータには、前記複数のスレッドのうち宛先のスレッドを示す第2の識別子が付加されており、
前記第1の処理では、前記キューを確認したとき、前記複数のスレッドのうち他のスレッドの実行によって受信が要求された他の受信データの受信が完了したことを示す他の完了通知が格納されていることを検知した場合、前記他の受信データに付加された前記第2の識別子を取得し、前記記憶部を参照して、取得した前記第2の識別子に対応する前記他のスレッドを特定し、前記他のスレッドに対して前記他の受信データを受け渡して前記他のスレッドをサスペンド状態から復帰させ、その後に前記一のスレッドをサスペンド状態に遷移させる、
請求項1記載の情報処理装置。 - 前記確認処理では、前記キューに前記完了通知が格納されたことを検知したとき、前記受信データに付加された前記第2の識別子を取得し、取得した前記第2の識別子と、前記記憶部に記憶された前記第1の識別子との比較結果に基づいて、前記受信データの受け渡し先を前記一のスレッドと判定する、
請求項2記載の情報処理装置。 - 前記確認処理では、前記キューを確認したとき、前記他の完了通知が格納されていることを検知した場合、前記他の受信データに付加された前記第2の識別子を取得し、前記記憶部を参照して、取得した前記第2の識別子に対応する前記他のスレッドを特定し、前記他のスレッドに対して前記他の受信データを受け渡して前記他のスレッドをサスペンド状態から復帰させる、
請求項2または3記載の情報処理装置。 - 記憶部をさらに有し、
前記第1の処理では、前記一のスレッドによって参照される記憶領域を示す領域情報を前記記憶部に登録した後、前記一のスレッドをサスペンド状態に遷移させ、
前記第2の処理では、前記領域情報に基づいて前記記憶領域を特定し、前記受信データを前記記憶領域に格納することによって前記受信データを前記一のスレッドに受け渡す、
請求項1記載の情報処理装置。 - コンピュータが、
複数のスレッドのうち一のスレッドの実行により、他のコンピュータからのデータの受信要求を前記コンピュータが備える通信インタフェースに発行した後、前記受信要求に対応する受信データを受信したことを示す完了通知がキューに格納されたかを確認し、前記完了通知が格納されていない場合には、前記一のスレッドをサスペンド状態に遷移させる第1の処理と、
前記複数のスレッドのうちサスペンド状態でないスレッドの中から次に実行させるスレッドを選択する選択処理と、前記キューを確認する確認処理とを交互に実行する第2の処理であって、前記確認処理によって前記キューに前記完了通知が格納されたことを検知した場合、前記受信データを前記一のスレッドに受け渡して前記一のスレッドをサスペンド状態から復帰させる、前記第2の処理と、
を実行する情報処理方法。 - コンピュータに、
複数のスレッドのうち一のスレッドの実行により、他のコンピュータからのデータの受信要求を前記コンピュータが備える通信インタフェースに発行した後、前記受信要求に対応する受信データを受信したことを示す完了通知がキューに格納されたかを確認し、前記完了通知が格納されていない場合には、前記一のスレッドをサスペンド状態に遷移させる第1の処理と、
前記複数のスレッドのうちサスペンド状態でないスレッドの中から次に実行させるスレッドを選択する選択処理と、前記キューを確認する確認処理とを交互に実行する第2の処理であって、前記確認処理によって前記キューに前記完了通知が格納されたことを検知した場合、前記受信データを前記一のスレッドに受け渡して前記一のスレッドをサスペンド状態から復帰させる、前記第2の処理と、
を実行させる情報処理プログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017082661A JP6390748B1 (ja) | 2017-04-19 | 2017-04-19 | 情報処理装置、情報処理方法および情報処理プログラム |
US15/954,960 US10581748B2 (en) | 2017-04-19 | 2018-04-17 | Information processing apparatus, information processing method, and non-transitory computer-readable storage medium |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017082661A JP6390748B1 (ja) | 2017-04-19 | 2017-04-19 | 情報処理装置、情報処理方法および情報処理プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP6390748B1 JP6390748B1 (ja) | 2018-09-19 |
JP2018181134A true JP2018181134A (ja) | 2018-11-15 |
Family
ID=63580017
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2017082661A Active JP6390748B1 (ja) | 2017-04-19 | 2017-04-19 | 情報処理装置、情報処理方法および情報処理プログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US10581748B2 (ja) |
JP (1) | JP6390748B1 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10659376B2 (en) * | 2017-05-18 | 2020-05-19 | International Business Machines Corporation | Throttling backbone computing regarding completion operations |
US11232010B2 (en) * | 2020-01-20 | 2022-01-25 | EMC IP Holding Company LLC | Performance monitoring for storage system with core thread comprising internal and external schedulers |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2012226471A (ja) * | 2011-04-18 | 2012-11-15 | Hitachi Ltd | 通信方法および通信サーバ |
US20130139156A1 (en) * | 2011-11-30 | 2013-05-30 | Michael Tsirkin | Application-driven shared device queue polling in a virtualized computing environment |
JP2013214168A (ja) * | 2012-03-30 | 2013-10-17 | Fujitsu Ltd | 情報処理装置、演算装置および情報転送方法 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7248585B2 (en) * | 2001-10-22 | 2007-07-24 | Sun Microsystems, Inc. | Method and apparatus for a packet classifier |
US7325497B2 (en) * | 2001-11-27 | 2008-02-05 | Elishah Ben-Ezra | Automated airport luggage system |
US6721806B2 (en) | 2002-09-05 | 2004-04-13 | International Business Machines Corporation | Remote direct memory access enabled network interface controller switchover and switchback support |
US7703103B2 (en) * | 2002-12-02 | 2010-04-20 | Borland Software Corporation | Serving concurrent TCP/IP connections of multiple virtual internet users with a single thread |
US20040246956A1 (en) * | 2003-06-06 | 2004-12-09 | Meng David Qiang | Parallel packet receiving, routing and forwarding |
JP4327008B2 (ja) * | 2004-04-21 | 2009-09-09 | 富士通株式会社 | 演算処理装置及び演算処理装置の制御方法 |
JP4520788B2 (ja) * | 2004-07-29 | 2010-08-11 | 富士通株式会社 | マルチスレッドプロセッサ |
US7694312B2 (en) * | 2004-09-10 | 2010-04-06 | Pleora Technologies Inc. | Methods and apparatus for enabling bus connectivity over a data network |
US20100281483A1 (en) * | 2009-04-30 | 2010-11-04 | Novafora, Inc. | Programmable scheduling co-processor |
JP4970560B2 (ja) * | 2010-01-23 | 2012-07-11 | レノボ・シンガポール・プライベート・リミテッド | 特定の機能を維持しながら消費電力を低減するコンピュータ |
US9513975B2 (en) * | 2012-05-02 | 2016-12-06 | Nvidia Corporation | Technique for computational nested parallelism |
US11257271B2 (en) * | 2013-09-26 | 2022-02-22 | Imagination Technologies Limited | Atomic memory update unit and methods |
DE112014002275T5 (de) * | 2014-01-22 | 2016-01-28 | Hitachi, Ltd. | Datenbankverwaltungssystem und -verfahren |
JP2015216450A (ja) | 2014-05-08 | 2015-12-03 | 富士通株式会社 | 情報処理装置、情報処理システム及び中継プログラム |
US10572261B2 (en) * | 2016-01-06 | 2020-02-25 | Nxp Usa, Inc. | Providing task-triggered deterministic operational mode for simultaneous multi-threaded superscalar processor |
JP6855906B2 (ja) * | 2017-04-25 | 2021-04-07 | 富士通株式会社 | スイッチプログラム、スイッチング方法及び情報処理装置 |
-
2017
- 2017-04-19 JP JP2017082661A patent/JP6390748B1/ja active Active
-
2018
- 2018-04-17 US US15/954,960 patent/US10581748B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2012226471A (ja) * | 2011-04-18 | 2012-11-15 | Hitachi Ltd | 通信方法および通信サーバ |
US20130139156A1 (en) * | 2011-11-30 | 2013-05-30 | Michael Tsirkin | Application-driven shared device queue polling in a virtualized computing environment |
JP2013214168A (ja) * | 2012-03-30 | 2013-10-17 | Fujitsu Ltd | 情報処理装置、演算装置および情報転送方法 |
Also Published As
Publication number | Publication date |
---|---|
JP6390748B1 (ja) | 2018-09-19 |
US20180309687A1 (en) | 2018-10-25 |
US10581748B2 (en) | 2020-03-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8149854B2 (en) | Multi-threaded transmit transport engine for storage devices | |
US8984222B2 (en) | Methods and structure for task management in storage controllers of a clustered storage system | |
US7093043B2 (en) | Data array having redundancy messaging between array controllers over the host bus | |
US7676616B2 (en) | Method, apparatus and program storage device for providing asynchronous status messaging in a data storage system | |
KR20190040886A (ko) | 브리지 장치를 이용한 스토리지 인접 연산 제공 시스템 및 방법 | |
EP2633417B1 (en) | Dynamically enabling and disabling write xfr_rdy | |
US20110320706A1 (en) | Storage apparatus and method for controlling the same | |
JP2008015888A (ja) | 負荷分散制御システム及び負荷分散制御方法 | |
US20070006020A1 (en) | Inter-host data transfer method, program, and system | |
US7640549B2 (en) | System and method for efficiently exchanging data among processes | |
US10013367B2 (en) | I/O processing system including dynamic missing interrupt and input/output detection | |
JP6414269B1 (ja) | 情報処理装置、情報処理方法および情報処理プログラム | |
US8275903B1 (en) | Concurrent transmit processing | |
JP6390748B1 (ja) | 情報処理装置、情報処理方法および情報処理プログラム | |
US7159010B2 (en) | Network abstraction of input/output devices | |
WO2016135919A1 (ja) | ストレージ装置 | |
US11442959B2 (en) | System and method of time-based snapshot synchronization | |
US7089457B2 (en) | Efficient I/O retry over QDIO | |
US20100100676A1 (en) | Systems And Methods Of Presenting Virtual Tape Products To A Client | |
US10530870B2 (en) | Direct volume migration in a storage area network | |
US9329794B1 (en) | System and methods for data migration | |
JPH11327793A (ja) | 記憶制御装置 | |
US20130132621A1 (en) | Method and apparatus to share hardware resources across storage controllers within a system using resource sharing module |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20180710 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20180724 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20180806 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6390748 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |