(57)【要約】【課題】  ストレージデバイスからのレスポンス情報を用いて、レイテンシやスループットを向上する方法を提供すること。【解決手段】  実施形態によれば、ストレージシステムは、それぞれが、複数の不揮発性半導体メモリを具備し、ネットワークにより互いに接続される第１ストレージデバイス及び第２ストレージデバイスと、前記第１ストレージデバイス及び前記第２ストレージデバイスに接続される第１接続ユニット及び第２接続ユニットと、を具備する。前記第１接続ユニットは、前記第１ストレージデバイスの前記複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリにＩ／Ｏ要求を送信し、前記Ｉ／Ｏ要求を受信した前記第１不揮発性半導体メモリは、当該第１不揮発性半導体メモリの状況を示す状況情報を前記第１接続ユニットに返信し、前記第１接続ユニットは、前記状況情報に応じて前記第１不揮発性半導体メモリの動作を制御する。【選択図】図１０
2018041404.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが、複数の不揮発性半導体メモリを具備し、ネットワークにより互いに接続される第１ストレージデバイス及び第２ストレージデバイスと、
前記第１ストレージデバイス及び前記第２ストレージデバイスに接続される第１接続ユニット及び第２接続ユニットと、を具備するストレージシステムであって、
前記第１接続ユニットは、前記第１ストレージデバイスの前記複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリにＩ／Ｏ要求を送信し、
前記Ｉ／Ｏ要求を受信した前記第１不揮発性半導体メモリは、当該第１不揮発性半導体メモリの状況を示す状況情報を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記状況情報に応じて前記第１不揮発性半導体メモリの動作を制御するストレージシステム。
【請求項２】
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求を保存するメモリを具備し、
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求が前記メモリに保存できない場合、前記状況情報を含むビジー応答を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記第１不揮発性半導体メモリから前記ビジー応答を受信すると、前記状況情報に応じたリトライ時間後に前記Ｉ／Ｏ要求を再送する請求項１記載のストレージシステム。
【請求項３】
前記リトライ時間は、以前のリトライ時間と、前記状況情報とに応じて決定される請求項２記載のストレージシステム。
【請求項４】
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求を保存する第１メモリを具備し、
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求が前記第１メモリに保存できない場合、前記状況情報を含むビジー応答を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記第１不揮発性半導体メモリから送信された複数のビジー応答の状況情報を保存する第２メモリを具備し、前記第２メモリに保存された前記複数のビジー応答の状況情報に応じたリトライ時間後に前記Ｉ／Ｏ要求を再送する請求項１記載のストレージシステム。
【請求項５】
前記リトライ時間は、以前のリトライ時間と、前記複数のビジー応答の状況情報とに応じて決定される請求項４記載のストレージシステム。
【請求項６】
前記第１ストレージデバイスは、受信した前記Ｉ／Ｏ要求を前記第２ストレージデバイスに転送することができ、
前記第２ストレージデバイスは、受信した前記Ｉ／Ｏ要求を前記第１ストレージデバイスに転送することができ、
前記第１接続ユニットは、前記第１ストレージデバイスに接続される第１ポートと、前記第２ストレージデバイスに接続される第２ポートとを具備し、
前記第１接続ユニットは、前記第１ポートを介して前記第１ストレージデバイスの前記複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリにＩ／Ｏ要求を送信し、
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求を保存する第１メモリを具備し、
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求が前記メモリに保存できない場合、前記状況情報及び前記第１接続ユニットから前記第１不揮発性半導体メモリまでのネットワークの混雑度を示す混雑情報を含むビジー応答を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記第１不揮発性半導体メモリから前記ビジー応答を受信して、前記混雑情報が閾値以上の混雑を示す場合、前記第２ポートを介して前記第１ストレージデバイスの前記第１不揮発性半導体メモリに前記Ｉ／Ｏ要求を送信する請求項１記載のストレージシステム。
【請求項７】
前記第１接続ユニットは、前記第１不揮発性半導体メモリから前記ビジー応答を受信して、前記混雑情報が閾値以上の混雑を示さない場合、前記状況情報に応じたリトライ時間後に前記Ｉ／Ｏ要求を前記第１ポートを介して再送する請求項６記載のストレージシステム。
【請求項８】
前記Ｉ／Ｏ要求を保存するメモリをさらに具備し、
前記第１不揮発性半導体メモリは、前記Ｉ／Ｏ要求が前記メモリに保存できない場合、前記状況情報を含むビジー応答を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記ビジー応答を受信すると、前記状況情報に応じたタイミングで前記第１不揮発性半導体メモリのバックグラウンド処理を起動する請求項１記載のストレージシステム。
【請求項９】
前記第１不揮発性半導体メモリは、前記状況情報及び前記第１接続ユニットから前記第１不揮発性半導体メモリまでのネットワークの混雑度を示す混雑情報を含む応答を前記第１接続ユニットに返信し、
前記第１接続ユニットは、前記第１不揮発性半導体メモリから前記応答を受信すると、前記状況情報及び混雑情報に応じたタイミングで前記第１不揮発性半導体メモリのバックグラウンド処理を起動する請求項８記載のストレージシステム。
【請求項１０】
前記第１接続ユニットは、前記第１ストレージデバイスの前記複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリに送信する予定の複数のＩ／Ｏ要求を保存するメモリを具備し、
前記第１接続ユニットは、前記第１不揮発性半導体メモリから前記ビジー応答を受信すると、前記状況情報及び前記混雑情報及び前記メモリに保存されているＩ／Ｏ要求の数に応じたタイミングで前記第１不揮発性半導体メモリのバックグラウンド処理を起動する請求項９記載のストレージシステム。
【請求項１１】
前記第１ストレージデバイス及び前記第２ストレージデバイスの各々は、前記複数の不揮発性半導体メモリと、前記複数の不揮発性半導体メモリに接続されるルーティング回路とを具備し、
前記第１接続ユニットは、前記ルーティング回路に接続され、
前記第１ストレージデバイスの前記ルーティング回路及び前記第２ストレージデバイスの前記ルーティング回路は前記ネットワークにより互いに接続される請求項１乃至請求項１０のいずれか一項記載のストレージシステム。
【請求項１２】
それぞれが、複数の不揮発性半導体メモリを具備し、ネットワークにより互いに接続される第１ストレージデバイス及び第２ストレージデバイスと、
前記第１ストレージデバイス及び前記第２ストレージデバイスに接続される第１接続ユニット及び第２接続ユニットと、を具備するストレージシステムにおける方法であって、
前記第１接続ユニットは、前記第１ストレージデバイスの前記複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリにＩ／Ｏ要求を送信し、
前記Ｉ／Ｏ要求が受信されると、当該第１不揮発性半導体メモリの状況を示す状況情報が前記第１接続ユニットに返信され、
前記第１接続ユニットは、前記状況情報に応じて前記第１不揮発性半導体メモリの動作を制御する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
実施形態は概してストレージシステム及び方法に関する。
【背景技術】
【０００２】
フラッシュメモリ等の不揮発性半導体メモリをそれぞれ含み、互いに接続されたストレージデバイスを多数含むストレージシステムが開発されている。このストレージシステムは、多数のクライアントと通信可能に接続され、クライアントからのコマンドに応じた要求パケットがいずれかのストレージデバイスに送信される。複数のクライアントからのコマンドが或るストレージデバイスに偏り、或るストレージデバイスへ複数の要求パケットが集中し、要求を実行することができないことがある。この場合、或るストレージデバイスは要求を受け付けることができない（ビジー状態である）ことを示すビジー応答を返信する。ビジー状態が解除されるタイミングは予測不可能であるので、ビジー応答が返信されると、要求が完了するまで、要求パケットが繰り返し送信される。要求パケットの繰り返し送信はリトライとも称される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１２−１０３９２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ビジー応答が返信されると直ちにリトライパケットが送信されると、リトライパケットがストレージデバイス間の通信路を占有し、リトライパケットが要求パケットの通信経路を阻害することで、要求パケットがターゲットとなるストレージデバイスに到達できない、もしくはストレージデバイスからの応答がクライアントへ返ってこないことが生じる。これにより、ストレージシステム全体のレイテンシやスループットに悪影響を及ぼす。
【０００５】
実施形態の目的は、ストレージデバイスからのレスポンス情報を用いて、レイテンシやスループットを向上する方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、ストレージシステムは、それぞれが、複数の不揮発性半導体メモリを具備し、ネットワークにより互いに接続される第１ストレージデバイス及び第２ストレージデバイスと、第１ストレージデバイス及び第２ストレージデバイスに接続される第１接続ユニット及び第２接続ユニットと、を具備する。第１接続ユニットは、第１ストレージデバイスの複数の不揮発性半導体メモリの中の第１不揮発性半導体メモリにＩ／Ｏ要求を送信し、Ｉ／Ｏ要求を受信した第１不揮発性半導体メモリは、当該第１不揮発性半導体メモリの状況を示す状況情報を第１接続ユニットに返信し、第１接続ユニットは、状況情報に応じて第１不揮発性半導体メモリの動作を制御する。
【図面の簡単な説明】
【０００７】
【図１】図１は実施形態のストレージシステムを含むシステム全体の構成の一例を示すブロック図である。
【図２】図２は第１実施形態のストレージシステムの構成の一例を示すブロック図である。
【図３】図３は第１実施形態のストレージシステムの中の接続ユニットの一例を示すブロック図である。
【図４】図４は第１実施形態のストレージシステムの中のストレージ部の一例を示すブロック図である。
【図５】図５は第１実施形態のストレージシステムの中のストレージ部の中のＦＰＧＡの一例を示すブロック図である。
【図６】図６は第１実施形態のストレージシステムの中のストレージ部の中のノードモジュールの一例を示すブロック図である。
【図７】図７は第１実施形態で使われるパケットのデータ構造の一例を示す。
【図８】図８は第１実施形態のパケット転送の一例を示すフローチャートである。
【図９】図９は第１実施形態の送信先アドレスの一例を示す。
【図１０】図１０は第１実施形態のＩ／Ｏ要求に関する接続ユニットの処理の一例を示すフローチャートである。
【図１１】図１１は第１実施形態のＩ／Ｏ要求に関するノードモジュールの処理の一例を示すフローチャートである。
【図１２】図１２は第１実施形態のストレージ部の状態の一例を示す。
【図１３】図１３は第１実施形態のストレージ部の状態の他の例を示す。
【図１４】図１４は第１実施形態のストレージ部の状態の他の例を示す。
【図１５】図１５は第１実施形態のストレージ部の状態の他の例を示す。
【図１６】図１６は第１実施形態のストレージ部の状態の他の例を示す。
【図１７】図１７は第１実施形態のＩ／Ｏ要求に関する動作の一例を示す接続ユニットとノードモジュールとの間のシーケンス図である。
【図１８】図１８は第２実施形態のＩ／Ｏ要求に関する動作の一例を示す接続ユニットとノードモジュールとの間のシーケンス図である。
【図１９】図１９は第３実施形態のＩ／Ｏ要求に関する接続ユニットの処理の一例を示すフローチャートである。
【図２０】図２０は第３実施形態のストレージ部の状態の一例を示す。
【図２１】図２１は第３実施形態のストレージ部の状態の他の例を示す。
【図２２】図２２は第４実施形態のＩ／Ｏ要求に関する接続ユニットの処理の一例を示すフローチャートである。
【図２３】図２３は第４実施形態のストレージ部の状態の一例を示す。
【図２４】図２４は第４実施形態のストレージ部の状態の他の例を示す。
【図２５】図２５は第５実施形態のＩ／Ｏ要求に関する接続ユニットの処理の一例を示すフローチャートである。
【図２６】図２６は第５実施形態のストレージ部の状態の一例を示す。
【図２７】図２７は第５実施形態のストレージ部の状態の他の例を示す。
【図２８】図２８は第５実施形態のストレージ部の状態の他の例を示す。
【図２９】図２９は第６実施形態のＩ／Ｏ要求に関する接続ユニットの処理の一例を示すフローチャートである。
【発明を実施するための形態】
【０００８】
以下、実施の形態について図面を参照して説明する。以下の説明において、実質的に同一の機能及び要素については、同一符号を付し、説明は省略することがある。いくつかの要素に複数の表現例を付す場合があるが、これら表現例はあくまで例示であり、上記要素が他の表現例で表現されることを否定するものではない。また、複数の表現例が付されていない要素についても、別の表現例で表現されてもよい。
【０００９】
（第１の実施形態）  
［全体構成］  
図１は、実施形態のストレージシステムの応用例の一例、例えばビッグデータ分析システムのブロック図である。ＬＡＮ１２に多数のクライアント端末（以下、単にクライアントと称する）１０と、ストレージシステム１６が接続される。ストレージシステム１６は、フラッシュメモリ等を含む多数の不揮発性半導体メモリを含む。ＬＡＮ１２を用いずに、多数のクライアント１０がストレージシステム１６に直接に接続されてもよい。管理者端末１４がストレージシステム１６に直接に接続されているが、管理者端末１４はＬＡＮ１２を介してストレージシステム１６に接続されてもよい。クライアント１０はストレージシステム１６にアクセスして、希望のデータをストレージシステム１６から読み出し、あるいは処理後のデータをストレージシステム１６に書込む。ストレージシステム１６はインターネット１８にも接続され、同じくインターネット１８に接続される多数のセンサ２０のセンスデータがストレージシステム１６に格納される。
【００１０】
［ストレージシステム１６］  
図２は、ストレージシステム１６の一例を示す。ストレージシステム１６は、ストレージ部３０、多数の接続ユニット（ＣＵ：Connection Unit）３２、システムマネージャ３４、管理者端末インターフェース３６、電源ユニット（ＰＳＵ：Power Supplying Unit）３８、バッテリバックアップユニット（ＢＢＵ：Battery Backup Unit）４２等を含むが、この構成に限定されない。
【００１１】
ストレージ部３０は、例えばマトリクス状に配置された多数のノードモジュール（ＮＭ：Node Module）５４、それぞれが所定数、例えば４つのノードモジュール５４に接続される多数のルーティング回路（ＲＣ：Routing Circuit）５２を含む。すなわち、ルーティング回路５２は所定数のノードモジュール５４を管理するものであり、ルーティング回路５２の個数はノードモジュール５４の個数の所定数分の１である。マトリクス状のネットワークは、網目状あるいは格子状に構成されたネットワークであって、複数の縦の線と複数の横の線が交差した交差点に通信ノードが存在し、縦の線と横の線が通信経路となるネットワークである。なお、配置形状はマトリクス状に限定されない。
【００１２】
ノードモジュール５４は、不揮発性半導体メモリを含み、クライアント１０からの指示によるデータを記憶する記憶部である。ノードモジュール５４の詳細については後述するが、ノードモジュール５４は、ルーティング回路５２および図５に示すパケット管理ユニット（ＰＭＵ：Packet Management Unit）９０を介して、他のノードモジュール５４と電気的に接続される。
【００１３】
ルーティング回路５２は２つ以上のインターフェースを含み、１つのインターフェースは信号線５６、例えばＬＶＤＳ（Low Voltage Differential Signaling）規格の信号線を介して他のルーティング回路５２に接続されるとともに、他のインターフェースは信号線６０、例えばＰＣＩｅ（PCIExpress）規格の信号線を介して接続ユニット３２に接続される。インターフェース規格は一例であり、必要に応じてその他のインターフェース規格が適用可能である。
【００１４】
ルーティング回路５２は、信号線５６、６０からなるマトリクス状のネットワークにより、接続ユニット３２から送信された、または他のルーティング回路５２から転送されたデータを含むパケットを別のルーティング回路５２に転送する。
【００１５】
図２のストレージ部３０の例では、ノードモジュール５４がそれぞれ格子点に配置された通信ノードに対応するマトリクス状のネットワークの例が示される。格子点の座標を、１０進数表記の座標（ｘ，ｙ）で示す。格子点に配置されるノードモジュール５４の位置情報は、当該格子点の座標と対応する相対的なノードアドレス（ｘｄ，ｙｄ）（＝１０進数表記）で示されるものとする。図２の例では、左上隅に位置するノードモジュール５４が、原点のノードアドレス（０，０）を有する。ノードアドレス（ｘｄ，ｙｄ）を有するノードモジュール５４をＮＭ（ｘｄ，ｙｄ）と称する場合がある。各ノードモジュール５４の相対的なノードアドレスは、横方向（ｘ方向）、縦方向（ｙ方向）の整数値が変動することにより、増減する。
【００１６】
各ノードモジュール５４は、２以上の異なる方向に隣接するノードモジュール５４と接続される。例えば、最も左上隅のＮＭ（０，０）は、ルーティング回路５２を介して、Ｘ方向に隣接するＮＭ（１，０）と、Ｘ方向とは異なる方向であるＹ方向に隣接するＮＭ（０，１）と、斜め方向に隣接するＮＭ（１，１）と接続される。
【００１７】
以上のように構成されるストレージ部３０においては、各ルーティング回路５２が信号線５６によって互いに接続され、ルーティング回路５２と複数のノードモジュール５４とが接続されることにより、ノードモジュール５４間のネットワークが形成される。このため、このネットワーク全体を一つのアドレス空間でアクセスできる単一の巨大な不揮発半導体メモリと見做すことができる。この巨大な不揮発半導体メモリのメモリ空間を多数の接続ユニット、クライアントによってシェアすることができるので、ストレージ部３０は、多数のノードモジュール５４に対してデータを分散して格納し、分散的かつ並列的にデータを処理することができる。
【００１８】
ネットワークの形状は、上記の形状に限定されない。例えば、各ノードモジュール５４がルーティング回路５２を介さずに直接接続されることによって、ネットワークが形成されてもよい。
【００１９】
図２の例では、多数のノードモジュール５４が、矩形格子の格子点に配置されるが、ノードモジュール５４の配置の様態は、この例に限定されない。格子の形状は、格子点に配置される各ノードモジュール５４が２以上の異なる方向に隣接するノードモジュール５４と接続されればよく、例えば三角形、六角形などでもよい。さらに、図２では、多数のノードモジュール５４が、２次元状に配置されるが、多数のノードモジュール５４が３次元状に配置されてもよい。３次元状にノードモジュール５４を配置する場合、ノードモジュール５４の位置情報は、ノードアドレス（ｘｄ，ｙｄ，ｚｄ）で示される。
【００２０】
図２に示すように、ノードモジュール５４が２次元状に配置される場合には、対辺に位置するノードモジュール５４同士を接続することによって、ノードモジュール５４をトーラス状に接続するようにしてもよい。トーラス状とは、ノードモジュール５４が循環的に接続され、あるノードモジュール５４から他のノードモジュール５４への経路として、第１の方向を有する経路と、第１の方向に対して反対回りの第２の経路との少なくとも二つの経路が存在する接続形状である。
【００２１】
接続ユニット３２は、ＬＡＮ１２を介して任意の数のクライアント１０と接続可能なコネクタを含む接続ユニットである。クライアント１０は、ストレージシステム１６の利用者（ユーザ）によって使用される。接続ユニット３２の数は、任意に構成することができる。接続ユニット３２は、複数の例えば、２つの接続ポートを有し、それぞれ異なる２つのルーティング回路５２に直接に接続される。接続ポートは図２０、図２１を参照して第４の実施形態で詳細に説明する。２つ以外のルーティング回路５２に接続ユニット３２を接続する場合、接続ユニット３２は他のルーティング回路５２を経由して間接的に接続される。なお、１つのルーティング回路５２が複数の接続ユニット３２に直接に接続されてもよい。
【００２２】
クライアント１０は、ストレージシステム１６に対するリードコマンド、ライトコマンド、削除コマンドなどのコマンドをパケットの形でＬＡＮ１２を介していずれかの接続ユニット３２に送信する。コマンドを受け付けた接続ユニット３２は、ノードモジュール５４間の信号線５６、ルーティング回路５２を介して、コマンド内の指示に含まれるアドレス指定情報に対応するアドレスのノードモジュール５４に、受け付けた指示に対応する要求を送信する。接続ユニット３２が、クライアント１０からのコマンドを処理する過程においてノードモジュール５４に要求を送信する際には、ルーティング回路５２が転送したり実行したりすることが可能なパケットを生成し、生成したパケットを、自身に直接に接続されるルーティング回路５２に送信する。ルーティング回路５２は自分が管理するノードモジュール宛のパケットではない場合、パケットを隣のルーティング回路５２に転送する。このようにして、送信先のノードモジュール５４を管理するルーティング回路５２迄パケットが転送される。また、接続ユニット３２は、リード要求によって指示したデータを指示に含まれるアドレス指定情報に対応するアドレスのノードモジュール５４から、ルーティング回路５２、信号線５６を経由して取得し、クライアント１０に送信する。
【００２３】
システムマネージャ３４は、接続ユニット３２と、ルーティング回路５２とに電気的に接続される。システムマネージャ３４とルーティング回路５２とはＰＣＩｅ規格あるいはＩ２Ｃ（Inter-integrated circuit）規格の信号線で接続される。システムマネージャ３４は、ＣＰＵ（Central Processing Unit）などのプロセッサが、プログラムメモリに記憶されたプログラムを実行することで実現されてもよいし、プロセッサがプログラムを実行するのと同様の機能を有するＬＳＩ（ Large Scale Integration ） やＡＳＩＣ（Application Specific Integrated Circuit）等のハードウェアにより実現されてもよい。
【００２４】
システムマネージャ３４は、図示しないＢＭＣ（Base Management Controller）を含む。ＢＭＣの機能は、環境温度の監視、図示しない冷却用のファンの回転数の監視とコントロール、電源電流及び電源電圧の監視及び制御、接続ユニット３２のステータスの記録、温度の監視、リセットなどを行う。システムマネージャ３４は、ＢＭＣ機能の他に、ストレージ部３０に対する処理（バックグラウンド処理）も実行してもよい。ただし、バックグラウンド処理の実行は任意である。例えば、ノードモジュール５４がＮＡＮＤ型フラッシュメモリを応用している場合、システムマネージャ３４はフラッシュメモリのガベージコレクションやウェアレベリングを実行してもよい。システムマネージャ３４は、ノードモジュール５４の故障が発見されたとき、故障したノードモジュール５４が実装されているカード基板の交換を、接続ユニット３２を介して管理者端末１４等の外部に通知してもよい。システムマネージャ３４は、カード基板の交換後、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）のリビルドを行ってもよい。
【００２５】
ノードモジュール５４の故障の検知の主体は、図６に示すノードモジュール５４内のノードコントローラ（ＮＣ）９４でもよいし、接続ユニット３２でもよい。ノードモジュール５４の故障の検知は、そのノードモジュール５４が有するメモリからのリードデータに対するエラー検出に基づいて実行されてもよい。
【００２６】
システムマネージャ３４は、ノードモジュール５４が有するメモリに対して処理を行う際には、処理に応じたパケットを発行する。システムマネージャ３４は、例えば、後述する図７に示す様式に準拠するパケットを発行する。
【００２７】
管理者端末インターフェース３６は、システムマネージャ３４と管理者端末１４とを接続する。管理者端末１４は、ストレージシステム１６を管理する管理者によって使用される。管理者端末１４は、ＧＵＩ（Graphical User Interface）などのインターフェースを管理者に提供し、ストレージシステム１６に対する指示をシステムマネージャ３４に送信する。
【００２８】
電源供給ユニット３８は、外部電源４０から与えられる外部電源電圧を、所定の直流電圧に変換し、ストレージシステム１６の各構成に供給する。外部電源４０は、例えば、１００Ｖや２００Ｖなどの交流電源である。
【００２９】
バッテリバックアップユニット４２は、二次電池を有し、電源供給ユニット３８から供給される電力を蓄電する。バッテリバックアップユニット４２は、ストレージシステム１６が外部電源４０から電気的に遮断された場合に、補助電源電圧をストレージシステム１６の各構成に供給する。後述するノードモジュール５４のノードコントローラ（ＮＣ：Node Controller）９４は、補助電源電圧によってデータを保護するバックアップを行う。
【００３０】
［接続ユニット３２］  
図３は、接続ユニット３２の一例を示すブロック図である。接続ユニット３２は、ＣＰＵなどのプロセッサ７２と、第１インターフェース７６と、第２インターフェース７８と、メモリ７４と、第３インターフェース８０とを含むが、この構成に限定されない。
【００３１】
プロセッサ７２は、メモリ７４をワークエリアとして使用しながら、アプリケーションプログラムを実行することで各種処理を行う。第１インターフェース７６は、信号線６０を介してルーティング回路５２に接続されるＰＣＩｅ規格のインターフェースである。第２インターフェース７８は、信号線６２を介してシステムマネージャ３４に接続される。メモリ７４は、一時的にデータを保存するワークメモリである。メモリ７４は、例えば、ＲＡＭであるが、これに限定されず、他の各種メモリを使用することができる。メモリ７４は、複数のメモリから構成してもよい。第３インターフェース８０は、信号線６４を介してＬＡＮ１２に接続される。
【００３２】
メモリ７４は、ノードモジュール５４へ送信するＩ／Ｏ要求のキューを含み、接続ユニット３２は、複数のクライアント１０からのリクエストを受け付け可能である。
【００３３】
［ストレージ部３０］  
図４は、ストレージ部３０の詳細を示す。４つのノードモジュール５４を管理するルーティング回路５２はＦＰＧＡ（Field-Programmable Gate Array）により構成される。説明の便宜上、１つのルーティング回路５２と４つのノードモジュール５４を１つのＦＰＧＡ８２と称する。左上のＦＰＧＡ０８２は１つのルーティング回路５２と４つのノードモジュールＮＭ（０，０）、ＮＭ（１，０）、ＮＭ（０，１）、ＮＭ（１，１）を含む。同様に、ＦＰＧＡ１８２は１つのルーティング回路５２と４つのノードモジュールＮＭ（２，０）、ＮＭ（３，０）、ＮＭ（２，１）、ＮＭ（３，１）を含む。説明の便宜上、ストレージ部３０の４つのＦＰＧＡを例にとると、４つのＦＰＧＡ０〜ＦＰＧＡ３の各ＦＰＧＡアドレスは、２進数表記で（０００,０００）、（０１０,０００）、（０００,０１０）および（０１０,０１０）で表される。ＦＰＧＡアドレスはルーティング時にパケットを中継するためのアドレスである。
【００３４】
各ＦＰＧＡの１つのルーティング回路５２と４つのノードジュール５４は、図５に示すパケットマネジメントユニット９０を介して互いに接続される。ルーティング回路５２は、パケット転送動作において、ＦＰＧＡアドレスの宛先ｘ，ｙのうち最下位ビットを無視（マスク）して、ルーティングを行う。ＦＰＧＡアドレスはルーティングのみに用いられ、実際の宛先と送信元はノードアドレスが用いられる。ノードアドレスの最下位ビットをマスクすると、そのノードが属しているＦＰＧＡのアドレスが求まる。
【００３５】
［ＦＰＧＡ８２］  
図５は、ＦＰＧＡ８２の一例を示すブロック図である。ＦＰＧＡ８２は、例えば、１つのルーティング回路５２と、４つのノードモジュール５４以外にも、５つのパケットマネジメントユニット（ＰＭＵ：Packet Management Unit）９０１〜９０５と、ＰＣＩｅインターフェース９２とを含むが、この構成に限定されない。
【００３６】
４つのパケットマネジメントユニット９０１〜９０４が４つのノードモジュールＮＭ（０，０）、ＮＭ（１，０）、ＮＭ（０，１）、ＮＭ（１，１）にそれぞれ接続され、パケットマネジメントユニット９０５がＰＣＩｅインターフェース９２に接続される。ルーティング回路５２が受信したパケットはパケットマネジメントユニット９０１〜９０４に供給され、解析される。パケットマネジメントユニット９０１〜９０４は、パケットに含まれる送信先の座標（相対的なノードアドレス）と、自身に接続されるノードモジュールの座標（相対的なノードアドレス）とが一致するか否かを判定する。パケットマネジメントユニット９０１〜９０４は、パケットに記述される送信先アドレスと自身に接続されるノードモジュールのアドレスが一致する場合、自身に接続されているノードモジュール５４にパケットを送信する。一方、パケットマネジメントユニット９０１〜９０４は、パケットに記述される座標と自身の座標とが一致しない場合（他の座標である場合）、その旨をルーティング回路５２に返信する。ルーティング回路５２は４つのパケットマネジメントユニット９０１〜９０４から座標が一致しない旨が通知されると、そのパケットを他のルーティング回路５２に転送する。転送アルゴリズムの詳細は後述する。
【００３７】
例えば、パケットの送信先ノードアドレスが（１，１）である場合、当該ノードアドレス（１，１）に接続されるパケットマネジメントユニット９０４は、解析したパケットに記述される座標（１，１）と自分に接続されているノードモジュールの座標（１，１）とが一致すると判定する。そのため、当該ノードアドレス（１，１）に接続されるパケットマネジメントユニット９０４は、解析したパケットを自身に接続されるノードアドレス（１，１）のノードモジュールＮＭ（１，１）に送信する。送信されたパケットは、ノードモジュール５４のノードコントローラ９４（図６に示す）により解析される。これにより、ＦＰＧＡ８２は、ノードコントローラ９４を用いてノードモジュール５４中の不揮発性半導体メモリにデータを記憶させるなど、パケットに記載の要求に応じた処理を行う。
【００３８】
ＰＣＩｅインターフェース９２は、接続ユニット３２から直接的に送信された要求やパケットなどをパケットマネジメントユニット９０５に送信する。ルーティング回路５２は、パケットマネジメントユニット９０５に保存された要求やパケットを解析し、解析結果に応じて要求やパケットを自身に接続されているパケットマネジメントユニット９０１〜９０４や他のノードモジュール５４に転送する。
【００３９】
［ノードモジュール］  
図６は、ノードモジュール５４の一例を示すブロック図である。ノードモジュール５４は、ノードコントローラ９４と、不揮発性半導体メモリ９６と、ワークメモリ９８を含むが、この構成に限定されない。
【００４０】
ノードコントローラ９４には、パケットマネジメントユニット９０が電気的に接続される。ノードコントローラ９４は、パケットマネジメントユニット９０を介して接続ユニット３２または他のノードモジュール５４からパケットを受信したり、パケットマネジメントユニット９０を介して接続ユニット３２または他のノードモジュール５４へパケットを送信したりする。ノードコントローラ９４は、パケットマネジメントユニット９０から受信したパケットに含まれる要求の内容に対応する処理を実行する。例えば、パケットに含まれる要求の内容が、アクセス要求（リード要求またはライト要求）である場合には、ノードコントローラ９４は、不揮発性半導体メモリ９６に対するアクセスを実行する。ノードコントローラ９４は、アクセス要求を受信した場合、受信したアクセス要求をワークメモリ９８に一時的に保存する。
【００４１】
不揮発性半導体メモリ９６としては、例えば、ＮＡＮＤ型フラッシュメモリ、ビットコストスケーラブルメモリ（ＢｉＣＳ）、磁気抵抗メモリ（ＭＲＡＭ）、相変化メモリ（ＰｃＲＡＭ）、抵抗変化型メモリ（ＲＲＡＭ（登録商標））、またはこれらの組み合わせが適用可能である。不揮発性半導体メモリ９６はｅＭＭＣ（Embedded Multi Media Card：登録商標）と呼ばれるフラッシュメモリ応用製品から構成してもよい。ｅＭＭＣは、ＮＡＮＤ型フラッシュメモリと制御回路を１つのＢＧＡパッケージに収納し、メモリカードの規格であるＭＭＣと同じインターフェースで外部と接続される。不揮発性半導体メモリ９６は、ガベージコレクション、ウェアレベリング、Flush Cache(キャッシュの書き込み)、Read Reflesh(リードリテンション)等のバックグラウンド処理をアイドル時やライト直後等に実行する。
【００４２】
ワークメモリ９８は、不揮発性半導体メモリではなく、一時的にデータを保存するメモリである。ワークメモリ９８としては、ＤＲＡＭ（Dynamic Random Access Memory）などの各種ＲＡＭが適用可能である。不揮発性半導体メモリ９６がワークエリアとしての機能を提供する場合、ワークメモリ９８はノードモジュール５４に配置されなくてもよい。
【００４３】
［パケットのデータ構造］  
図７は、実施形態のストレージシステム１６において送信されるデータ・情報のパケットの一例を示す。パケットは、ヘッダ領域ＨＡと、ペイロード領域ＰＡと、冗長領域ＲＡとを含むが、この構成に限定されない。
【００４４】
ヘッダ領域ＨＡには、例えばコマンド、送信元のノードモジュールのＸ方向およびＹ方向のアドレス（from_x,from_y）、および送信先のノードモジュールのＸ方向およびＹ方向のアドレス（to_x, to_y）などが記述される。ペイロード領域ＰＡには、例えばデータなどが記述される。なお、コマンドはペイロード領域ＰＡにも記述されてよい。ペイロード領域ＰＡのデータサイズは、可変である。冗長領域ＲＡには、例えば、ＣＲＣ（Cyclic Redundancy Check）符号などが記述される。ＣＲＣ符号は、ペイロード領域ＰＡのデータの誤りを検出するために用いられる符号（情報）である。
【００４５】
上記構成のパケットを受信したルーティング回路５２は、所定の転送アルゴリズムに基づいて、ルーティング先を決定する。転送アルゴリズムに基づいて、パケットは、ルーティング回路５２の間を転送されて、最終的な目的地のノードアドレスのノードモジュール５４に到達する。
【００４６】
例えば、ルーティング回路５２は、上記転送アルゴリズムに基づき、自身に接続されているノードモジュール５４から宛先のノードモジュール５４までの転送回数が最小となる経路上に位置するノードモジュール５４を、転送先のノードモジュール５４に決定する。また、ルーティング回路５２は、上記転送アルゴリズムに基づき、自身に接続されているノードモジュール５４から宛先のノードモジュール５４までの転送回数が最小となる経路が複数存在する場合には、複数の経路から１つの経路を任意の方法で選択する。ルーティング回路５２は、同様に、自身に接続されているノードモジュール５４に接続される複数のノードモジュール５４のうちの転送回数が最小となる経路上に位置するノードモジュール５４が故障、あるいはビジー状態である場合には、他のノードモジュール５４を転送先に決定する。
【００４７】
複数のノードモジュール５４がメッシュ状のネットワークで論理的に接続されていることにより、パケットの転送回数が最小となる経路が複数存在する場合がある。この場合において、特定のノードモジュール５４を宛先とするパケットが複数出力されても、出力された複数のパケットは、上述の転送アルゴリズムにより複数の経路に分散して転送される。そのため、特定のノードモジュール５４に対するアクセス集中を回避することができ、ストレージシステム１６全体のスループットの低下を抑制することができる。
【００４８】
［パケット転送動作］  
図８はルーティング回路５２のパケット転送動作を説明するフローチャートである。
【００４９】
ルーティング回路５２は、ステップＢ１２で、接続ユニット３２や他のルーティング回路５２からパケットを受信すると、そのパケットのヘッダ領域ＨＡに記述された送信先ノードモジュールのＸ方向およびＹ方向のアドレス（to_x, to_y）を解析する。この際、ルーティング回路５２は、送信先のＸ方向およびＹ方向のアドレス（to_x, to_y）の最下位ビットを無視して（マスクして）、ルーティングを行う。
【００５０】
例えば、図９に示すように、送信先ノードモジュールのＸ方向およびＹ方向のアドレス（to_x, to_y）がそれぞれ１６ビットで記述されている場合、ステップＢ１２で、ルーティング回路５２は、送信先ノードモジュールのＸ方向およびＹ方向のアドレス（to_x, to_y）の斜線で示す最下位ビットＢＸ０，ＢＹ０を無視して、パケットのルーティングを行う。換言すると、ルーティング回路５２は、送信先ノードモジュールのＸ方向およびＹ方向のアドレス（to_x, to_y）の最下位ビットＢＸ０，ＢＹ０にかかわらず、パケットのルーティングを行う。なお、ＦＰＧＡアドレスも図９のデータ構造で記述される。
【００５１】
より具体的には、図４に示したように、４つのＦＰＧＡアドレスが、２進数表記（０００,０００）、（０１０,０００）、（０００,０１０）、（０１０,０１０）で表される場合、ルーティング回路５２は、上記４つのＦＰＧＡアドレスの最下位ビットを無視して、パケットのルーティングを行う。つまり、ルーティング回路５２は、上記４つのＦＰＧＡアドレスの最下位ビットを無視する結果、（００Ｘ,００Ｙ）、（０１Ｘ,００Ｙ）、（００Ｘ,０１Ｙ）、（０１Ｘ,０１Ｙ）で表されるＦＰＧＡアドレスに基づいて、パケットのルーティングを行う。ここで、上記アドレス表記において、ＸおよびＹのビットの状態（“０”状態または“１”状態）は、任意である。
【００５２】
続いて、ルーティング回路５２は、ステップＢ１４で、受け取ったパケットに記述される送信先ノードアドレスからＦＰＧＡアドレスを求め、求めたＦＰＧＡアドレスが自分のアドレスか否かを判定する。ルーティング回路５２のアドレスは、ルーティング回路５２が含まれるＦＰＧＡ８２のアドレスと同じである。この際、ルーティング回路５２は、ステップＢ１２で説明したように、送信先ＦＰＧＡアドレスの最下位ビットＢＸ０，ＢＹ０を無視した状態で、アドレスが自分のアドレスか否かを判定する。
【００５３】
受け取ったパケットの送信先ＦＰＧＡアドレスが自分のアドレスでない場合（ステップＢ１４でＮＯ）、ステップＢ１６で、ルーティング回路５２は、転送回数が最小となる経路にて、パケットを他のルーティング回路５２に転送し、この動作を終了する。
【００５４】
一方、受け取ったパケットの送信先ＦＰＧＡアドレスが自分のアドレスである場合（ステップＢ１４でＹＥＳ）、ステップＢ１８で、ルーティング回路５２は、送信先ＦＰＧＡアドレスの全ビットを認識して、当該認識したＸ方向およびＹ方向の送信先アドレスのノードアドレスにパケットを割り振る。換言すると、ステップＢ１８において、ルーティング回路５２は、送信先ノードモジュールアドレスの最下位ビットＢＸ０，ＢＹ０を無視しないで、当該認識したＸ方向およびＹ方向の送信先アドレスのノードアドレスに相対的にパケットを割り振る。より具体的には、ルーティング回路５２は、目的のノードアドレスに対応するノードモジュールが接続されているパケットマネジメントユニット９０にパケットを転送する。パケットを転送されたパケットマネジメントユニット９０は、目的のノードアドレスのノードモジュール５４にパケットを割り振り、この動作を終了する。
【００５５】
［第１実施形態の動作］  
図１０は接続ユニット３２の動作例を示すフローチャートである。図１１はノードモジュール５４の動作例を示すフローチャートである。これらを参照して、第１実施形態の動作の一例を説明する。
【００５６】
クライアント１０からストレージ部３０へのアクセスを指示するＩ／Ｏコマンドを受けた接続ユニット３２は、図１０のブロック１０１２で、アクセス対象のノードモジュール５４宛のＩ／Ｏ要求（ライト要求あるいはリード要求）を送信する。Ｉ／Ｏ要求は、上述した転送アルゴリズムによりルーティング回路５２を経由して対象のノードモジュール５４に到達する。アクセス対象のノードモジュール５４は、図１１のブロック１１１２で、Ｉ／Ｏ要求を受信し、ブロック１１１４で、ワークメモリ９８にＩ／Ｏ要求を保存できるか否か、すなわち、ワークメモリ９８がＩ／Ｏ要求を保存する容量を有するか否かを判定する。
【００５７】
ワークメモリ９８にＩ／Ｏ要求を保存できない場合、ノードモジュール５４は、ブロック１１１６で、ビジー応答を返信する。ビジー応答は、ワークメモリ９８あるいは不揮発性メモリ９６にＩ／Ｏ要求を保存する空き容量がなく、Ｉ／Ｏ要求を受け付けることができないことを示すもので、データ構造は図７に示す構成である。ビジー応答はＮＭ情報を含む。ＮＭ情報は、Ｉ／Ｏデータの処理時間、Ｉ／Ｏ要求がノードモジュールに到着するまでにかかった時間、ワークメモリ９８に保存されている要求の数や種類、不揮発性半導体メモリ９６の処理時間やレイテンシ等のノードモジュールの状態を示す。ＮＭ情報はペイロードに記述されることが多いが、ヘッダに記述しても良い。
【００５８】
ワークメモリ９８にＩ／Ｏ要求を保存できる場合、ノードモジュール５４は、ブロック１１１８で、受信したＩ／Ｏ要求をワークメモリ９８に保存し、ブロック１１２０でワークメモリ９８から１つのＩ／Ｏ要求（例えば、最も長い時間保存されている要求）を読み出し、実行する。Ｉ／Ｏ要求の実行が完了すると、ノードモジュール５４は、ブロック１１２２で、完了応答を返信する。完了応答は、Ｉ／Ｏ要求の実行完了を報告するものであり、ＮＭ情報を含み、データ構造は図７に示す構成である。ノードモジュール５４は、ブロック１１２４で、実行が完了したＩ／Ｏ要求をワークメモリ９８から消去する、あるいは参照されないようにする。
【００５９】
ブロック１１１６、あるいはブロック１１２４の後、ノードモジュール５４は、ブロック１１２６で、ワークメモリ９８にＩ／Ｏ要求が残っているか否かを判定する。ワークメモリ９８にＩ／Ｏ要求が残っている場合、ノードモジュール５４は、ブロック１１２０からの処理で次のＩ／Ｏ要求を実行する。ワークメモリ９８にＩ／Ｏ要求が残っていない場合、ノードモジュール５４は、ブロック１１１２で、次のＩ／Ｏ要求の受信を待機する。
【００６０】
図１０に示すように、接続ユニット３２は、ブロック１０１２でノードモジュール５４にＩ／Ｏ要求を送信後、ブロック１０１４でビジー応答を受信するか否かを判定する。ビジー応答を受信した場合、接続ユニット３２は、ブロック１０１６でリトライ間隔を調整する。具体的には、現在設定されているリトライ間隔と、受信したＮＭ情報とに基づいて次にＩ／Ｏ要求を再送するまでの間隔を計算する。例えば、リトライ間隔は次のように計算される。
【００６１】
リトライ間隔  
＝（（ドライバＰＭＵ時間）ｘα_pmutime）＞＞  β_pmutime  
＋（（process_time）  ｘ  α_temmc）＞＞  β_temmc  
＋（リトライ回数）  ｘ  α_retry  
＋γ_delay                    （１）
式（１）の各変数はＮＭ情報に含まれるものであり、ドライバＰＭＵ時間は、ドライバから発行パケットが発行されて、応答パケットが戻ってくるまでの時間であり、接続ユニット３２からノードモジュール５４までのパケットルーティング時間と、ノードモジュール５４でのコマンド処理時間と、ノードモジュール５４から接続ユニット３２までのパケットルーティング時間の合計値である。
【００６２】
process_timeは、ノードモジュール５４でのコマンド処理時間である。
【００６３】
リトライ回数は、何回目のリトライかを示す値である。
【００６４】
αとβは、リトライ間隔に対する重み係数である。
【００６５】
βでビットシフトしているのは、丸め処理のためである。たとえば
1.000   →  1、  1.001   →  1、  1.500   →  1、  1.999   →  1
2.000   →  2、  2.999   →  3、  3.000   →  3、  のような処理が行われる。
【００６６】
接続ユニット３２は、計算されたリトライ間隔だけブロック１０１８で待機し、その後、ブロック１０１２で、アクセス対象のノードモジュール５４にＩ／Ｏ要求を再度送信（リトライ）する。
【００６７】
ブロック１０１４で、ビジー応答を受信しない場合、接続ユニット３２は、ブロック１０２０で、完了応答を受信したか否か判定する。完了応答を受信しない場合、ブロック１０１４でビジー応答を受信するか否かを再度判定する。すなわち、接続ユニット３２は、Ｉ／Ｏ要求の送信後は、ビジー応答か完了応答の受信を待つ。
【００６８】
完了応答を受信する場合、接続ユニット３２は、ブロック１０２２でアクセス対象のノードモジュール５４への他のＩ／Ｏ要求がメモリ７４のキューに保存されているか否かを判定する。他のＩ／Ｏ要求がキューに保存されている場合、接続ユニット３２は、ブロック１０１２で、他のＩ／Ｏ要求をノードモジュール５４に送信する。他のＩ／Ｏ要求がキューに保存されていない場合、処理は終了する。
【００６９】
図１２は、４つの接続ユニット３２１、３２３、３２５、３２８からのＩ／Ｏ要求（例えばライト要求）が１つのノードモジュールＮＭ（３，５）に集中する状況を示す（図１０のブロック１０１２参照）。なお、４つの接続ユニット３２１、３２３、３２５、３２８からのライト要求は同時ではなく、時間差を持って送信される場合もある。
【００７０】
図１３は、ノードモジュールＮＭ（３，５）がビジー応答を４つの接続ユニット３２１、３２３、３２５、３２８に返信する状況を示す（図１１のブロック１１１６参照）。４つのビジー応答も同時ではなく、時間差を持って送信される場合もある。
【００７１】
この後、接続ユニット３２１、３２３、３２５、３２８は図１４に示すように待機状態となる（図１０のブロック１０１８参照）。なお、４つの接続ユニット３２１、３２３、３２５、３２８は同時に待機状態となるのでなく、時間差を持って待機状態となる場合もある。接続ユニット３２１、３２３、３２５、３２８の待機中に他の接続ユニット、例えば、３２２、３２７が他のノードモジュール、例えばＮＭ（０，７）にライト要求を送信する場合があるが、この時、ネットワークの通信経路はリトライパケットにより占有されていないので、接続ユニット３２２、３２７からＮＭ（０，７）へのライト要求が迂回され、あるいはＮＭ（０，７）に到達しないことがなく、ＮＭ（０，７）はライト要求を受信する。
【００７２】
図１５は、リトライ間隔待機後に接続ユニット３２１、３２３、３２５、３２８がライト要求を再送する状況を示す。ライト要求も、同時に限らず、時間差を持って再送されてもよい。再送時、ＮＭ（３，５）の不揮発性半導体メモリ９６やワークメモリ９８の空き容量は増えており、ライト要求を保存することができるので、ライト要求は実行される。実行が完了すると、図１６に示すように、ＮＭ（３，５）から接続ユニット３２１、３２３、３２５、３２８に完了応答が返送される。
【００７３】
図１７は、上記の動作を、複数の接続ユニット３２を代表する接続ユニット３２１、３２２とノードモジュール５４との間の動作に例えたシーケンス図である。
【００７４】
接続ユニット３２１はクライアント１０からＩ／Ｏコマンド（ライトコマンドあるいはリードコマンド）を受信すると、アクセス対象のノードモジュール５４にＩ／Ｏ要求を送信し（Ｓ１０）、ノードモジュール５４はＩ／Ｏ要求を実行する（Ｓ１１）。この実行中に、接続ユニット３２２がノードモジュール５４に他のＩ／Ｏ要求を送信した場合（Ｓ１２）、ノードモジュール５４のワークメモリ９８はＩ／Ｏ要求を保存できないとする。ノードモジュール５４は接続ユニット３２２にビジー応答を返送する（Ｓ１３）。接続ユニット３２２は待機状態となり、リトライパケットの送信を保留する（Ｓ１４）。
【００７５】
ノードモジュール５４の要求実行（Ｓ１１）が完了すると、ノードモジュール５４は接続ユニット３２１に完了応答を返送する（Ｓ１５）。接続ユニット３２２の待機状態はモジュール５４による接続ユニット３２１からの要求の実行完了後まで続くように計算されている。
【００７６】
このため、待機状態が終わり、接続ユニット３２２がＩ／Ｏ要求を再送する（Ｓ１６）時には、ノードモジュール５４は接続ユニット３２１からのＩ／Ｏ要求の実行が完了している。そのため、ノードモジュール５４は接続ユニット３２２から再送（リトライ）されたＩ／Ｏ要求を実行する（Ｓ１７）。ノードモジュール５４の要求実行（Ｓ１７）が完了すると、ノードモジュール５４は接続ユニット３２２に完了応答を返送する（Ｓ１８）。
【００７７】
以上説明したように、第１実施形態によれば、ノードモジュール５４は、接続ユニット３２からのいくつかの要求をワークメモリ９８に保存して、要求を実行する。そのため、１つのノードモジュールに複数の要求が集中すると、それ以上の要求を受け付けることが出来ず、接続ユニットへビジー応答を返信する。接続ユニットは、ビジー応答を受信した場合、直ちに要求を再送するのではなく、ノードモジュールの状況を示すＮＭ情報に基づいたリトライ間隔だけ待ってから再送する。このようにリトライパケットの送信間隔が調整されるので、ビジー状態のノードモジュールに送信される無駄なリトライパケットが減り、ネットワーク内のパケット量が減る。その結果、ビジー状態ではないノードモジュールへのパケットが優先的に送信される。また、要求の再送（リトライ）時にノードモジュール５４が要求を実行できない可能性が低下する。待機中は、リトライパケットによりネットワークの通信経路が占用されることがないので、ストレージシステムの動作速度が低下することがないとともに、他の接続ユニットからの要求が迂回され、あるいは宛先のノードモジュールに到達しないことがない。
【００７８】
リトライ間隔を決めるためのＮＭ情報は、ノードモジュール５４からの応答に含まれているので、リアルタイムにＮＭ情報を接続ユニットにフィードバックすることができるとともに、問い合わせのためのポーリングパケットを送信する必要が無く、ネットワークのリソースが無駄に消費されない。各接続ユニットが独自に負荷を調整するので、接続ユニット間でリトライ間隔調整のための情報のやり取りによるブロッキングが生じない。さらに、ノードモジュールの負荷を調整するためのロードバランシング専用の機器を導入する必要もない。
【００７９】
（第２の実施形態）  
第１実施形態ではクライアントからのコマンドを受けると、接続ユニット３２はノードモジュール５４の状態に関わらずノードモジュール５４へ要求を送信する。これとは異なり、ノードモジュール５４への要求の送信前に、ノードモジュール５４の状態を確認する第２実施形態を説明する。
【００８０】
第２実施形態は、システム構成は第１実施形態と同じであるので、説明は省略する。図１８は、第２実施形態のＩ／Ｏ要求に関する接続ユニット３２１、３２２とノードモジュール５４との間の動作例を示すシーケンス図である。図１８においては、複数の接続ユニット３２を代表して接続ユニット３２１、３２２の動作について示す。
【００８１】
接続ユニット３２１はクライアント１０からＩ／Ｏコマンド（ライトコマンドあるいはリードコマンド）を受信すると、アクセス対象のノードモジュール５４に負荷確認パケットを送信する（Ｓ２１）。ノードモジュール５４は、負荷確認パケットを受信すると、ワークメモリ９８に保存されたＩ／Ｏ要求数が基準未満か否かを判定する。この時、ワークメモリ９８に保存されたＩ／Ｏ要求のデータ数は基準未満であるとする。ノードモジュール５４は、ワークメモリ９８に保存された要求のデータ数が基準未満である場合、ノードモジュール５４の負荷が基準未満であると判断し、Ｉ／Ｏ要求の送信を認める旨（ＯＫ）を示す応答パケットを生成し、生成した応答パケットを接続ユニット３２１に送信する（Ｓ２２）。
【００８２】
接続ユニット３２１は、ノードモジュール５４からＩ／Ｏ要求の送信を認める旨（ＯＫ）を示す応答パケットを受信すると、データを書込むあるいは読み出すことをノードモジュール５４に指示するためのＩ／Ｏ要求を生成し、生成したＩ／Ｏ要求を、ノードモジュール間のネットワークを介してノードモジュール５４に送信する（Ｓ２３）。ノードモジュール５４は、接続ユニット３２１から受信したＩ／Ｏ要求を一時メモリとして機能するワークメモリ９８に保存し、ワークメモリ９８に保存されているＩ／Ｏ要求に基づき、不揮発性半導体メモリ９６にアクセスし、Ｉ／Ｏ要求を実行する（Ｓ２４）。
【００８３】
一方、接続ユニット３２２も、データのＩ／Ｏコマンドをクライアント２００から受信した場合、アクセス対象のノードモジュール５４に負荷確認パケットを送信する（Ｓ２５）。ノードモジュール５４は、接続ユニット３２２から負荷確認パケットを受信すると、ワークモリ９８に保存されたＩ／Ｏ要求数が基準未満か否かを判断する。この時は、ワークメモリ９８に保存されたＩ／Ｏ要求のデータ数は基準未満ではないとする。ノードモジュール５４は、ワークメモリ９８に保存された要求のデータ数が基準未満ではない場合、Ｉ／Ｏ要求の送信を認めない旨（ＮＧ）を示す応答パケットを生成し、生成した応答パケットＰ２を接続ユニット３２２に送信する（Ｓ２６）。
【００８４】
ＯＫやＮＧを示す応答パケットも、図１のビジー応答、完了応答と同様に、ノードモジュールの状況を示すＮＭ情報を含む。
【００８５】
接続ユニット３２２は、ノードモジュール５４からＩ／Ｏ要求の送信を認めない旨（ＮＧ）を示す応答パケットを受信すると、待機状態となり（Ｓ２７）、ノードモジュール５４にＩ／Ｏ要求を送信できないとともに、負荷確認パケットも送信できない。接続ユニット３２２の待機期間は、第１実施形態の図１０のブロック１０１６で説明したように、現在設定されている待機期間と、ＮＧ応答に含まれるＮＭ情報とに基づいて計算される。そのため、接続ユニット３２２の待機状態は、モジュール５４による接続ユニット３２１からのＩ／Ｏ要求の実行完了後まで続く。
【００８６】
ノードモジュール５４は、接続ユニット３２１から受信したＩ／Ｏ要求の実行が完了すると、接続ユニット３２１に完了応答を送信する（Ｓ２８）。ノードモジュール５４は、完了したＩ／Ｏ要求を、ワークメモリ９８から消去する、あるいは参照されないようにする。
【００８７】
一方、接続ユニット３２２は、待機状態が解除されると、アクセス対象のノードモジュール５４に負荷確認パケットを再度送信する（Ｓ２９）。ノードモジュール５４は、接続ユニット３２２から負荷確認パケットを受信すると、ワークメモリ９８に保存されたＩ／Ｏ要求のデータ数が基準未満（ノードモジュール５４の負荷が基準未満）か否かを判断する。この時、ノードモジュール５４は、処理を実行していないので、ワークメモリ９８に保存されたＩ／Ｏ要求のデータ数が基準未満であるとする。ノードモジュール５４は、ワークメモリ９８に保存されたＩ／Ｏ要求のデータ数が基準未満である場合、Ｉ／Ｏ要求の送信を認める旨（ＯＫ）を示す応答パケットを生成し、生成した応答パケットを接続ユニット３２２に送信する（Ｓ３０）。
【００８８】
接続ユニット３２２は、ノードモジュール５４からＩ／Ｏ要求の送信を認める旨（ＯＫ）を示す応答パケットを受信すると、データを書込むあるいは読み出すことをノードモジュール５４に指示するためのＩ／Ｏ要求を生成する。その後、接続ユニット３２２は、生成したＩ／Ｏ要求を、ノードモジュール間のネットワークを介してノードモジュール５４に送信する（Ｓ３１）。ノードモジュール５４は、接続ユニット３２２から受信したＩ／Ｏ要求を一時メモリとして機能するワークメモリ９８に保存する。そして、ノードモジュール５４は、ワークメモリ９８に保存されたＩ／Ｏ要求に基づき、不揮発性半導体メモリ９６にアクセスし、Ｉ／Ｏ要求を実行する（Ｓ３２）。
【００８９】
ノードモジュール５４は、接続ユニット３２２から受信したＩ／Ｏ要求の実行を完了すると、接続ユニット３２２に完了応答を送信する（Ｓ３３）。そして、ノードモジュール５４は、完了したＩ／Ｏ要求を、ワークメモリ９８から消去する、あるいは参照されないようにする。
【００９０】
負荷確認パケット、応答パケットも、図７に示されるデータ構造を有する。負荷確認パケットでは、負荷確認パケットであることを示すデータがペイロード領域ＰＡに記述される。応答パケットでは、応答パケットであることを示すデータおよびＩ／Ｏ要求の送信を認めるか否かを示すデータがペイロード領域ＰＡに記述される。負荷確認パケットおよび応答パケットのデータサイズは、Ｉ／Ｏ要求のデータサイズよりも小さい。各ノードモジュール５４は、ワークメモリ９８の記憶領域中に負荷確認パケットおよび応答パケットを保存する領域を確保するために、ワークメモリ９８の記憶領域に格納されるＩ／Ｏ要求のデータ数を制限する。これによって、ノードモジュール間のネットワークにおいて混雑が生じている場合であっても、各ノードモジュール５４はデータサイズが小さい負荷確認パケットおよび応答パケットを遅滞なく送信することができる。
【００９１】
第２実施形態によれば、ノードモジュール５４への要求の送信前に、ノードモジュール５４の状態を確認する負荷確認パケットを送信し、ノードモジュール５４の負荷が小さい場合のみ、ノードモジュール５４へ要求を送信するので、実行不可能な要求パケットを送信することがなく、ストレージシステムの性能の低下を抑制することができる。さらに、ノードモジュール５４の負荷が大きい場合、負荷確認パケットを送信しないので、データサイズが小さい負荷確認パケットの再送が繰り返されることによるネットワークへ負担がかかることが抑制できる。
【００９２】
（第３の実施形態）  
第１、第２実施形態では、リトライ間隔は、現在設定されているリトライ間隔と、ＮＭ情報とに基づいて計算されている。この計算によるリトライ間隔後のリトライ時には、ノードモジュールのビジー状態が解消されている筈であるが、不揮発性半導体メモリ９６のアクセス速度にばらつきがあれば、リトライ時にノードモジュールのビジー状態が解消されていない場合もあり得る。このため、第３実施形態では、ＮＭ情報が各リトライの成否を示す項目も含む。Ｑ-Learningのようにリトライの成否情報を報酬として与えても良い。接続ユニット３２はＮＭ情報をノードモジュール毎に保存し、統計処理して、ノードモジュール毎に最適なリトライ間隔を学習により決定する。
【００９３】
図１９は、接続ユニット３２の動作例を示すフローチャートである。ノードモジュール５４の動作例は図１１にフローチャートと同じであるので、フローチャートの図示は省略する。
【００９４】
クライアント１０からストレージ部３０へのアクセスを指示するコマンドを受けた接続ユニット３２は、ブロック１９１２で、アクセス対象のノードモジュール５４にＩ／Ｏ要求（ライト要求あるいはリード要求）を送信する。ノードモジュール５４は、図１１に示したように、ワークメモリ９８にＩ／Ｏ要求を保存できるか否かを判定し、Ｉ／Ｏ要求を保存できない場合、ビジー応答を返信し、ワークメモリ９８にＩ／Ｏ要求を保存できる場合、Ｉ／Ｏ要求を実行し、完了応答を返信する。ビジー応答と完了応答は、リトライの成否を表すので、ＮＭ情報にリトライの成否を示す項目を格別含める必要はない。しかし、第１実施形態の項目に加えてリトライの成否を示す項目も含むＮＭ情報を含めても良い。なお、リトライパケットの送信に対してもビジー応答を返信する場合がある。
【００９５】
接続ユニット３２は、ブロック１９１４で、ビジー応答を受信するか否かを判定する。リトライの成否も含むビジー応答を受信した場合、接続ユニット３２は、ブロック１９１６で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。接続ユニット３２は、ブロック１９１８でリトライ間隔を調整する。具体的には、現在設定されているリトライ間隔と、保存されているＮＭ情報とに基づいて次にＩ／Ｏ要求を再送するまでの間隔を計算する。
【００９６】
リトライ間隔は第１の実施形態で用いられた式（１）をベースに、前回リトライしたときの成否を見て、リトライ成功であればリトライ間隔を小さくし、失敗であれば、リトライ間隔を大きくする。
【００９７】
リトライ間隔（ｔ＋１）  
＝（（ドライバＰＭＵ時間）ｘα_pmutime）＞＞  β_pmutime  
＋（（process_time）  ｘ  α_temmc）＞＞  β_temmc  
＋（リトライ回数）  ｘ  α_retry  
＋γ_delay  
＋ （１  −  ２  ×  success(t)) ）ｘα_success          （２）
式（２）で、success(t)は前回リトライが成功であれば１、失敗であれば０である。
【００９８】
接続ユニット３２は、計算されたリトライ間隔だけブロック１９２０で待機し、その後、ブロック１９１２で、アクセス対象のノードモジュール５４にＩ／Ｏ要求を再度送信（リトライ）する。
【００９９】
ブロック１９１４で、ビジー応答を受信しない場合、接続ユニット３２は、ブロック１９２２で、完了応答を受信するか否か判定する。完了応答を受信しない場合、ブロック１９１４でビジー応答を受信するか否かを再度判定する。すなわち、接続ユニット３２は、Ｉ／Ｏ要求の送信後は、ビジー応答か完了応答の受信を待つ。
【０１００】
完了応答を受信する場合、接続ユニット３２は、ブロック１９２４で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。接続ユニット３２は、ブロック１９２６で、アクセス対象のノードモジュール５４への他のＩ／Ｏ要求がメモリ７４のキューに保存されているか否かを判定する。他のＩ／Ｏ要求がキューに保存されている場合、接続ユニット３２は、ブロック１９１２で、他のＩ／Ｏ要求をノードモジュール５４に送信する。他のＩ／Ｏ要求がキューに保存されていない場合、処理は終了する。
【０１０１】
第３実施形態によれば、応答に含まれるＮＭ情報がリトライの成否を示す項目を含み、接続ユニット３２は、受信したＮＭ情報をノードモジュール毎に保存し、リトライ間隔を学習により決定するので、不揮発性半導体メモリの動作速度のばらつきがあってもノードモジュール毎に最適なリトライ間隔を求めることができる。
【０１０２】
（第４の実施形態）  
上述の実施形態は、ノードモジュール５４からのＮＭ情報に基づいてリトライ間隔を調整することにより、ストレージシステム１６の性能を向上するが、ノードモジュール５４からのレスポンス情報に基づいて接続ユニット３２の接続ポートを変更することにより、ストレージシステム１６の性能を向上する第４実施形態を説明する。接続ユニット３２は、複数の例えば、２つの接続ポートを有し、それぞれ異なる２つのルーティング回路５２に直接に接続される。
【０１０３】
図２０は、接続ユニット３２１、３２２、３２３、３２４、３２５、３２６、３２７、３２８の第１ポートの接続例を示す。接続ユニット３２１の第１ポートは、ＮＭ（０，０）〜ＮＭ（１，１）を管理するルーティング回路５２１に接続され、接続ユニット３２２の第１ポートは、ＮＭ（２，２）〜ＮＭ（３，３）を管理するルーティング回路５２６に接続され、接続ユニット３２３の第１ポートは、ＮＭ（４，０）〜ＮＭ（５，１）を管理するルーティング回路５２３に接続され、接続ユニット３２４の第１ポートは、ＮＭ（６，２）〜ＮＭ（７，３）を管理するルーティング回路５２８に接続され、接続ユニット３２５の第１ポートは、ＮＭ（６，０）〜ＮＭ（７，１）を管理するルーティング回路５２４に接続され、接続ユニット３２６の第１ポートは、ＮＭ（４，２）〜ＮＭ（５，３）を管理するルーティング回路５２７に接続され、接続ユニット３２７の第１ポートは、ＮＭ（６，４）〜ＮＭ（７，５）を管理するルーティング回路５２１２に接続され、接続ユニット３２８の第１ポートは、ＮＭ（４，６）〜ＮＭ（５，７）を管理するルーティング回路５２１５に接続される。
【０１０４】
図２１は、接続ユニット３２１、３２２、３２３、３２４、３２５、３２６、３２７、３２８の第２ポートの接続例を示す。接続ユニット３２１の第２ポートは、ＮＭ（０，４）〜ＮＭ（１，５）を管理するルーティング回路５２５に接続され、接続ユニット３２２の第２ポートは、ＮＭ（２，５）〜ＮＭ（３，７）を管理するルーティング回路５２１４に接続され、接続ユニット３２３の第２ポートは、ＮＭ（４，４）〜ＮＭ（５，５）を管理するルーティング回路５２１１に接続され、接続ユニット３２４の第２ポートは、ＮＭ（６，６）〜ＮＭ（７，７）を管理するルーティング回路５２１６に接続され、接続ユニット３２５の第２ポートは、ＮＭ（２，０）〜ＮＭ（３，１）を管理するルーティング回路５２２に接続され、接続ユニット３２６の第２ポートは、ＮＭ（０，２）〜ＮＭ（１，３）を管理するルーティング回路５２５に接続され、接続ユニット３２７の第１ポートは、ＮＭ（２，４）〜ＮＭ（３，５）を管理するルーティング回路５２１０に接続され、接続ユニット３２８の第２ポートは、ＮＭ（０，６）〜ＮＭ（１，７）を管理するルーティング回路５２１３に接続される。
【０１０５】
図２２は、接続ユニット３２の動作例を示すフローチャートである。ノードモジュール５４の動作例は上述の実施形態と同じであるので、フローチャートの図示は省略する。
【０１０６】
クライアント１０からストレージ部３０へのアクセスを指示するコマンドを受けた接続ユニット３２は、ブロック２２１２で、一方のポート、例えば第１ポートを接続ポートに設定し、ブロック２２１４で、アクセス対象のノードモジュール５４にＩ／Ｏ要求（ライト要求あるいはリード要求）を送信する。ノードモジュール５４は、図１１に示したように、ワークメモリ９８にＩ／Ｏ要求を保存できるか否かを判定し、Ｉ／Ｏ要求を保存できない場合、ビジー応答を返信し、ワークメモリ９８にＩ／Ｏ要求を保存できる場合、Ｉ／Ｏ要求を実行し、完了応答を返信する。ビジー応答と完了応答は、ライフの消費値も含むＮＭ情報を含む。ライフの消費値は、パケットの寿命を示すもので、ＩＰヘッダに含まれるＴＴＬ（Time to Live）等を含む。ＴＴＬは、ルータを通過できる最大回数であり、ルータを１回通過する度、あるいは処理される度、ＴＴＬのカウンター値は−１される。制御ユニット３２から出たパケットはLVDS回線上やPMU９０上でカウンター値が減らされていき、0になるとPMU９０にてパケット消失される。リトライパケットの送信に対してビジー応答を返信することもある。
【０１０７】
接続ユニット３２は、ブロック２２１６で、ビジー応答を受信したか否かを判定する。リトライの成否も含むビジー応答を受信した場合、接続ユニット３２は、ブロック２２１８で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。接続ユニット３２は、ブロック２２２０で保存ＮＭ情報の中のライフの消費値に基づいてビジー応答を返信したノードモジュールまでの経路の混雑度を求める。混雑度は「どれぐらい混雑しているか」を表すものである。
【０１０８】
接続ユニット３２は、ブロック２２２２で混雑度が閾値以上であるか否かを判定する。混雑度が閾値以上の場合、接続ユニット３２は、ブロック２２２４で、接続ポートを切替える。この場合、接続ポートを第１ポートから第２ポートに切替える。この後、接続ユニット３２は、ブロック２２１４で、Ｉ／Ｏ要求を再送する。
【０１０９】
ノードモジュール５４がビジー状態である場合、当該ノードモジュール５４が接続されるルーティング回路５２あるいは当該ルーティング回路５２に接続されるネットワークもビジー状態である可能性が高い。そのため、ある接続ユニット３２からビジー状態であるノードモジュール５４が接続されるルーティング回路５２を経由して他の非ビジー状態のノードモジュールに送信したいＩ／Ｏ要求が「ネットワークがパケットにより混雑している状態」であるノードモジュール５４により阻害されることがある。パケットが届かない場合、パケットはライフの消費値が0となったときにPMU９０により削除される。また、接続ユニット３２には応答が来ないので、接続ユニット３２がタイムアウトし、要求をキャンセルする。
【０１１０】
このような場合、接続ポートが切り替えられると、ビジー状態であるノードモジュール５４を迂回するので、Ｉ／Ｏ要求の阻害が生じない。
【０１１１】
混雑度が閾値以上でない場合、接続ユニット３２は、ブロック２２２６で、第１実施形態の図１０のブロック１０１６と同様に、リトライ間隔を調整しても良い。接続ユニット３２は、計算されたリトライ間隔だけブロック２２２８で待機し、その後、ブロック２２１４で、アクセス対象のノードモジュール５４にＩ／Ｏ要求を再度送信（リトライ）する。
【０１１２】
ブロック２２１６で、ビジー応答を受信しない場合、接続ユニット３２は、ブロック２２３０で、完了応答を受信するか否か判定する。完了応答を受信しない場合、ブロック２２１６でビジー応答を受信するか否かを再度判定する。すなわち、接続ユニット３２は、Ｉ／Ｏ要求の送信後は、ビジー応答か完了応答の受信を待つ。
【０１１３】
完了応答を受信する場合、接続ユニット３２は、ブロック２２３２で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。接続ユニット３２は、ブロック２２３４で、アクセス対象のノードモジュール５４への他のＩ／Ｏ要求がメモリ７４のキューに保存されているか否かを判定する。他のＩ／Ｏ要求がキューに保存されている場合、接続ユニット３２は、ブロック２２１４で、他のＩ／Ｏ要求をノードモジュール５４に送信する。他のＩ／Ｏ要求がキューに保存されていない場合、処理は終了する。
【０１１４】
なお、接続ポートの切り替えは、ビジー応答を受信した場合に限らず、完了応答を受信した場合でも、ライフの消費値が閾値以上であれ、行っても良い。
【０１１５】
図２３、図２４は第４実施形態のストレージシステム１６の動作例を示す。図２３は、全ての接続ユニット３２が第１ポートを接続ポートに設定している状態を示す。図２３に示すように、接続ユニット３２２からノードモジュールＮＭ（１，３）へのライト要求と、接続ユニット３２５からノードモジュールＮＭ（１，３）へのライト要求が発生されると、ノードモジュールＮＭ（１，３）がビジー状態となる。他の接続ユニット３２１からノードモジュールＮＭ（４，２）へのライト要求が発生される場合、このライト要求は、図２３に破線で示すように、ビジー状態のノードモジュールＮＭ（１，３）が接続されるルーティング回路５２５を経由するので、ルーティング回路５２５がビジー状態であれば、送信先のノードモジュールＮＭ（４，２）に到達しない。
【０１１６】
ここで、接続モジュール３２１はレスポンスのライフの消費値を見て、ターゲットとなるノードへの経路の混雑度が閾値以上の場合、接続ポートを第２ポートに切替える。このため、図２４に示すように、ノードモジュールＮＭ（４，２）へのライト要求は、接続ユニット３２１の第２ポートからルーティング回路５２９に直接的に送信され、ビジー状態のノードモジュールＮＭ（１，３）が接続されるルーティング回路５２５を経由しない。そのため、ライト要求は、ルーティング回路５２９からルーティング回路５２１０、５２１１、５２７を経由してノードモジュールＮＭ（４，２）へ送信される。
【０１１７】
第４実施形態によれば、接続ポートが複数ある接続ユニット３２において、ネットワークの混雑度が閾値以上の場合は、接続ポートを切り替えてＩ／Ｏ要求を送信することにより、混雑しているルーティング回路、経路を迂回することができる。このため、いずれかのノードモジュール、ルーティング回路、経路にＩ／Ｏ要求が集中しても、混雑していないルーティング回路、経路を経由して他のノードモジュールにＩ／Ｏ要求を送信することができる。
【０１１８】
（第５の実施形態）  
上述の実施形態は、ノードモジュール５４からのＮＭ情報に基づいてリトライ間隔を調整し、あるいはＩ／Ｏ要求を送信する接続ポートを切り換えることにより、ストレージシステム１６の性能を向上するが、ノードモジュール５４からのＮＭ情報に基づいてバックグラウンドオペレーションの起動タイミングを調整することにより、ストレージシステム１６の性能を向上する第５実施形態を説明する。
【０１１９】
フラッシュメモリ等の不揮発性半導体メモリ９８では、接続ユニット３２からのＩ／Ｏ要求の処理とは別にはガベージコレクション、ウェアレベリング等のバックグラウンド処理も行なう。しかし、該当ノードにＩ／Ｏ要求が集中したときにバックグラウンド処理が行われると、レイテンシが悪化する場合がある。
【０１２０】
これを防ぐために、ノードモジュール５４の状態に応じてバックグラウンド処理の実行タイミングを決定する第５実施形態を説明する。
【０１２１】
図２５は、接続ユニット３２の動作例を示すフローチャートである。ノードモジュール５４の動作例は上述の実施形態と同じであるので、フローチャートの図示は省略する。
【０１２２】
クライアント１０からストレージ部３０へのアクセスを指示するコマンドを受けた接続ユニット３２は、ブロック２５１２で、アクセス対象のノードモジュール５４にＩ／Ｏ要求（ライト要求あるいはリード要求）を送信する。ここでは、図２６に示すように、接続ユニット３２５からルーティング回路５２５に接続されるノードモジュールＮＭ（１，３）へＩ／Ｏ要求が送信される。
【０１２３】
ノードモジュール５４は、図１１に示したように、ワークメモリ９８にＩ／Ｏ要求を保存できるか否かを判定し、Ｉ／Ｏ要求を保存できない場合、ビジー応答を返信し、ワークメモリ９８にＩ／Ｏ要求を保存できる場合、Ｉ／Ｏ要求を実行し、完了応答を返信する。ここでは、図２７に示すように、ルーティング回路５２５に接続されるノードモジュールＮＭ（１，３）から接続ユニット３２５へ応答が送信される。
【０１２４】
接続ユニット３２は、ブロック２５１４で、ビジー応答を受信するか否かを判定する。ビジー応答を受信した場合、接続ユニット３２は、ブロック２５１６で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。ＮＭ情報は一定期間（例えば、数十秒あるいは数分）メモリ７４に保存される。接続ユニット３２は、ブロック２５１８で、一定期間のＮＭ情報を解析し、ブロック２５２０で、その解析結果とキューに保存されているノードモジュール５４へ送信するＩ／Ｏ要求の数に基づいて、バックグラウンド処理を実行するのに適切なタイミングであるか否かを判定する。バックグラウンド処理を実行するのに適切なタイミングとは、例えばメモリ７４に保存されている要求数が少ない（ビジー状態ではない）場合や、ＮＭ情報に含まれる消費したライフ値が小さい（混雑度が低い）場合や、接続ユニット３２のキューに保存されているノードモジュール５４へ送信するＩ／Ｏ要求が少ない場合である。
【０１２５】
接続ユニット３２５は、バックグラウンド処理を実行するのに適切なタイミングと判断すると、ブロック２５２２で、図２８に示すように、ガベージコレクション、ウェアレベリング等のバックグラウンド処理の実行を指示する要求ＢＫＯＰＳをルーティング回路５２５に接続されるノードモジュールＮＭ（１，３）へ送信する。バックグラウンド処理を実行するのに適切なタイミングではない場合、ブロック２５２２はスキップされる。接続ユニット３２は、ブロック２５２４でアクセス対象のノードモジュール５４への他のＩ／Ｏ要求がメモリ７４のキューに保存されているか否かを判定する。他のＩ／Ｏ要求がキューに保存されている場合、接続ユニット３２は、ブロック１５１２で、他のＩ／Ｏ要求をノードモジュール５４に送信する。他のＩ／Ｏ要求がメモリ７４に保存されていない場合、処理は終了する。
【０１２６】
第５実施形態によれば、接続ユニット３２がノードモジュール５４の状況をリアルタイムでモニタし、その結果に基づきノードモジュール５４の処理負荷が小さい時にバックグラウンド処理を起動するので、ノードモジュール５４の高負荷時にガベージコレクション、ウェアレベリング等のバックグランドオペレーションが駆動され、ストレージシステムの性能が低下する可能性が小さくなる。
【０１２７】
（第６の実施形態）  
上述の実施形態を組み合わせた第６実施形態を説明する。
【０１２８】
図２９は第５実施形態の接続ユニット３２の動作例を示すフローチャートである。
【０１２９】
クライアント１０からストレージ部３０へのアクセスを指示するＩ／Ｏコマンドを受けた接続ユニット３２は、ブロック２９１２で、一方のポート、例えば第１ポートを接続ポートに設定し、ブロック２９１４で、アクセス対象のノードモジュール５４宛のＩ／Ｏ要求（ライト要求あるいはリード要求）を送信する。図示しないが、ノードモジュール５４は、ビジー応答、あるいは要求を処理した後完了応答を返信する。
【０１３０】
ノードモジュール５４は、ブロック２９１６で、ビジー応答を受信するか否かを判定する。ビジー応答を受信した場合、接続ユニット３２は、ブロック２９１８で、ビジー応答のＮＭ情報をノードモジュール毎にメモリ７４に保存する。接続ユニット３２は、ブロック２９２０で、保存ＮＭ情報の中のライフの消費値に基づいてビジー応答を返信したノードモジュールまでの経路の混雑度を求める。接続ユニット３２は、ブロック２９２２で混雑度が閾値以上であるか否かを判定する。混雑度が閾値以上の場合、接続ユニット３２は、ブロック２９２４で、接続ポートを切替える。この場合、接続ポートを第１ポートから第２ポートに切替える。この後、接続ユニット３２は、ブロック２９１４で、Ｉ／Ｏ要求を再送する。
【０１３１】
混雑度が閾値以上でない場合、接続ユニット３２は、ブロック２９２６で、第１実施形態の図１０のブロック１０１６と同様に、リトライ間隔を調整する。接続ユニット３２は、ブロック２９２８で待機モードとなり、ブロック２９３０で、メモリ７４に保存されている一定期間のＮＭ情報を解析し、ブロック２９３２で、その解析結果とキューに保存されているノードモジュール５４へ送信するＩ／Ｏ要求の数に基づいて、バックグラウンド処理を実行するのに適切なタイミングであるか否かを判定する。
【０１３２】
接続ユニット３２は、バックグラウンド処理を実行するのに適切なタイミングと判断すると、ブロック２９３４で、ガベージコレクション、ウェアレベリング等のバックグラウンド処理の実行を指示する要求を送信する。バックグラウンド処理を実行するのに適切なタイミングではない場合、ブロック２９３４はスキップされる。接続ユニット３２は、ブロック２９３６で、待機時間がブロック２９２６で計算したリトライ間隔に達したか否か判定する。達していない場合は、ブロック２９３０が再度実行され、達した場合は、ブロック２９１４で、次のＩ／Ｏ要求が送信される。
【０１３３】
ビジー応答を受信しない場合、接続ユニット３２は、ブロック２９４２で、完了応答を受信するか否か判定する。完了応答を受信しない場合、ブロック２９１６でビジー応答を受信するか否かを再度判定する。すなわち、接続ユニット３２は、Ｉ／Ｏ要求の送信後は、ビジー応答か完了応答の受信を待つ。
【０１３４】
完了応答を受信する場合、接続ユニット３２は、ブロック２９４４で、ノードモジュール毎にＮＭ情報をメモリ７４に保存する。接続ユニット３２は、ブロック２９４６で、メモリ７４に保存されている一定期間のＮＭ情報を解析し、ブロック２９４８で、その解析結果とキューに保存されているノードモジュール５４へ送信するＩ／Ｏ要求の数に基づいて、バックグラウンド処理を実行するのに適切なタイミングであるか否かを判定する。
【０１３５】
接続ユニット３２は、バックグラウンド処理を実行するのに適切なタイミングと判断すると、ブロック２９５０で、ガベージコレクション、ウェアレベリング等のバックグラウンド処理の実行を指示する要求を送信する。バックグラウンド処理を実行するのに適切なタイミングではない場合、ブロック２９５０はスキップされる。
【０１３６】
接続ユニット３２は、ブロック２９５２でアクセス対象のノードモジュール５４への他のＩ／Ｏ要求がメモリ７４のキューに保存されているか否かを判定する。他のＩ／Ｏ要求がキューに保存されている場合、接続ユニット３２は、ブロック２９１４で、他のＩ／Ｏ要求をノードモジュール５４に送信する。他のＩ／Ｏ要求がメモリ７４に保存されていない場合、処理は終了する。
【０１３７】
いくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると同様に、請求の範囲に記載された発明とその均等の範囲に含まれるものである。例えば、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。また、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。全ての実施形態は、複数のノードモジュールが１つのルーティング回路に接続され、接続ユニットはルーティング回路を介してノードモジュールに接続される。しかし、ルーティング回路は必須ではなく、ノードモジュールにルーティング機能を持たせれば、接続ユニットがノードモジュールに直接的に接続されてもよい。
【符号の説明】
【０１３８】
１６…ストレージユニット、３０…ストレージ部、３２…接続ユニット、３４…システムマネージャ、５２…ルーティング回路、５４…ノードモジュール、９０…パケットマネージメントユニット、９４…ノードコントローラ、９６…不揮発性メモリ。
【図１】
2018041404.tif 000003
【図２】
2018041404.tif 000004
【図３】
2018041404.tif 000005
【図４】
2018041404.tif 000006
【図５】
2018041404.tif 000007
【図６】
2018041404.tif 000008
【図７】
2018041404.tif 000009
【図８】
2018041404.tif 000010
【図９】
2018041404.tif 000011
【図１０】
2018041404.tif 000012
【図１１】
2018041404.tif 000013
【図１２】
2018041404.tif 000014
【図１３】
2018041404.tif 000015
【図１４】
2018041404.tif 000016
【図１５】
2018041404.tif 000017
【図１６】
2018041404.tif 000018
【図１７】
2018041404.tif 000019
【図１８】
2018041404.tif 000020
【図１９】
2018041404.tif 000021
【図２０】
2018041404.tif 000022
【図２１】
2018041404.tif 000023
【図２２】
2018041404.tif 000024
【図２３】
2018041404.tif 000025
【図２４】
2018041404.tif 000026
【図２５】
2018041404.tif 000027
【図２６】
2018041404.tif 000028
【図２７】
2018041404.tif 000029
【図２８】
2018041404.tif 000030
【図２９】
2018041404.tif 000031
【手続補正書】
【提出日】平成29年1月11日(2017.1.11)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】０００６
【補正方法】変更
【補正の内容】
【０００６】
実施形態によれば、ストレージシステムは、それぞれが不揮発性半導体メモリを具備する複数のストレージデバイスと、複数のストレージデバイスを接続するネットワークと、ネットワークに接続され、複数のストレージデバイスの中のいずれかのストレージデバイスにＩ／Ｏ要求を送信するコントローラと、を具備する。いずれかのストレージデバイスは、受信したＩ／Ｏ要求の実行完了または実行不能を示す応答信号を前記コントローラへ送信し、コントローラは、応答信号に応じていずれかのストレージデバイスの動作を制御する。
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
それぞれが不揮発性半導体メモリを具備する複数のストレージデバイスと、
前記複数のストレージデバイスを接続するネットワークと、
前記ネットワークに接続され、前記複数のストレージデバイスの中のいずれかのストレージデバイスにＩ／Ｏ要求を送信するコントローラと、
を具備するストレージシステムであって、
前記いずれかのストレージデバイスは、受信した前記Ｉ／Ｏ要求の実行完了または実行不能を示す応答信号を前記コントローラへ送信し、
前記コントローラは、前記応答信号に応じて前記いずれかのストレージデバイスの動作を制御するストレージシステム。
【請求項２】
前記いずれかのストレージデバイスは、受信した前記Ｉ／Ｏ要求の実行不能を示す第１応答信号を前記コントローラへ送信し、
前記コントローラは、前記第１応答信号を受信すると、前記Ｉ／Ｏ要求を再送し、
前記Ｉ／Ｏ要求の送信から前記Ｉ／Ｏ要求の再送までの時間は、前記第１応答信号に応じる請求項１記載のストレージシステム。
【請求項３】
前記Ｉ／Ｏ要求の送信から前記Ｉ／Ｏ要求の再送までの時間は、前記Ｉ／Ｏ要求の再送回数にも応じる請求項２記載のストレージシステム。
【請求項４】
前記コントローラが前記第１応答信号を受信した場合の前記Ｉ／Ｏ要求の送信から前記Ｉ／Ｏ要求の再送までの時間は、前記コントローラが前記Ｉ／Ｏ要求の実行完了を示す第２応答信号を受信した場合の前記Ｉ／Ｏ要求の送信から前記Ｉ／Ｏ要求の再送までの時間より長い請求項２記載のストレージシステム。
【請求項５】
前記Ｉ／Ｏ要求の送信から前記Ｉ／Ｏ要求の再送までの時間は、前記複数のストレージデバイス各々に設定される請求項４記載のストレージシステム。
【請求項６】
前記コントローラは、第１ストレージデバイスに接続される第１ポートと、第２ストレージデバイスに接続される第２ポートとを具備し、
前記コントローラは、前記第１ポートを介して前記第１ストレージデバイスに前記Ｉ／Ｏ要求を送信し、
前記第１ストレージデバイスは、前記応答信号と、前記コントローラと前記第１ストレージデバイスとの間の前記ネットワークの混雑度信号を前記コントローラへ送信し、
前記コントローラは、前記応答信号が前記Ｉ／Ｏ要求の実行不能を示し、前記混雑度信号が前記コントローラと前記第１ストレージデバイスとの間の前記ネットワークが混雑していることを示す場合、前記第１ポートを介する前記第１ストレージデバイスへの前記Ｉ／Ｏ要求の送信を停止し、前記第２ポートと前記第２ストレージデバイスを介して前記第１ストレージデバイスに前記Ｉ／Ｏ要求を送信する請求項１記載のストレージシステム。
【請求項７】
前記コントローラは、前記応答信号が前記Ｉ／Ｏ要求の実行完了を示し、前記混雑度信号が前記コントローラと前記第１ストレージデバイスとの間の前記ネットワークが混雑していることを示す場合、前記第１ポートを介する前記第１ストレージデバイスへの前記Ｉ／Ｏ要求の送信を停止し、前記第２ポートと前記第２ストレージデバイスを介して前記第１ストレージデバイスに前記Ｉ／Ｏ要求を送信する請求項６記載のストレージシステム。
【請求項８】
前記コントローラは、前記いずれかのストレージデバイスから送信された複数の応答信号を記憶する第２メモリを具備し、
前記第２メモリに記憶されている前記複数の応答信号に基づいて前記いずれかのストレージデバイスのバックグラウンド処理を起動する請求項１記載のストレージシステム。
【請求項９】
前記いずれかのストレージデバイスは、前記応答信号と、前記コントローラと前記いずれかのストレージデバイスとの間の前記ネットワークの混雑度信号を前記コントローラへ送信し、
前記コントローラは、前記混雑度信号が前記コントローラと前記いずれかのストレージデバイスとの間の前記ネットワークが混雑していないことを示す場合、前記いずれかのストレージデバイスのバックグラウンド処理を起動する請求項１記載のストレージシステム。
【請求項１０】
前記いずれかのストレージデバイスは、前記応答信号と、前記コントローラと前記いずれかのストレージデバイスとの間の前記ネットワークの混雑度を示す混雑度信号を前記コントローラへ送信し、
前記コントローラは、前記いずれかのストレージデバイスに送信される１または複数の前記Ｉ／Ｏ要求を記憶する第３メモリを具備し、
前記コントローラは、前記混雑度信号が前記コントローラと前記いずれかのストレージデバイスとの間の前記ネットワークが混雑していないことを示し、前記第３メモリに記憶されている前記Ｉ／Ｏ要求の数が既定数以下の場合、前記いずれかのストレージデバイスのバックグラウンド処理を起動する請求項１記載のストレージシステム。
【請求項１１】
前記混雑度信号は、ＴＴＬ（Time to Live）値を含む請求項６または請求項７または請求項９または請求項１０記載のストレージシステム。
【請求項１２】
前記複数のストレージデバイスの各々は、複数の不揮発性半導体メモリと、前記複数の不揮発性半導体メモリに接続され、前記コントローラからの前記Ｉ／Ｏ要求を前記複数の不揮発性半導体メモリのいずれかに転送するルーティング回路と、を具備し、
前記複数のストレージデバイスの各々の前記ルーティング回路は前記ネットワークにより互いに接続される請求項１乃至請求項１１のいずれか一項記載のストレージシステム。
【請求項１３】
それぞれが不揮発性半導体メモリを具備する複数のストレージデバイスと、
前記複数のストレージデバイスを接続するネットワークと、
前記ネットワークに接続されるコントローラと、を具備するストレージシステムにおける方法であって、
前記コントローラにより、前記複数のストレージデバイスのいずれかのストレージデバイスにＩ／Ｏ要求を送信することと、
前記いずれかのストレージデバイスにより、前記Ｉ／Ｏ要求の実行の成否に関する応答信号を前記コントローラへ送信することと、
前記コントローラにより、前記応答信号に応じて前記いずれかのストレージデバイスの動作を制御することと、
を具備する方法。
【請求項１４】
それぞれが不揮発性半導体メモリを具備する複数のストレージデバイスと、
前記複数のストレージデバイスを接続するネットワークと、
前記ネットワークに接続され、前記複数のストレージデバイスの中のいずれかのストレージデバイスにＩ／Ｏ要求を送信し、前記Ｉ／Ｏ要求の実行を検出するまで、前記Ｉ／Ｏ要求を再送するコントローラと、
を具備するストレージシステムであって、
前記いずれかのストレージデバイスは、受信した前記Ｉ／Ｏ要求の実行完了または実行不能を示す応答信号を前記コントローラへ送信し、
前記応答信号は、前記Ｉ／Ｏ要求が前記コントローラから発行された時から前記応答信号が前記コントローラに受信される時までの経過時間あるいは前記ストレージデバイスでの前記Ｉ／Ｏ要求の処理時間あるいは前記Ｉ／Ｏ要求の再送回数を含む応答信号を前記コントローラへ送信し、
前記コントローラは、前記Ｉ／Ｏ要求を送信してから、前記応答信号に含まれる前記経過時間あるいは前記処理時間あるいは前記再送回数に比例した時間の経過後に前記Ｉ／Ｏ要求を再送するストレージシステム。
【請求項１５】
前記経過時間は、前記コントローラから前記いずれかのストレージデバイスまでのパケットルーティング時間と、前記いずれかのストレージデバイスでのコマンド処理時間と、前記いずれかのストレージデバイスから前記コントローラまでのパケットルーティング時間の合計値である請求項１４記載のストレージシステム。