以下、図面を参照しながら、実施形態を詳細に説明する。
図1は、SMPを利用した共有メモリシステムの構成例を示している。図1の共有メモリシステム100は、ノード101−1〜ノード101−M(Mは2以上の整数)のM個のノードと、クロスバスイッチ102とを含む。各ノード101−i(i=1〜M)は、クロスバスイッチ102を介して互いに接続されている。各ノード101−iは、ビルディングブロックと呼ばれることもある。以下では、各ノード101−iを、単にノード101と記すことがある。
各ノード101は、1つ以上のメモリ111、1つ以上の中央処理装置(CPU)112、及びクロスバチップ(LXB)113を含む。各CPU112は、外部インタフェース(IF)121を含み、外部IF121によって同じノード101内の他のCPU112と接続されている。また、各CPU112は、LXB113及びクロスバスイッチ102を介して、他のノード101内のCPU112と接続されている。
また、各CPU112は、メモリ111とも接続されている。各メモリ111は、同じノード101内のCPU112のみが使用できるローカル領域と、他のノード101内のCPU112も使用できる共有領域とを含む。
各CPU112から各メモリ111へのアクセスは、キャッシュコヒーレンシを保持しながら処理される。このとき、CPU112内のパイプラインによって、アクセスの順序制御が行われ、タイムアウト等のエラー応答で終了する場合であっても、CPU112の処理監視時間内にアクセスの処理が完了する。この処理監視時間としては、例えば、1秒程度以内の時間が用いられる。
しかし、異常ノード101へのアクセスがタイムアウトし、同じ異常ノード101へのアクセスが複数回連続して発生すると、処理が完了するまでに1秒近くかかることがあり得る。この場合、CPU112の処理監視時間内に処理が完了せず、アクセス元のノード101自体が異常ノードになることがある。
このように、あるノード101が故障によりダウンした際に、その影響を受けて、直接的に故障と関係のない他のノード101もダウンすることを防止するために、先願である特願2015−141842号に記載された共有メモリシステムが提案されている。
先願の共有メモリシステムでは、故障ノードを示す故障ノードリスト(FNL:Fail Node List)がCPU112内に設けられる。CPU112は、他のノード101内のメモリ111の共有領域にアクセスするリクエストを発行する際に、FNLを参照して故障ノードに対する新規のリクエストの発行を抑止し、タイムアウトを待つことなく、直ちにエラーとして処理する。また、FNLに故障ノードが登録されたことを示す割り込み通知をソフトウェアへ出力することで、故障ノードの判定及び切り離しが可能になる。
以下では、共有メモリシステム100におけるノード101の故障を「ノード故障」と記し、クロスバスイッチ102、又はクロスバスイッチ102とノード101との間のケーブルの故障を「経路故障」と記すことがある。
FNLは故障ノードを示す故障情報であるため、ノード故障が発生したノードをFNLに登録することが望ましい。しかし、経路故障が発生した経路を通過するパケットが喪失した場合に、そのパケットの宛先ノードをFNLに登録することは適切ではない。そこで、パケット送信中に経路故障の発生を通知するFATALパケットを受信した場合、FNLに故障ノードを登録する動作が抑止される。
図2は、経路故障が発生した場合に故障ノードの登録を抑止する抑止動作の例を示している。ノード間の経路は冗長化されており、例えば、パケットの送信元ノード101と宛先ノード101との間には、経路#0及び経路#1の2本の経路が存在する。図2の抑止動作は、以下の手順で実行される。
(1)ノード101のCPU112のホームエージェント(HA)回路は、他のノード101内のメモリ111にアクセスするリクエストを発行し、発行したリクエストに対するタイマを起動する。
(2)クロスバスイッチ102は、経路#0の異常を検出した場合、FATALパケットFATAL−XXX#0を経路#0へ出力する。
(3)CPU112の外部IF121は、FATAL−XXX#0を受信する。
(4)外部IF121は、FATAL−XXX#0に対応する経路#0を縮退候補に設定する。
(5)外部IF121は、異常検出通知をHA回路へ出力する。
(6)HA回路は、異常検出通知に基づいて、縮退実行を待ち合わせる期間をカウントするドレインタイマを起動する。
(7)HA回路は、異常検出通知に基づいてFNL設定抑止信号を生成する。
(8)HA回路は、FNL設定抑止信号に基づいて、処理が完了していないリクエストに対する設定抑止情報を生成する。
(9)外部IF121は、手順(1)で発行されたリクエストのパケットを、経路#0を介して宛先ノード101へ送信する。
(10)経路#0の経路故障のため、送信されたパケットが喪失する。
(11)HA回路は、ドレインタイマが所定時間のカウントを完了すると、縮退実行を指示するGO信号を外部IF121へ出力する。
(12)外部IF121は、GO信号に基づいて、経路#0を縮退候補から縮退対象に変更し、経路#0の縮退を実行する。
(13)発行したリクエストに対するタイマがタイムアウトする。
(14)HA回路は、タイムアウトしたリクエストに対する設定抑止情報に基づいて、宛先ノード101をFNLに設定する動作を抑止し、その設定抑止情報を消去する。
このような抑止動作によれば、経路故障が検出された場合は、リクエストがタイムアウトしても故障ノードの登録が抑止される。したがって、正常な宛先ノード101を故障ノードとしてFNLに登録し、そのノード101に対するリクエストの発行を抑止することが防止される。
しかし、経路故障ではなく、ノード故障が発生している場合、図2の抑止動作によって、1回目のタイムアウト発生したときにFNLに故障ノードが登録されず、2回目以降のタイムアウトが発生したときに故障ノードが登録される。例えば、ノード間に冗長化されたK本(Kは2以上の整数)の経路が存在する場合、K回目のタイムアウトが発生したときにFNLに故障ノードを登録してもよい。
図3は、ノード間に2本の経路が存在し、ノード故障が発生した場合に、2回目のタイムアウトで故障ノードを登録する登録動作の例を示している。図3の登録動作は、以下の手順で実行される。
(21)ノード101のCPU112のHA回路は、他のノード101内のメモリ111にアクセスするリクエストを発行し、発行したリクエストに対するタイマを起動する。
(22)クロスバスイッチ102は、経路#0の異常を検出した場合、FATALパケットFATAL−XXX#0を経路#0へ出力する。
(23)CPU112の外部IF121は、FATAL−XXX#0を受信する。
(24)外部IF121は、FATAL−XXX#0に対応する経路#0を縮退候補に設定する。
(25)外部IF121は、異常検出通知をHA回路へ出力する。
(26)HA回路は、異常検出通知に基づいてドレインタイマを起動する。
(27)HA回路は、異常検出通知に基づいてFNL設定抑止信号を生成する。
(28)HA回路は、FNL設定抑止信号に基づいて、処理が完了していないリクエストに対する設定抑止情報を生成する。
(29)外部IF121は、手順(21)で発行されたリクエストのパケットを、経路#0又は経路#1を介して宛先ノード101へ送信する。
(30)宛先ノード101のノード故障のため、送信されたパケットが喪失する。
(31)クロスバスイッチ102は、経路#1の異常を検出した場合、FATALパケットFATAL−XXX#1を経路#1へ出力する。
(32)CPU112の外部IF121は、FATAL−XXX#1を受信する。
(33)外部IF121は、FATAL−XXX#1に対応する経路#1を縮退候補に設定する。
(34)外部IF121は、異常検出通知をHA回路へ出力する。このとき、ドレインタイマが既に起動されているため、異常検出通知は無視される。
(35)HA回路は、ドレインタイマが所定時間のカウントを完了すると、縮退実行を指示するGO信号を外部IF121へ出力する。
(36)外部IF121は、GO信号に基づいて、設定されている縮退候補をチェックする。この場合、経路#0及び経路#1の両方が縮退候補に設定されているため、外部IF121は、経路の縮退を実行しない。
(37)発行したリクエストに対するタイマがタイムアウトする。
(38)HA回路は、タイムアウトしたリクエストに対する設定抑止情報に基づいて、宛先ノード101をFNLに設定する動作を抑止し、その設定抑止情報を消去する。
(39)HA回路は、手順(21)で発行されたリクエストと同じノード101内のメモリ111にアクセスするリクエストを発行し、発行したリクエストに対するタイマを起動する。
(40)外部IF121は、手順(39)で発行されたリクエストのパケットを、経路#0又は経路#1を介して宛先ノード101へ送信する。
(41)宛先ノード101のノード故障のため、送信されたパケットが喪失する。
(42)発行したリクエストに対するタイマがタイムアウトする。
(43)HA回路は、同じ宛先ノード101に対して2回目のタイムアウトが発生したため、その宛先ノード101を故障ノードとしてFNLに設定する。
この場合、手順(21)から手順(43)までの期間301において、FNLに故障ノードが登録されないため、パケットが喪失し続けることになる。同じ宛先ノード101のパケットしか送信されない場合、ワーストケースでは、期間301がリクエストに対するタイマのカウント時間の2倍になる。このように、経路故障によるFNLの設定を抑止するために、結果としてノード故障が発生したときのFNLの設定が遅延し、共有メモリシステムの性能低下を招く。
図4は、ノード間におけるデータのコヒーレンシ制御に伴って発生する、タイマ積算の例を示している。ローカルノードLN、ホームノードHN、及びリモートノードRNは、図1のノード101−1〜ノード101−Mのいずれかに対応する。
ローカルノードLNのCPU112は、例えば、リモートノードRN内のメモリ111に格納されたデータを要求するリクエストパケット401を、ホームノードHNのCPU112へ送信する。そして、ホームノードHNのCPU112は、そのデータを要求するリクエストパケット402を、リモートノードRNのCPU112へ送信する。
リモートノードRNのCPU112から応答パケットが送信されない場合、ホームノードHNのCPU112内のFNLに故障ノードが登録されるまでに、ホームノードHNのタイマのカウント時間T3の2倍の時間が積算される。このため、ローカルノードLNのCPU112のタイマのカウント時間T2は、T3の2倍に設定され、ローカルノードLNのCPU112内のFNLに故障ノードが登録されるまでに、T2の2倍の時間が積算される。したがって、ローカルノードLNのCPU112における処理監視時間T1は、T2の2倍に設定され、T3の4倍に相当する。
このように、コヒーレンシ制御に伴ってタイマ積算が発生するため、各CPU112における処理監視時間が長くなる。
また、図3の登録動作では、故障ノードに対するリクエストのタイムアウトを待ってFNLにその故障ノードを登録しているため、故障ノードに対するリクエストが発行されなければ、その故障ノードがFNLに登録されることはない。
図5は、ノード故障の例を示している。ノード101−(i+1)のノード故障が発生し、ノード101−1のCPU112がノード101−(i+1)に対して発行したリクエストのタイムアウトが2回発生した場合を想定する。この場合、ノード101−1のFNL501には、ノード101−(i+1)が故障ノードとして登録される。しかし、このままでは、ノード101−2、ノード101−(i+2)等の他のノード101のFNL501には、ノード101−(i+1)が登録されない。
このように、CPU112毎にFNLが設けられているため、特定のノード101が故障ノード101を検出したとしても、故障ノード101の情報が他のノード101のFNLには反映されない。このため、他のノード101において同じ故障ノードに対するリクエストが発行され、2回目のタイムアウトが発生するまで、他のノード101のFNLへの登録が待たされることになる。さらに、他のノード101において同じ故障ノード101に対するリクエストが発行されなければ、その故障ノード101は他のノード101のFNLには登録されない。
そこで、共有メモリシステム100から故障ノード101を切り離して、正常なノード101のみで共有メモリシステム100を運用するために、ソフトウェアによってFNLの故障情報を共有することが考えられる。しかし、ソフトウェアによるFNL同期処理には時間がかかるため、ノード故障の発生からエラー回復までの時間が長くなる。
図6は、実施形態の情報処理装置の構成例を示している。図6の情報処理装置601は、ノード611−1〜ノード611−M(Mは2以上の整数)のM個のノードを含み、各ノードは、演算処理装置621及びメモリ622を含む。演算処理装置621は、リクエスト生成回路631(リクエスト生成部)、リクエスト発行回路632(リクエスト発行部)、記憶回路633(記憶部)、制御回路634(制御部)、及び抑止回路635(抑止部)を含む。
リクエスト生成回路631は、他のノードに含まれるメモリ622に対するリクエストを生成し、リクエスト発行回路632は、他のノードに対して生成されたリクエストを発行する。記憶回路633は、故障情報を記憶し、制御回路634は、所定の契機で他のノードに対して応答要求を送信し、所定時間内に他のノードから応答を受信しない場合、他のノードの故障を示す情報を故障情報として記憶回路633に記憶させる。抑止回路635は、故障情報が他のノードの故障を示す場合、リクエスト発行回路632によるリクエストの発行を抑止する。
図7は、図6の情報処理装置601の制御方法の例を示すフローチャートである。まず、各ノードに含まれる演算処理装置621は、所定の契機で他のノードに対して応答要求を送信する(ステップ701)。そして、所定時間内に他のノードから応答を受信しない場合、演算処理装置621は、他のノードの故障を示す情報を、記憶回路633が記憶する故障情報に設定する(ステップ702)。
次に、演算処理装置621は、他のノードに含まれるメモリ622に対するリクエストを生成する(ステップ703)。そして、故障情報が他のノードの故障を示す場合、演算処理装置621は、他のノードに対するリクエストの発行を抑止する(ステップ704)。
図6の情報処理装置601によれば、複数のノードを有する情報処理装置において、他のノードの故障によるノードダウンを防止することができる。
図8は、図6の情報処理装置601の具体例を示している。図8の情報処理装置601は、ノード611−1〜ノード101−Mとクロスバスイッチ801とを含む。各ノード611−iは、クロスバスイッチ801を介して互いに接続されている。各ノード611−iは、ビルディングブロックと呼ばれることもある。以下では、各ノード611−iを、単にノード611と記すことがある。
各ノード611は、1つ以上のメモリ811、1つ以上のCPU812、及びLXB813を含む。各メモリ811は、図6のメモリ622に対応し、各CPU812は、図6の演算処理装置621に対応する。各CPU812は、プロセッサコア821、HA回路822、及び外部IF823を含む。
プロセッサコア821は、プログラムを実行することで様々な情報処理を行う。プロセッサコア821は、図6のリクエスト生成回路631に対応する。HA回路822は、プロセッサコア821が生成するリクエストの発行を制御する。
外部IF823は、制御回路634及びルータ回路831を含み、LXB813及びクロスバスイッチ801を介して、他のノード611と接続されている。ルータ回路831は、HA回路822が発行するリクエストをLXB813へ出力するとともに、HA回路822からの指示に基づいて経路の縮退を実行する。制御回路634は、所定の契機で他のノード611に対して応答要求を送信し、所定時間内に他のノード611から応答を受信しない場合、他のノード611の故障を示す故障検出信号を、HA回路822へ出力する。
また、各CPU812は、メモリ811と接続されている。各メモリ811は、同じノード611内のCPU812のみが使用できるローカル領域と、他のノード611内のCPU812も使用できる共有領域とを含む。ノード611間には、冗長化されたK本の経路が存在する。
図9は、図8のHA回路822の構成例を示している。図9のHA回路822は、リクエスト発行回路632、抑止回路635、パイプ回路901、及び設定回路902を含む。
プロセッサコア821は、リクエストを生成して抑止回路635へ出力するとともに、リクエストのアクセス対象である宛先ノード611の識別情報を含む宛先情報を、パイプ回路901へ出力する。そして、プロセッサコア821は、CPU812の処理監視時間をカウントする監視タイマを起動して、リクエストに対する処理を監視する。
パイプ回路901は、記憶回路633を含み、記憶回路633は、ノードマップ911及びFNL912を記憶する。ノードマップ911は、情報処理装置601内で動作しているノード及びCPU812の識別情報を含む。
FNL912は、故障ノードを示す故障情報を含む。故障情報は、例えば、ノードマップ911に含まれる各ノードが故障しているか否かを示すフラグであってもよい。この場合、FNL912はノード毎のフラグを含み、故障ノードのフラグは論理“1”に設定され、正常なノードのフラグは論理“0”に設定される。
パイプ回路901は、ノードマップ911を参照し、プロセッサコア821から入力された宛先情報が示す宛先ノード611の識別情報が、ノードマップ911に含まれているか否かをチェックする。宛先ノード611の識別情報がノードマップ911に含まれていない場合、パイプ回路901は、リクエストの発行を抑止する抑止信号を抑止回路635へ出力する。
一方、宛先ノード611の識別情報がノードマップ911に含まれている場合、パイプ回路901は、FNL912を参照し、宛先ノード611のフラグをチェックする。宛先ノード611のフラグが論理“1”である場合、パイプ回路901は、抑止信号を抑止回路635へ出力する。
抑止回路635は、パイプ回路901から抑止信号が入力されない場合、プロセッサコア821から入力されたリクエストを、リクエスト発行回路632へ出力する。一方、パイプ回路901から抑止信号が入力された場合、リクエストをリクエスト発行回路632へ出力しない。抑止回路635は、例えば、抑止信号とリクエストの論理積を出力するAND回路であってもよい。
リクエスト発行回路632は、抑止回路635から入力されるリクエストを保持するバッファを含み、バッファに保持されたリクエストをルータ回路831へ出力する。
設定回路902は、制御回路634から故障検出信号が入力された場合、FNL912のフラグのうち、故障検出信号が示す故障ノード611に対応するフラグを論理“1”に設定する。これにより、故障ノード611に対するリクエストの発行が抑止され、故障ノード611からの応答を待つリクエストの増加が抑制される。したがって、CPU812の動作がスローダウンして正常なノード611が異常ノードに変化し、そのノード611がダウンすることを防止できる。
なお、故障ノード611の切り離し等のエラー回復処理が完了した場合、故障ノード611のフラグが論理“1”から論理“0”に変更される。
また、設定回路902は、制御回路634から故障検出信号が入力された場合、故障ノード611の識別情報を含む割り込み通知をプロセッサコア821へ出力し、プロセッサコア821は、監視タイマをリセットする。したがって、監視タイマのタイムアウトにより正常なノード611が異常ノードに変化し、そのノード611がダウンすることを防止できる。
図10は、図8の制御回路634及びルータ回路831の構成例を示している。図10の制御回路634は、OR回路1001、AND回路1002、指示回路1003、AND回路1004、振分回路1005、レジスタ1006、及び応答監視回路1007を含む。
例えば、ノード611間に経路#0及び経路#1の2本の経路が存在する場合、ルータ回路831は、経路#0に接続されたポート1011と、経路#1に接続されたポート1012とを含む。
制御回路634は、信号R1〜信号R4のいずれかが論理“1”になったことを契機として、ノード故障が発生しているか否かを判定するための探索パケットを、ルータ回路831へ発行する。探索パケットは、他のノード611に対する応答要求に対応する。信号R1〜信号R4は、例えば、以下のような契機に論理“1”になる。
R1:ノード故障又は経路故障の発生を通知する故障通知(FATALパケット)を受信した場合
R2:制御回路634が属するノード611内において、タイムアウト、キャッシュプロトコルエラー等の異常を検知した場合
R3:他のノード611から探索パケットを受信した場合
R4:プロセッサコア821が実行するプログラムが探索パケットの発行を指示した場合
例えば、信号R1及び信号R3は、ルータ回路831から制御回路634へ出力され、信号R2及び信号R4は、HA回路822から制御回路634へ出力される。信号R1を契機として用いることで、他のノード611又は経路上で異常が検出された場合に探索パケットを発行することができ、信号R2を契機として用いることで、自ノード611内で異常が検出された場合に探索パケットを発行することができる。
信号R3を契機として用いることで、他のノード611が探索パケットを発行した場合に探索パケットを発行することができる。信号R4を契機として用いることで、ソフトウェアの指示によって探索パケットを発行することができ、情報処理装置601内の接続を確認するpingとして探索パケットを使用することが可能になる。
レジスタ1006は、探索パケットを発行したか否かを示す発行済みフラグを保持する。探索パケットが発行されると、発行済みフラグに論理“1”が設定される。OR回路1001は、信号R1〜信号R4の論理和をAND回路1002へ出力する。
AND回路1002は、OR回路1001が出力する論理和と、レジスタ1006が保持する発行済みフラグを反転した値との論理積を出力する。したがって、発行済みフラグが論理“0”である場合は、OR回路1001の出力が指示回路1003へ転送され、発行済みフラグが論理“1”である場合は、OR回路1001の出力が無視される。
指示回路1003は、ノードマップ911に含まれる各ノード611を宛先ノードとする探索パケットの発行指示を出力する。AND回路1004は、指示回路1003が出力する発行指示と、探索パケットの宛先ノード611に対応するFNL912のフラグを反転した値との論理積を出力する。したがって、宛先ノード611のフラグが論理“0”である場合は、その宛先ノード611に対する発行指示が振分回路1005へ転送され、そのフラグが論理“1”である場合は、その宛先ノード611に対する発行指示が無視される。
振分回路1005は、AND回路1004が出力する発行指示に基づいて、探索パケットをポート1011又はポート1012へ出力する。応答監視回路1007は、探索パケットの宛先ノード611毎に、応答したか否かを示す応答フラグを保持し、それぞれの宛先ノード611の応答フラグに、未応答を示す論理“0”を設定する。そして、応答監視回路1007は、所定の応答監視時間をカウントするタイマを起動する。このとき、レジスタ1006の発行済みフラグに論理“1”が設定される。
ポート1011又はポート1012は、探索パケットを宛先ノード611へ送信し、探索パケットに対する応答パケットを宛先ノード611から受信して、応答監視回路1007へ転送する。
応答監視回路1007は、応答監視時間内に応答した宛先ノード611の応答フラグを論理“1”に変更し、応答監視時間が経過したとき、論理“0”の応答フラグを有する宛先ノード611を抽出する。そして、応答監視回路1007は、抽出した宛先ノード611から応答パケットを受信しなかったと判定し、その宛先ノード611の識別情報を含む故障検出信号を設定回路902へ出力するとともに、レジスタ1006の発行済みフラグを論理“0”に変更する。
応答監視時間として、リクエストに対するタイマのカウント時間よりも短い時間を設定することで、図3の登録動作よりも短時間で故障ノードを検出することができる。
図11は、図8の情報処理装置601における探索パケットの例を示している。ノード611−1は、信号R1〜信号R4のいずれかを契機として、経路1101に沿って、ノード611−2〜ノード611−Mに探索パケットを発行する。
このとき、ノード611−2は、経路1102に沿って、ノード611−1へ応答パケットを送信し、ノード611−iは、経路1103に沿って、ノード611−1へ応答パケットを送信する。また、ノード611−(i+1)は、経路1104に沿って、ノード611−1へ応答パケットを送信し、ノード611−Mは、経路1105に沿って、ノード611−1へ応答パケットを送信する。
しかし、ノード611−(i+2)は、故障しているため、応答監視時間内に探索パケットに対する応答パケットを送信しない。そこで、ノード611−1は、FNL912のフラグのうち、ノード611−(i+2)に対応するフラグを論理“1”に設定し、ノード611−(i+2)に対するリクエストの発行を抑止する。
図10の制御回路634によれば、コヒーレンシ制御以外の所定の契機で探索パケットを発行することで、リクエストに対するタイマのタイムアウトを待つことなく、迅速に故障ノードをFNL912に登録することが可能になる。また、ハードウェアによって自律的に探索パケットを発行するため、故障ノードに対するリクエストが発行されなくても、故障ノードをFNL912に登録することが可能になる。
さらに、ハードウェアによって迅速に検出した故障ノードをプロセッサコア821に通知するため、アプリケーションプログラムは、クラスタソフトウェアによる死活監視よりも高速に故障ノードを特定することができ、ダウンタイムの短縮に寄与する。
図12は、探索パケットを用いてノード故障と経路故障とを判別する方法の例を示している。ノード#x、ノード#y、及びノード#zは、ノード611−1〜ノード611−Mのいずれかに対応し、ノード間には、冗長化された経路#0(W#0)及び経路#1(W#1)の2本の経路が存在する。
GXB1201〜GXB1206は、クロスバスイッチ801内のスイッチ回路であり、GXB1201〜GXB1203は経路#1に属し、GXB1204〜GXB1206は経路#0に属する。LXB1211、LXB1212、及びCPU1221はノード#xに含まれ、LXB1213、LXB1214、及びCPU1222はノード#yに含まれ、LXB1215、LXB1216、及びCPU1223はノード#zに含まれる。
例えば、ノード#xのCPU1221は、ノード#zに対する探索パケット1231を経路#0上に発行するとともに、同じノード#zに対する探索パケット1232を経路#1上に発行する。
図12(a)に示すように、CPU1223が故障しており、いずれの経路からも応答パケットを受信しない場合、CPU1221は、ノード故障が発生していると判定し、ノード#zをFNL912に登録する。
一方、図12(b)に示すように、LXB1215が故障しており、経路#0から応答パケットを受信しないが、経路#1から応答パケット1241を受信した場合、CPU1221は、経路#0の経路故障が発生していると判定する。この場合、CPU1221は、ノード#zをFNL912に登録しない。
このように、同じ宛先ノードに対する探索パケットを経路#0及び経路#1の両方に発行することで、ノード故障と経路故障とを判別することができる。なお、図12では、ノード#zに対する探索パケットのみが示されているが、同様にして、ノード#yに対する探索パケットも発行される。
図13は、信号R3を契機として探索パケットを発行することによる、探索パケットの増殖の例を示している。まず、図13(a)に示すように、ノード#xのCPU1221は、レジスタ1006の発行済みフラグが論理“0”に設定されているため、ノード#yに対する探索パケット1301と、ノード#zに対する探索パケット1302とを、経路#0上に発行する。そして、CPU1221は、発行済みフラグを論理“1”に変更する。
ノード#yのCPU1222は、探索パケット1301を受信して、応答パケットをCPU1221へ送信するが、ノード#zのCPU1223は故障しているため、応答パケットを送信しない。
次に、図13(b)に示すように、CPU1222は、レジスタ1006の発行済みフラグが論理“0”に設定されているため、ノード#xに対する探索パケット1303と、ノード#zに対する探索パケット1304とを、経路#0上に発行する。そして、CPU1222は、発行済みフラグを論理“1”に変更する。
CPU1221は、探索パケット1303を受信して、応答パケットをCPU1222へ送信するが、CPU1223は、応答パケットを送信しない。この場合、CPU1221は、発行済みフラグが論理“1”に設定されているため、新たな探索パケットを発行しない。
このような動作をすべてのノード611が行うことで、正常なノード611から故障ノード611に対するリクエストが発行されなくても、故障ノード611を検出することが可能になる。このとき、各CPU内に発行済みフラグを設けることで、探索パケットを重複して発行することが抑止され、情報処理装置601内における探索パケットの無限増殖が防止される。なお、図13では、経路#0上の探索パケットのみが示されているが、同様にして、経路#1上にも探索パケットが発行される。
図14は、FATALパケットを受信した場合に故障ノードをFNL912に登録する登録動作の例を示している。図14の登録動作は、以下の手順で実行される。
(51)ノード611のCPU812は、他のノード611内のメモリ811にアクセスするリクエストを発行する。
(52)クロスバスイッチ801は、経路#0の異常を検出した場合、FATALパケットFATAL−XXX#0を経路#0へ出力する。
(53)CPU812の外部IF823は、FATAL−XXX#0を受信する。
(54)外部IF823のルータ回路831は、信号R3を論理“1”に設定し、制御回路634は、探索パケットを他のノード611へ発行する。
(55)ルータ回路831は、手順(51)で発行されたリクエストのパケットを、経路#0又は経路#1を介して宛先ノード611へ送信する。
(56)宛先ノード611のノード故障のため、送信されたパケットが喪失する。
(57)ルータ回路831は、応答監視時間が経過しても、手順(54)で宛先ノード611に対して発行された探索パケットに対する応答パケットを、宛先ノード611から受信しない。
(58)制御回路634は、応答パケットを送信しなかった宛先ノード611を、故障ノードとしてFNL912に設定する。
この場合、FNL912に故障ノードが登録されない期間は、手順(51)から手順(58)までの期間1401である。応答監視時間として、リクエストに対するタイマのカウント時間よりも短い時間を設定することで、期間1401を短縮することができる。
図15は、先願の共有メモリシステムにおいてノード故障が発生した場合のエラー回復シーケンスの例を示している。ノード101−1〜ノード101−4は、図1の共有メモリシステム100におけるノード101に対応し、ノード101−1は、マスタノードとして動作する。
ノード101−1〜ノード101−4は、システム制御部(SCF)1501を含み、ノード101−2〜ノード101−4のCPU112上では、ソフトウェア1502が動作する。ソフトウェア1502は、例えば、ハイパーバイザ、オペレーティングシステム、ユーザアプリケーション等を含む。
SCF1501は、CPU112内のFNL501と同じ故障情報を含むFNLを保持し、各ノード101のFNL501を同期させる同期制御を行う。SCF1501は、例えば、Field-Programmable Gate Array(FPGA)であってもよく、CPU及びメモリの組み合わせであってもよい。
例えば、ノード101−2のCPU112において、ノード故障1511が発生した場合を想定する。この場合、CPU112は、ノード101−3及びノード101−4に対して、ノード故障の発生を通知するFATALパケット1512及びFATALパケット1513をそれぞれ送信する。
FATALパケット1512を受信したノード101−3のCPU112は、ソフトウェア1502に対して割り込み1516を発生させ、ユーザアプリケーションは、期間1542において処理を停止する。同様に、FATALパケット1513を受信したノード101−4のCPU112は、ソフトウェア1502に対して割り込み1517を発生させ、ユーザアプリケーションは、期間1544において処理を停止する。
しかし、ノード101−3及びノード101−4からノード101−2に対するリクエストが発行されないため、ノード101−3及びノード101−4のFNL501には、ノード101−2が故障ノードとして設定されない。そこで、ノード101−2のCPU112は、SCF1501へ同期開始要求1514を出力し、SCF1501は、ノード101−1へFNL更新要求1515を送信する。ノード101−2のCPU112は、同期開始要求1514を出力した後、期間1541において動作を停止する。
FNL更新要求1515を受信したノード101−1のSCF1501は、FNL生成処理1531を行って、ノード101−2を故障ノードとして設定したFNLをSCF1501内で生成し、FNL生成通知をCPU112へ送信する。そして、CPU112は、ノード101−2を故障ノードとして、CPU112内のFNL501に設定する。
次に、SCF1501は、ノード101−2〜ノード101−4に対して、FNL更新指示1518〜FNL更新指示1520をそれぞれ送信する。
FNL更新指示1519を受信したノード101−3のSCF1501は、FNL更新処理1532を行って、ノード101−2を故障ノードとして、SCF1501内のFNLに設定する。そして、SCF1501は、CPU112に対してFNL更新通知1521を送信する。
次に、CPU112は、ノード101−2を故障ノードとして、CPU112内のFNL501に設定するとともに、ソフトウェア1502に対してFNL更新通知1522を転送する。そして、ソフトウェア1502は、期間1543においてエラー回復処理を行う。
同様に、FNL更新指示1520を受信したノード101−4のSCF1501は、FNL更新処理1533を行って、ノード101−2を故障ノードとして、SCF1501内のFNLに設定する。そして、SCF1501は、CPU112に対してFNL更新通知1523を送信する。
次に、CPU112は、ノード101−2を故障ノードとして、CPU112内のFNL501に設定するとともに、ソフトウェア1502に対してFNL更新通知1524を転送する。そして、ソフトウェア1502は、期間1545においてエラー回復処理を行う。
このように、ノード101−3及びノード101−4のFNL501に故障ノード101−2を登録するために、ノード101−1のSCF1501経由でFNL501の同期制御が行われる。
図16は、図8の情報処理装置601においてノード故障が発生した場合のエラー回復シーケンスの例を示している。ノード611−1〜ノード611−4は、図8の情報処理装置601におけるノード611に対応し、ノード611−1は、マスタノードとして動作する。
ノード611−1〜ノード611−4は、SCF1601を含み、ノード611−2〜ノード611−4のCPU812上では、ソフトウェア1602が動作する。ソフトウェア1602は、例えば、ハイパーバイザ、オペレーティングシステム、ユーザアプリケーション等を含む。SCF1601は、CPU812内のFNL912と同じ故障情報を含むFNLを保持する。
例えば、ノード611−2のCPU812において、ノード故障1611が発生した場合、CPU812は、ノード611−3及びノード611−4に対して、FATALパケット1612及びFATALパケット1613をそれぞれ送信する。
FATALパケット1612を受信したノード611−3のCPU812は、ノード611−2及びノード611−4に対して、探索パケット1616及び探索パケット1617をそれぞれ送信する。そして、CPU812は、ソフトウェア1602に対して割り込み1620を発生させ、ユーザアプリケーションは、期間1642において処理を停止する。
同様に、FATALパケット1613を受信したノード611−4のCPU812は、ノード611−2及びノード611−3に対して、探索パケット1618及び探索パケット1619をそれぞれ送信する。そして、CPU812は、ソフトウェア1602に対して割り込み1621を発生させ、ユーザアプリケーションは、期間1644において処理を停止する。
ノード611−2のCPU812は、SCF1601へ同期開始要求1614を出力し、SCF1601は、ノード611−1へFNL更新要求1615を送信する。ノード611−2のCPU812は、同期開始要求1614を出力した後、期間1641において動作を停止する。
FNL更新要求1615を受信したノード611−1のSCF1601は、FNL生成処理1631を行って、ノード611−2を故障ノードとして設定したFNLをSCF1601内で生成し、FNL生成通知をCPU812に送信する。そして、CPU812は、ノード611−2を故障ノードとして、CPU812内のFNL912に設定する。
ノード611−3のCPU812は、応答監視時間内にノード611−4から応答パケットを受信し、ノード611−2から応答パケットを受信しない場合、ノード611−2を故障ノードとして、CPU812内のFNL912に設定する。そして、CPU812は、SCF1601に対してFNL更新通知1622を送信する。
SCF1601は、FNL更新処理1632を行って、ノード611−2を故障ノードとして、SCF1601内のFNLに設定する。次に、SCF1601は、CPU812に対してFNL更新通知1624を送信し、CPU812は、ソフトウェア1602に対してFNL更新通知1625を転送する。そして、ソフトウェア1602は、期間1643においてエラー回復処理を行う。
同様に、ノード611−4のCPU812は、応答監視時間内にノード611−3から応答パケットを受信し、ノード611−2から応答パケットを受信しない場合、ノード611−2を故障ノードとして、CPU812内のFNL912に設定する。そして、CPU812は、SCF1601に対してFNL更新通知1623を送信する。
SCF1601は、FNL更新処理1633を行って、ノード611−2を故障ノードとして、SCF1601内のFNLに設定する。次に、SCF1601は、CPU812に対してFNL更新通知1626を送信し、CPU812は、ソフトウェア1602に対してFNL更新通知1627を転送する。そして、ソフトウェア1602は、期間1645においてエラー回復処理を行う。
このように、ノード611−1のSCF1601を経由することなく、FNL912の同期制御が行われ、ノード611−3及びノード611−4のFNL912に故障ノード611−2が登録される。このため、図15の場合と比較して、ユーザアプリケーションが停止する期間1642及び期間1644が短縮され、期間1643及び期間1645におけるエラー回復処理が早く完了する。
図1及び図5の共有メモリシステム100の構成は一例に過ぎず、共有メモリシステム100の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。例えば、ノード101−1〜ノード101−Mは、クロスバスイッチ102の代わりに、通信ネットワークを介して接続されていてもよい。
図6、図8、及び図11の情報処理装置601の構成は一例に過ぎず、情報処理装置601の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。例えば、ノード611−1〜ノード611−Mは、クロスバスイッチ801の代わりに、通信ネットワークを介して接続されていてもよい。
図9のHA回路822の構成は一例に過ぎず、情報処理装置601の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。図10の制御回路634及びルータ回路831の構成は一例に過ぎず、情報処理装置601の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。
例えば、信号R1〜信号R4のうちいずれか1つのみを契機として探索パケットを発行する場合は、図10のOR回路1001を省略することができる。探索パケットを重複して発行することを許容する場合は、AND回路1002及びレジスタ1006を省略することができる。レジスタ1006は、探索パケットの宛先ノード611毎に発行済みフラグを保持してもよい。ノード611間に冗長化されたK本の経路が存在する場合、ルータ回路831は、K個のポートを含んでいてもよい。
図7のフローチャートは一例に過ぎず、情報処理装置601の構成又は条件に応じて一部の処理を省略又は変更してもよい。
図2の抑止動作、図3の登録動作、図4のタイマ積算、及び図15のエラー回復シーケンスは一例に過ぎず、共有メモリシステム100の構成又は条件に応じて別の動作が行われることもある。
図12及び図13の探索パケットは一例に過ぎず、情報処理装置601の構成又は条件に応じて別の探索パケットが発行されることもある。図14の登録動作及び図16のエラー回復シーケンスは一例に過ぎず、情報処理装置601の構成又は条件に応じて別の動作が行われることもある。
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
図1乃至図16を参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
(付記1)
演算処理装置とメモリをそれぞれ備えた複数のノードを有する情報処理装置において、
前記演算処理装置は、
他のノードに含まれる前記メモリに対するリクエストを生成するリクエスト生成部と、
前記他のノードに対して生成された前記リクエストを発行するリクエスト発行部と、
故障情報を記憶する記憶部と、
所定の契機で前記他のノードに対して応答要求を送信し、所定時間内に前記他のノードから応答を受信しない場合、前記他のノードの故障を示す情報を前記故障情報として前記記憶部に記憶させる制御部と、
前記故障情報が前記他のノードの故障を示す場合、前記リクエスト発行部による前記リクエストの発行を抑止する抑止部とを含む、
ことを特徴とする情報処理装置。
(付記2)
前記制御部は、前記複数のノード間における経路の故障又はノード故障を示す故障通知を受信した場合を前記所定の契機として、前記他のノードに対して前記応答要求を発行することを特徴とする付記1記載の情報処理装置。
(付記3)
前記制御部は、前記複数のノードのうちいずれかのノードから前記応答要求を受信した場合を前記所定の契機として、前記他のノードに対して前記応答要求を発行することを特徴とする付記1又は2記載の情報処理装置。
(付記4)
前記制御部は、前記所定の契機において前記他のノードに対して前記応答要求を発行済みである場合、前記応答要求の発行を抑止することを特徴とする付記1記載の情報処理装置。
(付記5)
複数のノードを有する情報処理装置の制御方法であって、
前記複数のノード各々に含まれる演算処理装置が、所定の契機で他のノードに対して応答要求を送信し、
所定時間内に前記他のノードから応答を受信しない場合、前記演算処理装置が、前記他のノードの故障を示す情報を、記憶部が記憶する故障情報に設定し、
前記演算処理装置が、前記他のノードに含まれるメモリに対するリクエストを生成し、
前記故障情報が前記他のノードの故障を示す場合、前記演算処理装置が、前記他のノードに対する前記リクエストの発行を抑止する、
ことを特徴とする制御方法。
(付記6)
前記演算処理装置は、前記複数のノード間における経路の故障又はノード故障を示す故障通知を受信した場合を前記所定の契機として、前記他のノードに対して前記応答要求を発行することを特徴とする付記5記載の制御方法。
(付記7)
前記演算処理装置は、前記複数のノードのうちいずれかのノードから前記応答要求を受信した場合を前記所定の契機として、前記他のノードに対して前記応答要求を発行することを特徴とする付記5又は6記載の制御方法。
(付記8)
前記演算処理装置は、前記所定の契機において前記他のノードに対して前記応答要求を発行済みである場合、前記応答要求の発行を抑止することを特徴とする付記5記載の制御方法。