(57)【要約】【課題】  性能の低下を解消することができるストレージシステムを実現する。【解決手段】  実施形態によれば、ストレージシステムは、第１プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて第１不揮発性メモリに対する入出力処理を実行する第２プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて第２不揮発性メモリに対する入出力処理を実行する第３プロセッサとを具備する。前記第１プロセッサは、前記第２プロセッサに対して第１データを書き込むための命令を発行するときに、当該第２プロセッサによる処理の遅れが検知されている場合、前記第３プロセッサに対して前記第１データを書き込むための命令を発行し、前記遅れが検知されてから第１閾値時間が経過した場合、前記第１データを前記第２不揮発性メモリから前記第１不揮発性メモリに書き戻すための命令を発行する。【選択図】図３
2018041153.tif 000002
【特許請求の範囲】
【請求項１】
第１プロセッサと、
前記第１プロセッサによって発行されたデータの入出力命令に基づいて、１つ以上の第１不揮発性メモリに対する入出力処理を実行する第２プロセッサと、
前記第１プロセッサによって発行されたデータの入出力命令に基づいて、１つ以上の第２不揮発性メモリに対する入出力処理を実行する第３プロセッサと、
を具備し、
前記第１プロセッサは、
前記第２プロセッサに対して第１データを書き込むための命令を発行するときに、当該第２プロセッサによる処理の遅れが検知されている場合、前記第１データを前記１つ以上の第２不揮発性メモリに一時的に退避するために、前記第３プロセッサに対して前記第１データを書き込むための命令を発行し、
前記遅れが検知されてから第１閾値時間が経過した場合、前記第２プロセッサと前記第３プロセッサとに対して、前記第１データを前記１つ以上の第２不揮発性メモリから前記１つ以上の第１不揮発性メモリに書き戻すための命令を発行する、
ストレージシステム。
【請求項２】
前記第１プロセッサは、さらに、
前記第２プロセッサに対して第２データを書き込むための命令を発行した後、前記第２プロセッサによって、前記第２データが前記１つ以上の第１不揮発性メモリに書き込まれるために要した第１書き込み時間を取得し、
前記第１書き込み時間が、過去に前記第２プロセッサによってデータが書き込まれた際の平均書き込み時間に第２閾値時間を加えた値よりも大きい場合、前記第２プロセッサによる処理の遅れを検知する請求項１に記載のストレージシステム。
【請求項３】
前記１つ以上の第２不揮発性メモリは、当該１つ以上の第２不揮発性メモリに書き込まれるべきデータのための第１領域と、前記１つ以上の第１不揮発性メモリに書き込まれるべきデータを一時的に退避するための第２領域とを含み、
前記第１プロセッサは、
前記第１データが書き込まれるべき前記１つ以上の第１不揮発性メモリ上の第１アドレスと、前記第２領域の大きさとを用いて、前記第１データが書き込まれる前記１つ以上の第２不揮発性メモリ上の第２アドレスを決定し、
前記第３プロセッサに対して前記第１データを前記第２アドレスに書き込むための命令を発行する請求項１または２に記載のストレージシステム。
【請求項４】
前記第１プロセッサは、前記第１アドレスを前記第２領域の大きさで割った場合の剰余を用いて、前記第２アドレスを決定する請求項３に記載のストレージシステム。
【請求項５】
前記第１プロセッサは、前記遅れが検知されてから前記第１閾値時間が経過した場合、前記第３プロセッサに対して前記第２アドレスから前記第１データを読み出すための命令を発行し、前記第２プロセッサに対して前記第１アドレスに前記読み出された第１データを書き込むための命令を発行する請求項３に記載のストレージシステム。
【請求項６】
前記第１プロセッサによって発行されたデータの入出力命令に基づいて、１つ以上の第３不揮発性メモリに対する入出力処理を実行する第４プロセッサをさらに具備し、
前記第１プロセッサは、
前記第２プロセッサに対して前記第１データを書き込むための命令を発行するときに、当該第２プロセッサによる処理の遅れが検知されている場合、過去に前記第４プロセッサによってデータが書き込まれた際の平均書き込み時間が、過去に前記第３プロセッサによってデータが書き込まれた際の平均書き込み時間よりも短いならば、前記第１データを前記１つ以上の第３不揮発性メモリに一時的に退避するために、前記第４プロセッサに対して前記第１データを書き込むための命令を発行し、
前記遅れが検知されてから前記第１閾値時間が経過した場合、前記第２プロセッサと前記第４プロセッサに対して、前記第１データを前記１つ以上の第３不揮発性メモリから前記１つ以上の第１不揮発性メモリに書き戻すための命令を発行する請求項１に記載のストレージシステム。
【請求項７】
第１プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて、１つ以上の第１不揮発性メモリに対する入出力処理を実行する第２プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて、１つ以上の第２不揮発性メモリに対する入出力処理を実行する第３プロセッサとを具備するストレージシステムの入出力処理方法であって、
前記第２プロセッサに対して第１データを書き込むための命令を発行するときに、当該第２プロセッサによる処理の遅れが検知されている場合、前記第１データを前記１つ以上の第２不揮発性メモリに一時的に退避するために、前記第２プロセッサに対して前記第１データを書き込むための命令を発行し、
前記遅れが検知されてから第１閾値時間が経過した場合、前記第２プロセッサと前記第３プロセッサとに対して、前記第１データを前記１つ以上の第２不揮発性メモリから前記１つ以上の第１不揮発性メモリに書き戻すための命令を発行する、
入出力処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ストレージシステムおよび入出力処理方法に関する。
【背景技術】
【０００２】
クラウドコンピューティングの普及に伴い、大量のデータを格納でき、かつ、データの入出力を高速に処理できるストレージシステムの需要が高まっている。ビッグデータへの関心が高まるにつれて、この傾向は益々強まってきている。このような要求に応え得るストレージシステムの１つとして、複数のメモリノードを相互に接続したストレージシステムが提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１５−１７９４２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
複数のメモリノードを相互に接続したストレージシステムにおいては、複数のメモリノードの中の１つのメモリノードによる処理の遅延が、ストレージシステム全体の性能低下を招いてしまう。
【０００５】
本発明が解決しようとする課題は、性能の低下を解消することができるストレージシステムおよび入出力処理方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、ストレージシステムは、第１プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて、第１不揮発性メモリに対する入出力処理を実行する第２プロセッサと、前記第１プロセッサによって発行されたデータの入出力命令に基づいて、第２不揮発性メモリに対する入出力処理を実行する第３プロセッサとを具備する。前記第１プロセッサは、前記第２プロセッサに対して第１データを書き込むための命令を発行するときに、当該第２プロセッサによる処理の遅れが検知されている場合、前記第１データを前記第２不揮発性メモリに一時的に退避するために、前記第３プロセッサに対して前記第１データを書き込むための命令を発行する。前記第１プロセッサは、前記遅れが検知されてから第１閾値時間が経過した場合、前記第２プロセッサと前記第３プロセッサとに対して、前記第１データを前記第２不揮発性メモリから前記第１不揮発性メモリに書き戻すための命令を発行する。
【図面の簡単な説明】
【０００７】
【図１】第１実施形態のストレージシステムの構成の一例を示す図。
【図２】第１実施形態のストレージシステムのＮＭの構成（ＮＣの詳細な構成）の一例を示す図。
【図３】第１実施形態のストレージシステムのＣＵおよびＮＭの機能ブロックの一例を示す図。
【図４】図３のＮＭによるコマンド処理の遅延が発生する例を説明するための図。
【図５】図３のＮＭによるコマンド処理の遅延が低減される例を説明するための図。
【図６】図３のＣＵによって、データがＮＭへの書き込み単位に分割される例を示す図。
【図７】図３のＣＵによって用いられる応答履歴の一構成例を示す図。
【図８】図３のＣＵによって、書き込みデータが処理の遅いＮＭとは別のＮＭに退避される例を示す図。
【図９】図３のＣＵによって用いられる退避情報の一構成例を示す図。
【図１０】図３のＣＵによって、退避された書き込みデータが本来書き込まれるべきＮＭに書き戻される例を示す図。
【図１１】図３のＣＵによって実行される書き込み処理の手順の例を示すフローチャート。
【図１２】図３のＣＵによって実行される書き戻し処理の手順の例を示すフローチャート。
【図１３】ＮＡＮＤ型フラッシュメモリによるガベージコレクション処理がＮＭに及ぼす影響を説明するための図。
【図１４】第２実施形態のストレージシステムのＮＡＮＤ型フラッシュメモリがガベージコレクション処理を発生させた場合における動作の概要を説明するための図。
【図１５】第２実施形態のストレージシステムのコマンドを処理可能な状態のＮＭへＣＵがコマンドを発行した場合におけるＣＵ−ＮＭ間の通信手順を説明するための図。
【図１６】第２実施形態のストレージシステムのコマンドを処理不能な状態のＮＭへＣＵがコマンドを発行した場合におけるＣＵ−ＮＭ間の通信手順を説明するための図。
【図１７】第２実施形態のストレージシステムのＮＭ（ＮＭ−ＦＷドライバ）の動作の流れを示すフローチャート。
【図１８】第２実施形態のストレージシステムのＣＵ（ＣＵ−ＦＷドライバ）の動作の流れを示すフローチャート。
【発明を実施するための形態】
【０００８】
以下、実施の形態について図面を参照して説明する。
【０００９】
（第１実施形態）
まず、第１実施形態について説明する。
【００１０】
図１は、本実施形態のストレージシステム１の構成の一例を示す図である。
【００１１】
このストレージシステム１は、たとえば、ネットワーク経由で接続されるクライアント装置２からの要求に応じて、データの書き込み、データの読み出し、データの更新、データの削除などを実行するファイルサーバとして機能する。図１に示されるように、ストレージシステム１は、ネットワークスイッチ１０、複数のＣＵ（Connection Unit）２０および複数のＮＭ（Node Module）３０を有している。
【００１２】
ＮＭ３０は、ＮＣ（Node Controller）３１と、１以上のＮＡＮＤ型フラッシュメモリ３２とを有している。ＮＡＮＤ型フラッシュメモリ３２は、たとえばエンベデッドマルチメディアカード（ｅ・ＭＭＣ（登録商標））である。ＮＣ３１は、ＮＡＮＤ型フラッシュメモリ３２に対するアクセス制御と、データの転送制御とを実行する。ＮＣ３１は、たとえば４系統の入出力ポートを有しており、ＮＣ３１同士を接続することにより、複数のＮＭ３０を、たとえばマトリックス状に相互に接続することができる。複数のＮＭ３０を相互に接続することにより、ストレージシステム１は、大容量のデータ記憶領域４０を論理的に構築する。
【００１３】
ＣＵ２０は、クライアント装置２からの要求に応じて、前述のように構築されたデータ記憶領域４０に対するデータの入出力処理（データの更新、データの削除を含む）を実行する。より詳細には、クライアント装置２からの要求に対応する、複数のＮＭ３０の中の目的のＮＭ３０に対してデータの入出力命令を発行する。以下、ＣＵ２０からＮＭ３０へ発行されるデータの入出力命令を、コマンドと称することがある。
【００１４】
ＣＵ２０は、ＣＰＵ２１、ＲＡＭ２２およびＮＭインタフェース２３を有している。ＣＵ２０の各機能は、ＲＡＭ２２に格納され、ＣＰＵ２１によって実行されるプログラムにより実現される。ＮＭインタフェース２３は、ＮＭ３０、より詳細には、ＮＣ３１との間の通信を実行する。ＮＭインタフェース２３は、複数のＮＭ３０の中のいずれか１つのＮＭ３０のＮＣ３１と接続されている。つまり、ＣＵ２０は、ＮＭインタフェース２３を介して、複数のＮＭ３０の中のいずれか１つのＮＭ３０と直接的に接続され、ＮＭ３０のＮＣ３１を介して、その他のＮＭ３０と間接的に接続される。ＣＵ２０と直接的に接続されるＮＭ３０は、ＣＵ２０ごとに異なっている。
【００１５】
前述したように、ＣＵ２０は、複数のＮＭ３０の中のいずれか１つのＮＭ３０と直接的に接続される。したがって、ＣＵ２０が、直接的に接続されるＮＭ３０以外のＮＭ３０に対してデータの入出力命令を発行する場合においても、その入出力命令は、まず、直接的に接続されるＮＭ３０へ転送される。その後、その入出力命令は、各ＮＭ３０のＮＣ３１を介して目的のＮＭ３０まで転送される。たとえば、ＮＭ３０がマトリックス状に相互に接続される場合、行番号と列番号との組合せで各ＮＭ３０に識別子（Ｍ，Ｎ）が付されるものと想定すると、ＮＣ３１は、自ＮＭ３０の識別子と、入出力命令の送り先として指定される識別子とを比較することにより、第１に、その入出力命令が自ＮＭ３０宛てか否かを判断できる。自ＮＭ３０宛てでない場合、ＮＣ３１は、自ＮＭ３０の識別子と、入出力命令の送り先として指定される識別子との関係、より詳細には、行番号、列番号それぞれの大小関係から、第２に、隣接するＮＭ３０の中のいずれのＮＭ３０へ転送すべきかを判断できる。入出力命令を目的のＮＭ３０まで転送する手法については、所定の手法に限定されるものではなく、既知のいずれの手法も採用し得る。本来であれば転送先として選ばれることがないＮＭ３０への経路も、予備経路として使用され得る。
【００１６】
また、ＮＭ３０による、入出力命令に応じた入出力処理の結果、すなわち、ＮＡＮＤ型フラッシュメモリ３２に対するアクセスの結果も、前述した入出力命令の転送と同様、ＮＣ３１の働きにより、他のＮＭ３０をいくつか経由して入出力命令の発行元であるＣＵ２０まで転送される。たとえば、入出力命令の発行元の情報として、ＣＵ２０が直接的に接続されるＮＭ３０の識別子を含ませることで、この識別子を処理結果の転送先として指定することができる。
【００１７】
さらに、ＮＣ３１は、割り込み要求信号を転送するための入出力ポートを別途たとえば４系統有しており、前述した入出力命令および処理結果と同様、ＮＭ３０からＣＵ２０までの割り込み要求信号の転送経路が動的に決定される。
【００１８】
ネットワークスイッチ１０は、クライアント装置２からの要求を受け付け、その要求を複数のＣＵ２０のいずれかに転送する。典型的には、ネットワークスイッチ１０は、複数のＣＵ２０の負荷が均等となるように、クライアント装置２からの要求を複数のＣＵ２０へ振り分ける。なお、ここでは、ネットワークスイッチ１０を設ける例を示しているが、複数のＣＵ２０の中の１つのＣＵ２０がマスタとして動作して、ネットワークスイッチ１０の役割を担ってもよい。ネットワークスイッチ１０は、ＣＵ２０から受領した処理結果をクライアント装置２へ返送する。
【００１９】
図２は、ＮＭ３０の構成（ＮＣ３１の詳細な構成）の一例を示す図である。
【００２０】
前述したように、ＮＭ３０は、ＮＣ３１と、１以上のＮＡＮＤ型フラッシュメモリ３２とを有している。ＮＣ３１は、図２に示されるように、ＣＰＵ３１１、ＲＡＭ３１２、Ｉ／Ｏコントローラ３１３およびＮＡＮＤインタフェース３１４を有している。ＮＣ３１の各機能は、ＲＡＭ３１２に格納され、ＣＰＵ３１１によって実行されるプログラムにより実現される。Ｉ／Ｏコントローラ３１３は、ＣＵ２０（より詳細には、ＮＭインタフェース２３）または他のＮＭ３０（より詳細には、ＮＣ３１）との間の通信を実行する。ＮＡＮＤインタフェース３１４は、ＮＡＮＤ型フラッシュメモリ３２に対するアクセスを実行する。
【００２１】
図３は、ＣＵ２０およびＮＭ３０の機能ブロックの一例を示す図である。
【００２２】
ＣＵ２０において、ＲＡＭ３２に格納されたプログラムがＣＰＵ２１によって実行されることにより、図３に示されるように、アプリケーション部１０１とストレージ管理部１０２とがユーザ空間に構成され、ＣＵ−ＦＷ（Firmware）ドライバ１０３がカーネル空間に構築される。一方、ＮＭ３０において、ＲＡＭ３１２に格納されたプログラムがＣＰＵ３１１によって実行されることにより、図３に示されるように、ＮＭ−ＦＷドライバ１０３が構築される。ここでは、ＮＭ−ＦＷドライバ１０３以外の構築物の図示を省略する。
【００２３】
アプリケーション部１０１は、クライアント装置２からデータの入出力要求を受信し、この入出力要求をストレージ管理部１０２に出力する。
【００２４】
ストレージ管理部１０２は、この入出力要求に応じて、ＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２にアクセスするためのアクセス機能を有する。ストレージ管理部１０２は、入出力要求に対応するコマンド（命令）を、ＣＵ−ＦＷドライバ１０３を介して発行する。入出力要求がたとえばデータのリード要求である場合、ストレージ管理部１０２は、ＮＭ−ＦＷドライバ２０１に対して、ＮＡＮＤ型フラッシュメモリ３２からデータを読み出すためのリードコマンドを発行する。また、入出力要求がたとえばデータのライト要求である場合、ストレージ管理部１０２は、ＮＭ−ＦＷドライバ２０１に対して、ＮＡＮＤ型フラッシュメモリ３２にデータを書き込むためのライトコマンドを発行する。
【００２５】
ＮＭ−ＦＷドライバ２０１は、発行されたコマンドに応じて、ＮＡＮＤ型フラッシュメモリ３２に対する入出力処理を実行する。
【００２６】
また、ストレージ管理部１０２は、ＣＵ−ＦＷドライバ１０３を介して、ＮＭ−ＦＷドライバ２０１による入出力処理の実行結果を取得する。ストレージ管理部１０２は、たとえばリードコマンドに応じてＮＡＮＤ型フラッシュメモリ３２から読み出されたデータを受け取る。また、ストレージ管理部１０２は、たとえばライトコマンドに応じたＮＡＮＤ型フラッシュメモリ３２へのデータの書き込みが完了したことを示す通知を受け取る。
【００２７】
ストレージ管理部１０２は、さらに、ＣＵ２０によってアクセス可能な複数のＮＭ３０の内の１つのＮＭ３０による処理が遅れている場合に、この１つのＮＭ３０に書き込まれるべきデータ（ライトデータ）を別のＮＭ３０に一時的に退避するための退避機能も有する。これは、ストレージシステム１において、１つのＮＭ３０による処理の遅れがシステム全体の性能低下を招いてしまうためである。
【００２８】
図４は、ストレージシステム１内のＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）、ＮＭ（１，１）に、処理の遅いＮＭ（１，１）が含まれることによって、ストレージシステム１全体の処理が遅くなる例を示す。ここでは、ＣＵ２０がＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）、ＮＭ（１，１）に対して、それぞれ４つのコマンドを発行する場合を想定する。
【００２９】
図４に示す例では、ＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）の各々が１つのコマンドを１．５ミリ秒（ｍｓ）で処理しているのに対して、ＮＭ（１，１）は１つのコマンドを３．０ミリ秒で処理している。ＮＭ（１，１）は、たとえばガベージコレクション（ＧＣ）を実行中であることによって、コマンドの処理が遅くなっているＮＭである。
【００３０】
ＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）がそれぞれ４つのコマンドを処理する期間内に、ＮＭ（１，１）は２つのコマンドしか処理できていない。そして、ＮＭ（１，１）がさらに２つのコマンド４１，４２を処理している間の待ち時間の分だけ、他のＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）ではアイドル時間が発生している。したがって、処理が遅い１つのＮＭ（１，１）によってストレージシステム１全体の性能が大幅に低下することになる。
【００３１】
より具体的には、ＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）が４つのコマンドを処理する６ミリ秒間に、ＮＭ（１，１）は２つのコマンドしか処理できていないので、ＮＭ（１，１）へのコマンドが２つ、ＣＵ−ＦＷドライバ１０３のＩＯキューに残ることになる。つまり、遅いＮＭ（１，１）へのコマンドが、６ミリ秒毎に２つずつＩＯキューに積まれることになる。そのため、たとえば、このＩＯキューに格納できるコマンド数が１２８個であるとすれば、６４（＝１２８／２）回の６ミリ秒である、おおよそ４００ミリ秒で、ＩＯキューに遅いＮＭ（１，１）へのコマンドのみが格納されることになる。
【００３２】
ＩＯキューが遅いＮＭ（１，１）へのコマンドのみに専有された場合、それ以降に発行されるコマンドは、ＩＯキューに空き領域ができるまで受け付けられない。つまり、ストレージシステム１では、すべてのＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）、ＮＭ（１，１）に対する新たな入出力の受け付けが不可能になる。したがって、処理が遅い１つのＮＭ（１，１）によってストレージシステム１全体の性能が大幅に低下することになる。
【００３３】
このような性能の低下を軽減するために、本実施形態では、処理が遅いＮＭに対するデータの書き込みが要求される場合に、そのデータを別のＮＭに退避する。図５に示すように、ＧＣを実行中である処理が遅いＮＭ（１，１）に対するライトコマンド４１，４２が発行される代わりに、たとえば、書き込みが要求されたデータを、このＮＭ（１，１）とは別のＮＭ（０，０）に書き込むためのライトコマンド４３，４４が発行される。
【００３４】
上述したアクセス機能および退避機能を有するストレージ管理部１０２は、たとえばＩＯ分割部１０２１、ＩＯ実行部１０２２、ＧＣ検知部１０２３、及び退避実行部１０２４を備える。以下では、ストレージ管理部１０２が、アプリケーション部１０１からデータの書き込み要求を受け取った場合を例示する。なお、説明を分かりやすくするために、ストレージシステム１内の複数のＮＭ３０で同時に処理の遅れが発生すること（たとえば、複数のＮＭ３０がガベージコレクションを同時に実行すること）がない場合を想定する。
【００３５】
ＩＯ分割部１０２１は、アプリケーション部１０１から受け取ったライトデータを、ＮＭ３０への最大書き込み単位に分割し、分割されたデータのそれぞれが書き込まれるべきＮＭ３０を決定する。
【００３６】
図６は、書き込みが要求されたライトデータ５０が、ＮＭ３０への最大書き込み単位に分割され、各分割データ５１〜５８に書き込み先のＮＭ３０が割り当てられる例を示す。ＮＭ３０への最大書き込み単位は、たとえば４ＫＢである。
【００３７】
図６に示す例では、３２ＫＢのライトデータ５０が、４ＫＢ単位の分割データ５１〜５８に分割されている。これら分割データ５１〜５８は、ＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）、およびＮＭ（１，１）のいずれかに書き込まれる。分割データ５１〜５８の書き込み先には、たとえば分割データ５１〜５８の先頭から、ＮＭ（０，０）、ＮＭ（０，１）、ＮＭ（１，０）、およびＮＭ（１，１）が順に割り当てられている。
【００３８】
ＩＯ実行部１０２２は、割り当てられたＮＭ３０に対して、ＩＯ分割部１０２１によって分割されたデータを書き込むための命令（ライトコマンド）を発行するときに、ＧＣ検知部１０２３によってこのＮＭ３０による処理の遅れが検知されていないかどうかを判定する。ＮＭ３０による処理の遅れは、ＮＭ３０内のＣＰＵ３１１によるコマンド処理の遅れを示す。ＮＭ３０では、たとえばＧＣが実行されることによって、コマンド処理が遅延する。ＩＯ実行部１０２２は、ＧＣ検知部１０２３によってこのＮＭ３０による処理の遅れが検知されていない場合には、ＮＭ３０に対して当該データを書き込むための命令を発行する。
【００３９】
一方、ＩＯ実行部１０２２および退避実行部１０２４は、割り当てられたＮＭ３０に対して、ＩＯ分割部１０２１によって分割されたデータを書き込むための命令を発行するときに、ＧＣ検知部１０２３によってこのＮＭ３０による処理の遅れが検知されている場合には、このＮＭ３０とは別のＮＭ３０に対して、当該データを書き込むための命令を発行する。そして、ＩＯ実行部１０２２および退避実行部１０２４は、この遅れが検知されてから第１閾値時間が経過した場合、これら２つのＮＭ３０に対して、データを、その別のＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２から、当該データが本来書き込まれるべきＮＭ３０内のＮＡＮＤ型フラッシュメモリ３２に書き戻すための命令を発行する。この第１閾値時間は、たとえばシステム管理者が事前に設定することができる。
【００４０】
また、ＧＣ検知部１０２３は、あるＮＭ３０に対してデータを書き込むための命令が発行された後、ＮＭ３０がそのデータをＮＡＮＤ型フラッシュメモリ３２に書き込むために要した書き込み時間を取得する。ＧＣ検知部１０２３は、たとえば、命令を発行してから、ＣＵ−ＦＷドライバ１０３を介してＮＭ３０から書き込み完了の通知を受け取るまでの時間を、書き込み時間として取得する。ＧＣ検知部１０２３は、ＮＭ３０毎の書き込み時間の平均値をＮＭ応答履歴１０２Ａとして保存する。
【００４１】
図７は、ＮＭ応答履歴１０２Ａの一構成例を示す。ＮＭ応答履歴１０２Ａは、複数のＮＭ３０に対応する複数のエントリを含む。各エントリは、たとえば、「ＮＭＩＤ」フィールド、「平均書き込み時間」フィールド等を含む。
【００４２】
あるＮＭ３０に対応するエントリにおいて、「ＮＭＩＤ」フィールドは、そのＮＭ３０に付与された識別子を示す。「平均書き込み時間」フィールドは、そのＮＭ３０がデータ書き込みに要した時間の平均値を示す。「平均書き込み時間」フィールドには、たとえば、ＩＯ実行部１０２２がそのＮＭ３０にライトコマンドを発行してから、当該ＮＭ３０からの書き込み完了の通知を受け取るまでの時間の平均値を示す。
【００４３】
ＧＣ検知部１０２３は、ＮＭ応答履歴１０２Ａに含まれる各エントリを、たとえば、対応するＮＭ３０に書き込みのための命令を初めて発行したときに作成してもよい。そして、ＧＣ検知部１０２３は、ＮＭ３０に書き込みのための命令を発行する毎に、新たに得られた書き込み時間を用いて、対応するエントリの「平均書き込み時間」フィールドの値を更新するようにしてもよい。
【００４４】
ＧＣ検知部１０２３は、このようなＮＭ応答履歴１０２Ａを用いて、あるＮＭ３０による処理の遅れを検知する。ＧＣ検知部１０２３は、たとえば、あるＮＭ３０の書き込み時間を取得したときに、取得された書き込み時間が、ＮＭ応答履歴１０２Ａに示されるそのＮＭ３０の平均書き込み時間（すなわち、過去にそのＮＭ３０によってデータが書き込まれた際の平均書き込み時間）に、第２閾値時間を加えた値よりも大きい場合、当該ＮＭ３０による処理の遅れを検知する。
【００４５】
そして、ＧＣ検知部１０２３は、処理の遅れが検知されたＮＭ３０を示す情報をＩＯ実行部１０２２および退避実行部１０２４に通知する。
【００４６】
ＩＯ実行部１０２２および退避実行部１０２４は、たとえばこの通知を受け取ってから第１閾値時間の間、処理の遅れが検知されたＮＭ３０内の第１ＮＡＮＤ型フラッシュメモリ３２に書き込まれるべきデータを、別のＮＭ３０内の第２ＮＡＮＤ型フラッシュメモリ３２に退避するための処理を実行する。この第２ＮＡＮＤ型フラッシュメモリ３２は、当該第２ＮＡＮＤ型フラッシュメモリに書き込まれるべきデータのための第１領域と、第１ＮＡＮＤ型フラッシュメモリ３２に書き込まれるべきデータを一時的に退避するための第２領域とを含む。退避実行部１０２４は、この第１閾値時間の間、データが書き込まれるべき第１ＮＡＮＤ型フラッシュメモリ３２上の第１アドレスと、第２ＮＡＮＤ型フラッシュメモリ３２内の第２領域の大きさとを用いて、一時的な退避のためにデータが書き込まれるべき第２ＮＡＮＤ型フラッシュメモリ３２上の第２アドレスを決定する。ＩＯ実行部１０２２は、その別のＮＭ３０に対して、決定された第２アドレスにデータを書き込むための命令を発行する。また、退避実行部１０２４は、データが本来書き込まれるべきＮＭ３０内の第１ＮＡＮＤ型フラッシュメモリ３２上の第１アドレスと、このデータが退避された、別のＮＭ３０内の第２ＮＡＮＤ型フラッシュメモリ３２上の第２アドレスとを示す情報を退避情報１０２Ｂとして保存する。
【００４７】
図８を参照して、書き込みが要求されたライトデータ６５が、本来の書き込み先のＮＭ３０とは別のＮＭ３０に退避される例を示す。このライトデータ６５は、たとえば、ＮＭ３０への最大書き込み単位（たとえば、４ＫＢ）に分割された分割データである。ここでは、ストレージシステム１に、ＣＵ２０と、ＮＡＮＤ型フラッシュメモリ３２と当該ＮＡＮＤ型フラッシュメモリ３２に対するデータの入出力処理を実行するＣＰＵ３１１とをそれぞれ備えるＮＭ（０，０）、ＮＭ（０，１）およびＮＭ（１，１）とが設けられている場合を例示する。
【００４８】
ＮＭ（０，０）内のＮＡＮＤ型フラッシュメモリ３２−１には、通常の記憶領域６１１と一時退避のための記憶領域６１２とが設けられている。ＮＭ（０，１）内のＮＡＮＤ型フラッシュメモリ３２−２には、通常の記憶領域６２１と一時退避のための記憶領域６２２とが設けられている。また、ＮＭ（１，１）内のＮＡＮＤ型フラッシュメモリ３２−３には、通常の記憶領域６３１と一時退避のための記憶領域６３２とが設けられている。
【００４９】
ＮＭ（０，１）上の一時退避のための記憶領域６２２は、本来、ＮＭ（０，０）上の通常の記憶領域６１１に書き込むべきデータを一時的に退避するための領域である。また、ＮＭ（０，０）上の一時退避のための記憶領域６１２は、本来、ＮＭ（１，１）上の通常の記憶領域６３１に書き込むべきデータを一時的に退避するための領域である。
【００５０】
データの記憶場所を示すアドレスのフォーマットは、ＮＭのＩＤと当該ＮＭによって管理されるＮＡＮＤ型フラッシュメモリ上の位置を特定するためのアドレスとを含む。たとえば、アドレス“0x010001”は、上位の二桁“01”でＮＭのＩＤ（０，１）を示し、下位の４桁“0001”でそのＮＭのＮＡＮＤ型フラッシュメモリ上の位置を特定するためのアドレスを示している。図８に示す例では、ＮＭ（０，０）上の通常の記憶領域６１１のアドレスNMANM00の範囲は“0x000000”から“0x009FFFF”であり、また一時退避のための記憶領域６１２のアドレスTMP_NMANM11の範囲は“0x00A000”から“0x00AFFF”である。ＮＭ（０，１）上の通常の記憶領域６２１のアドレスNMANM01の範囲は“0x010000”から“0x019FFFF”であり、また一時退避のための記憶領域６２２のアドレスTMP_NMANM00の範囲は“0x01A000”から“0x01AFFF”である。ＮＭ（１，１）上の通常の記憶領域６３１のアドレスNMANM11の範囲は“0x110000”から“0x119FFFF”であり、また一時退避のための記憶領域６３２のアドレスTMP_NMANM10の範囲は“0x11A000”から“0x11AFFF”である。
【００５１】
図８に示す例では、ライトデータ６５をＮＭ（０，０）上の通常の記憶領域６１１に書き込むためのライトコマンドが発行されようとする場合に、ＮＭ（０，０）がＧＣ実行中であるか否かが判定される。そして、ＮＭ（０，０）がＧＣ実行中であると判定された場合、ライトデータ６５は、別のＮＭ（ここでは、後続するＩＤを有するＮＭ（０，１））上の一時退避のための記憶領域６２２に、一時的に書き込まれる。
【００５２】
同様にして、ライトデータをＮＭ（１，１）上の通常の記憶領域６３１に書き込むためのライトコマンドが発行されようとする場合には、ＮＭ（１，１）がＧＣ実行中であるか否かが判定される。そして、ＮＭ（１，１）がＧＣ実行中であると判定された場合、ライトデータは、別のＮＭ（ここでは、ＮＭ（０，０））上の一時退避のための記憶領域６１２に、一時的に書き込まれる。ＮＭ（ＮＭ１，１）は、最後のＮＭＩＤを有するＮＭであるので、退避先のＮＭとして、たとえば先頭のＩＤを有するＮＭ（０，０）が選択されている。
【００５３】
書き込みが要求されたライトデータ６５が、本来の書き込み先のＮＭ（０，０）とは別のＮＭ（０，１）に退避される場合、本来の書き込み先を示すアドレスNMANM00と、退避先の記憶領域２２２の大きさMAX_TMP_NMA_NUM（すなわち、最大書き込み単位のデータを書き込み可能な領域数）とを用いて、退避先のアドレスTMP_NMANM00が算出される。以下では、上述したアドレスのフォーマットの内、ＮＭ内の位置を特定するための下位の４桁の値を算出する方法を示す。
【００５４】
退避先のアドレスTMP_NMANM00は、たとえば、本来の書き込み先のアドレスNMANM00を、一時退避のための記憶領域の大きさMAX_TMP_NMA_NUMで割った場合の剰余R（=NMANM00 % MAX_TMP_NMA_NUM）を用いて算出される。たとえば、一時退避のための記憶領域内のR番目の領域のアドレスが、退避先のアドレスTMP_NMANM00として算出される。なお、算出された退避先のアドレスにデータが既に書き込まれている場合には、後続するアドレスを順に検索することによって見つかった空き領域にデータが書き込まれるようにしてもよい。
【００５５】
より具体的に、各ＮＭに、たとえば、最大書き込み単位のデータ１００個分の記憶領域が含まれ、先頭の９０個が通常の記憶領域に設定され、それに後続する１０個が一時退避のための記憶領域に設定される場合を例示する。１００個の記憶領域のアドレスは、先頭から順に“0x0000”から“0x0063”（１０進数で、９９）である。したがって、通常の記憶領域のアドレスの範囲は“0x0000”から“0x0059”であり、一時退避のための記憶領域のアドレスの範囲は“0x005A”から“0x0063”である。
【００５６】
このような場合に、あるＮＭの通常の記憶領域内のアドレス“0x003C”に書き込まれようとしていたデータは、“0x003C”（１０進数で、６０）を１０で割った場合の剰余が０であるので、別のＮＭの一時退避のための記憶領域における０番目の領域のアドレス“0x005A”に書き込まれることになる。同様に、あるＮＭの通常の記憶領域内のアドレス“0x003D”に書き込まれようとしていたデータは、“0x003D”（１０進数で、６１）を１０で割った場合の剰余が１であるので、別のＮＭの一時退避のための記憶領域における１番目の領域のアドレス“0x005B”に書き込まれることになる。
【００５７】
なお、上述した例では、データが退避されるＮＭとして、データが本来書き込まれるべきＮＭ３０のＮＭＩＤに後続するＮＭＩＤを有するＮＭが選択されている（但し、最後のＮＭＩＤを有するＮＭでは、先頭のＮＭＩＤを有するＮＭが選択されている）。しかし、データが退避されるＮＭの選択方法はこの例に限られない。
【００５８】
退避実行部１０２４は、ＮＭ応答履歴１０２Ａの「平均書き込み時間」フィールドの値に基づいてＮＭを順位付けし、平均書き込み時間が最も短い別のＮＭを、データが退避されるＮＭとして選択してもよい。たとえばＮＭ（０，０）に対してライトデータ６５を書き込むための命令を発行するときに、ＮＭ（０，０）による処理の遅れが検知されている場合について説明する。退避実行部１０２４は、過去にＮＭ（１，１）によってデータが書き込まれた際の平均書き込み時間が、過去にＮＭ（０，１）によってデータが書き込まれた際の平均書き込み時間よりも短いならば、ＮＭ（１，１）をデータの退避先として選択する。ＩＯ実行部１０２２は、ライトデータ６５を、ＮＭ（１，１）内のＮＡＮＤ型フラッシュメモリ３２−３に一時的に退避するために、ＮＭ（１，１）に対してライトデータ６５を書き込むための命令を発行する。そして、ＩＯ実行部１０２２は、ＮＭ（０，０）による処理の遅れが検知されてから第１閾値時間が経過した場合、ＮＭ（０，０）とＮＭ（１，１）とに対して、ライトデータ６５を、ＮＭ（１，１）内のＮＡＮＤ型フラッシュメモリ３２−３から、ＮＭ（０，０）内のＮＡＮＤ型フラッシュメモリ３２−１に書き戻すための命令を発行する。以上により、処理がより速いＮＭにデータを退避することができる。
【００５９】
また、図９は、退避実行部１０２４によって保存される退避情報１０２Ｂの一構成例を示す。退避情報１０２Ｂは、退避された１つ以上のデータに対応する１つ以上のエントリを含む。各エントリは、たとえば、「エントリＩＤ」フィールド、「元アドレス」フィールド、「退避先アドレス」フィールド、および「書き戻し済みフラグ」フィールドを含む。
【００６０】
退避されたあるデータに対応するエントリにおいて、「エントリＩＤ」フィールドは、そのエントリに付与された識別情報を示す。「エントリＩＤ」フィールドには、たとえば、データの退避処理が実行される毎に、連番で割り振られた識別情報が設定される。「元アドレス」フィールドは、対応するデータが本来書き込まれるべきＮＭのアドレスを示す。つまり、「元アドレス」フィールドは、退避されたデータが書き込まれようとしていた元のＮＭのアドレスを示す。「退避先アドレス」フィールドは、対応するデータが退避されているＮＭのアドレスを示す。「元アドレス」フィールドおよび「退避先アドレス」フィールドに示されるアドレスは、上述したように、ＮＭのＩＤと、当該ＮＭによって管理されるＮＡＮＤ型フラッシュメモリ３２上の位置を特定するためのアドレスとを含む。
【００６１】
「書き戻し済みフラグ」フィールドは、対応するデータが、本来書き込まれるべきＮＭに書き戻されたか否かを表すフラグを示す。「書き戻し済みフラグ」フィールドには、たとえば、対応するデータがまだ書き戻されていないことを示す“False”と、対応するデータが既に書き戻されたことを示す“True”のいずれかが設定される。
【００６２】
退避実行部１０２４は、このような退避情報１０２Ｂを用いて、あるＮＭ３０による処理の遅れが検知されてから第１閾値時間が経過した場合、データを、退避されたＮＭ３０から、当該データが本来書き込まれるべきであったＮＭ３０に書き戻すことを、ＩＯ実行部１０２２に要求する。ＩＯ実行部１０２２は、この要求に応じて、データを、退避されたＮＭ３０内の第２ＮＡＮＤ型フラッシュメモリ３２から、当該データが本来書き込まれるべきであったＮＭ３０内の第１ＮＡＮＤ型フラッシュメモリ３２に書き戻すための命令を発行する。
【００６３】
より具体的には、退避実行部１０２４は、たとえば、あるＮＭ３０による処理の遅れが検知されてから第１閾値時間が経過した場合、退避情報１０２Ｂから、「元アドレス」フィールドで示されるＮＭＩＤが当該ＮＭ３０に対応し、且つ「書き戻し済みフラグ」の値が“False”であるエントリを抽出する。そして、退避実行部１０２４は、抽出された各エントリの「退避先アドレス」フィールドで示されるＮＭ３０上のアドレスからデータを読み出し、読み出されたデータを、「元アドレス」フィールドで示される別のＮＭ３０上のアドレスに書き込むことを、ＩＯ実行部１０２２に要求する。
【００６４】
ＩＯ実行部１０２２は、この要求に応じて、「退避先アドレス」フィールドで示されるＮＭＩＤで特定されるＮＭ３０に対して、その「退避先アドレス」フィールドで示されるアドレスのデータを読み出すための命令（リードコマンド）を発行する。そして、ＩＯ実行部１０２２は、「元アドレス」フィールドで示されるＮＭＩＤで特定される別のＮＭ３０に対して、読み出されたデータを、その「元アドレス」フィールドで示されるアドレスに書き込むための命令（ライトコマンド）を発行する。
【００６５】
図１０に示すように、ＮＭ（０，１）上の一時退避のための記憶領域６２２に書き込まれていたライトデータ６５は、たとえばＮＭ（０，０）上でのＧＣの実行が終了した後（すなわち、第１閾値時間が経過した後）、本来、書き込まれるべきであったＮＭ（０，０）上の通常の記憶領域６１１に書き戻されている。
【００６６】
このような動作に応じて、データが、退避先のＮＭ３０から、本来書き込まれるべきＮＭ３０に書き戻されたならば、退避実行部１０２４は、退避情報１０２Ｂの対応するエントリの「書き戻し済みフラグ」フィールドの値を“True”に変更するようにしてもよい。
【００６７】
以上の構成により、あるＮＭ３０による処理の遅れが検知された場合に、そのＮＭ３０に書き込まれようとしていたデータが別のＮＭ３０に退避され、また処理の遅れが解消された後に、そのデータが元のＮＭ３０に書き戻されるので、１つのＮＭ３０の処理の遅れによるストレージシステム１全体の性能の大幅な低下を軽減することができる。
【００６８】
次いで、図１１のフローチャートを参照して、ＣＵ２０のＣＰＵ２１によって実行される書き込み処理の手順の一例を説明する。
【００６９】
まず、ＣＰＵ２１は、データの書き込み要求があるか否かを判定する（ステップＣ１）。この書き込み要求は、たとえばクライアント装置２からの書き込み要求である。書き込み要求がない場合（ステップＣ１のＮＯ）、ステップＣ１の手順に戻り、書き込み要求があるか否かが再度判定される。
【００７０】
書き込み要求があった場合（ステップＣ１のＹＥＳ）、ＣＰＵ２１は、その書き込み要求に対応するライトデータをＮＭ３０への最大書き込み単位に分割する（ステップＣ２）。これにより、ライトデータが分割された複数の分割データが得られる。ＣＰＵ２１は、各分割データの書き込み先を示す書き込み先アドレスを決定する（ステップＣ３）。この書き込み先アドレスは、上述したように、たとえばＮＭ３０のＩＤと、ＮＭ３０内での書き込み先を示すアドレスとを含む。
【００７１】
次いで、ＣＰＵ２１は複数の分割データの内の一つを選択する（ステップＣ４）。そして、ＣＰＵ２１は、選択された分割データの書き込み先アドレスを用いて、書き込み先のＮＭ３０が、ＧＣを実行中のＮＭであるか否かを判定する（ステップＣ５）。より具体的には、ＣＰＵ２１は、たとえば、書き込み先のＮＭ３０による処理の遅れが検知されているか否かを判定する。
【００７２】
書き込み先のＮＭ３０がＧＣ実行中のＮＭでない場合（ステップＣ５のＮＯ）、ＣＰＵ２１は、そのＮＭ３０に対して、書き込み先アドレスと分割データとが指定されたライトコマンドを発行する（ステップＣ６）。このライトコマンドに応じて、書き込み先のＮＭ３０は、指定されたアドレスに分割データを書き込み、書き込みが完了したことをＣＵ２０に通知する。
【００７３】
ＣＰＵ２１は、書き込み先のＮＭ３０の書き込み時間を取得する（ステップＣ７）。ＣＰＵ２１は、たとえば、ライトコマンドを発行してから、書き込みが完了したことを示す通知をＮＭ３０から受信するまでの時間を書き込み時間として取得する。そして、ＣＰＵ２１は、取得された書き込み時間が、書き込み先のＮＭ３０の平均書き込み時間に第２閾値時間（たとえば、１ミリ秒）を加えた値よりも大きいか否かを判定する（ステップＣ８）。この平均書き込み時間は、各ＮＭ３０の過去の応答履歴に基づいて算出され、たとえばＮＭ応答履歴１０２ＡとしてＣＵ２０内に格納されている。書き込み時間が書き込み先のＮＭ３０の平均書き込み時間に第２閾値時間を加えた値以下である場合（ステップＣ８のＮＯ）、ステップＣ９の手順がスキップされる。つまり、ＣＰＵ２１は、書き込み先のＮＭ３０がＧＣ実行中でないと判定する。
【００７４】
書き込み時間が書き込み先のＮＭ３０の平均書き込み時間に第２閾値時間を加えた値よりも大きい場合（ステップＣ８のＹＥＳ）、ＣＰＵ２１は書き込み先のＮＭ３０がＧＣ実行中であることを検知する（ステップＣ９）。書き込み先のＮＭ３０がＧＣ実行中であることが検知された場合、ＣＰＵ２１は、たとえば、その検知されたタイミングから予め設定された第１閾値時間だけ、書き込み先のＮＭ３０がＧＣ実行中であると推定し、上述したステップＣ５の手順において書き込み先がＧＣ実行中のＮＭであると判定する。
【００７５】
ステップＣ５の手順において、書き込み先がＧＣ実行中のＮＭであると判定された場合（ステップＣ５のＹＥＳ）、ＣＰＵ２１は、書き込み先のＮＭ３０とは別のＮＭ３０に分割データを退避するために、その別のＮＭ（すなわち、退避先のＮＭ）３０内の退避先アドレスを算出する（ステップＣ１０）。この退避先アドレスは、退避先のＮＭ３０に付与されたＩＤと、当該退避先のＮＭ３０内での書き込み先を示すアドレスとを含む。ＣＰＵ２１は、この別のＮＭ３０に対して、退避先アドレスと分割データとが指定されたライトコマンドを発行する（ステップＣ１１）。このライトコマンドに応じて、退避先のＮＭ３０は、指定されたアドレスに分割データを書き込み、書き込みが完了したことをＣＵ２０に通知する。ＣＰＵ２１は、ＣＵ２０に格納された退避情報１０２Ｂに、分割データが退避されたことを示すエントリを追加する（ステップＣ１２）。このエントリには、たとえば、書き込み先アドレス（すなわち、退避前の元のアドレス）と、退避先アドレスとが含まれている。
【００７６】
次いで、ＣＰＵ２１は、まだ書き込まれていない他の分割データがあるか否かを判定する（ステップＣ１３）。まだ書き込まれていない他の分割データがある場合（ステップＣ１３のＹＥＳ）、ステップＣ４の手順に戻り、分割データを書き込むための手順が実行される。まだ書き込まれていない分割データがない場合（ステップＣ１３のＮＯ）、すなわち、全ての分割データの書き込みが完了した場合、処理を終了する。
【００７７】
また、図１２のフローチャートは、ＣＵ２０のＣＰＵ２１によって実行される書き戻し処理の手順の例を示す。この書き戻し処理は、上述した書き込み処理において退避されたデータを、退避先のＮＭ３０から本来の書き込み先のＮＭ３０に書き戻すために実行される。
【００７８】
まず、ＣＰＵ２１は、あるＮＭ３０がＧＣを実行中であることが検知されてから第１閾値時間が経過したか否かを判定する（ステップＤ１）。より具体的には、ＣＰＵ２１は、たとえば、上述した図１１のフローチャートのステップＣ９において、書き込み先のＮＭ３０がＧＣ実行中であることが検知されてから第１閾値時間が経過したか否かを判定する。あるＮＭ３０がＧＣ実行中であることが検知されてから第１閾値時間が経過していない場合には（ステップＤ１のＮＯ）、そのＮＭ３０がまだＧＣ実行中であると推定されるので、ステップＤ１の手順に戻る。
【００７９】
あるＮＭ３０がＧＣ実行中であることが検知されてから第１閾値時間が経過した場合（ステップＤ１のＹＥＳ）、ＣＰＵ２１は、退避情報１０２ＢからそのＮＭ３０に関するエントリを読み出す（ステップＤ２）。そして、ＣＰＵ２１は、読み出されたエントリの「書き戻し済みフラグ」フィールドに“False”が設定されているか否かを判定する（ステップＤ３）。「書き戻し済みフラグ」フィールドに“False”が設定されている場合（ステップＤ３のＹＥＳ）、ＣＰＵ２１は、エントリの「退避先アドレス」フィールドに示される退避先アドレスに書き込まれているデータを、「元アドレス」フィールドに示される本来の書き込み先アドレスに書き戻すためのコマンドを発行する（ステップＤ４）。ＣＰＵ２１は、たとえば、退避先アドレスに格納されているデータを読み出すためのリードコマンドを発行した後、そのリードコマンドに応じて読み出されたデータを、本来の書き込み先アドレスに書き込むためのライトコマンドを発行する。データが本来の書き込み先アドレスに書き込まれた場合、ＣＰＵ２１は、エントリの「書き戻し済みフラグ」フィールドに“True”を設定する。
【００８０】
「書き戻し済みフラグ」フィールドに“False”が設定されていない場合（ステップＤ３のＮＯ）、たとえば、「書き戻し済みフラグ」フィールドに“True”が設定されている場合、ステップＤ４の手順がスキップされる。
【００８１】
次いで、ＣＰＵ２１は、退避情報１０２Ｂに、ＧＣ実行中であることが検知されてから閾値時間が経過したＮＭ３０に関する他のエントリがあるか否かを判定する（ステップＤ５）。他のエントリがある場合（ステップＤ５のＹＥＳ）、ステップＤ２の手順に戻り、新たなエントリに基づく処理が実行される。他のエントリがない場合（ステップＤ５のＮＯ）、処理を終了する。
【００８２】
以上説明したように、本実施形態によれば、１つのＮＭ３０の処理の遅れによる、ストレージシステム１全体の性能の大幅な低下を軽減することができる。ＮＭ（０，０）のＣＰＵ３１１は、ＣＵ２０のＣＰＵ２１によって発行された入出力命令に基づいて、第１ＮＡＮＤ型フラッシュメモリ３２に対する入出力処理を実行する。ＮＭ（０，１）のＣＰＵ３１１は、ＣＵ２０のＣＰＵ２１によって発行された入出力命令に基づいて、第２ＮＡＮＤ型フラッシュメモリ３２に対する入出力処理を実行する。ＣＵ２０のＣＰＵ２１は、ＮＭ（０，０）に対して第１データを書き込むための命令を発行するときに、ＮＭ（０，０）のＣＰＵ３１１による処理の遅れが検知されている場合、第１データを第２ＮＡＮＤ型フラッシュメモリ３２に一時的に退避するために、ＮＭ（０，１）に対して第１データを書き込むための命令を発行する。そして、ＣＰＵ２１は、この遅れが検知されてから第１閾値時間が経過した場合、ＮＭ（０，０）およびＮＭ（０，１）に対して、第１データを第２ＮＡＮＤ型フラッシュメモリ３２から第１ＮＡＮＤ型フラッシュメモリ３２に書き戻すための命令を発行する。これにより、ＮＭ（０，０）の処理の遅れによる、ストレージシステム１全体の性能の大幅な低下を軽減することができる。
【００８３】
（第２実施形態）
次に、第２実施形態について説明する。第１実施形態と同一の構成要素に対しては同一の符号を付し、その説明については省略する。
【００８４】
第１実施形態では、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション（ＧＣ）処理中のＮＭ３０に対して発行すべきコマンドが、ＣＵ２０に貯まっていくことへの対応について説明した。これに対して、本実施形態では、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクションを処理中のＮＭ３０に対してＣＵ２０が発行したコマンドが、そのＮＭ３０において滞留することへの対応について説明する。より詳細には、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクションを処理中のＮＭ３０に対するコマンドの発行を、ＣＵ２０において抑制・調停するために、ＣＵ２０とＮＭ３０とが協働することについて説明する。
【００８５】
図１３は、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理がＮＭ３０に及ぼす影響を説明するための図である。
【００８６】
ＣＵ２０からの入出力命令（コマンド）を一時的かつ時系列的に蓄積しておくための領域として、ＮＭ３０のＮＭ−ＦＷドライバ２０１は、コマンドキュー２０１ＡをＲＡＭ３１２上に構築する。ＮＭ−ＦＷドライバ２０１は、逐次的に、コマンドキュー２０１Ａからコマンドを取り出し、ＮＡＮＤ型フラッシュメモリ３２へ発行する。
【００８７】
本実施形態においては、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理を開始した場合、図１３に示されるように、このガベージコレクション処理が終了するまで、つまり、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理中、ＮＭ３０は、コマンドを処理不能な状態となるものと想定する。換言すれば、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理が、ＮＭ３０をロックしてしまうものと想定する。
【００８８】
一般論として、ＣＵ２０、より詳細には、ＣＵ−ＦＷドライバ１０３は、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを、ＮＭ３０へ発行したコマンドに対する応答、つまり処理結果が制限時間を超えて得られなかったこと（タイムアウト）で検知することができる。ＮＭ３０がコマンドを処理不能な状態であることを検知すると、ＣＵ−ＦＷドライバ１０３は、そのＮＭ３０へのコマンドの発行を抑止することができる。また、そのＮＭ３０へ発行すべきコマンドについて、たとえば第１実施形態で説明したような何らかの対応を取ることができる。
【００８９】
このタイムアウトとする制限時間が長いと、つまり、ＮＭ３０がコマンドを処理不能な状態であることをＣＵ２０が検知するまでの所要時間が長いと、その間、そのＮＭ３０へのコマンドがＣＵ２０により発行され、ＮＭ３０において滞留することになるため、ストレージシステム１全体の性能に大きな影響を与える。
【００９０】
しかしながら、タイムアウトとする制限時間を短くすることは、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理以外の他の要因でのタイムアウトを誘発するおそれがあり、容易に実施することはできない。たとえば、前述したように、ＣＵ２０とＮＭ３０との間のコマンドおよびその処理結果の転送経路は動的に決定されるため、タイムアウトとする制限時間を短くすると、この転送経路を要因として、タイムアウトを発生させるおそれがある。
【００９１】
そこで、本実施形態のストレージシステム１は、前述したように一般論として設定され得る、（ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知するために）ＣＵ−ＦＷドライバ１０３においてタイムアウトとする制限時間と比較して極めて短い時間で、ＮＭ−ＦＷドライバ２０１が、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることを検知し、ＣＵ２０へ通知する。図１４は、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理を発生させた場合における本実施形態のストレージシステム１の動作の概要を説明するための図である。
【００９２】
ＮＭ−ＦＷドライバ２０１は、ＮＡＮＤ型フラッシュメモリ３２へ発行したコマンドに対する応答が制限時間を超えて得られなかった場合、つまり、タイムアウトが発生した場合、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であると判断し、そのコマンドの発行元であるＣＵ２０に対して、ＮＭ３０がコマンドを処理不能な状態であることを通知する。ＮＭ−ＦＷドライバ２０１がコマンドに対する応答（処理結果）を待機する時間は、前述したように一般論として設定され得る、（ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知するために）ＣＵ−ＦＷドライバ１０３においてタイムアウトとする制限時間と比較して極めて短い時間が設定される。ＮＭ−ＦＷドライバ２０１がコマンドに対する応答（処理結果）を待機する時間の決め方については後述する。
【００９３】
これにより、図１４に示されるように、少なくとも、ＮＭ−ＦＷドライバ２０１によりタイムアウトが検知されたコマンドの発行元であるＣＵ２０による当該ＮＭ３０へのコマンドの発行を抑止することができる。本実施形態のＣＵ２０−ＦＷドライバ１０３は、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のＮＭ３０へのコマンドの発行を抑止するために、そのコマンドを退避しておくためのコマンド退避領域１０３ＡをＲＡＭ２２上に構築する。本実施形態では、この通知を受けたＣＵ２０は、発行しようとするコマンドが、通知元のＮＭ３０へのコマンドであった場合、このコマンドをコマンド退避領域１０３Ａへ退避することとする。言うまでもないが、ＣＵ２０は、この通知を受けた際、たとえば第１実施形態で説明したように、その通知元のＮＭ３０へのコマンドを処理するようにしてもよい。また、この通知は、すべてのＣＵ２０に対して行うようにしてもよい。または、ＣＵ２０間で通信できるようにし、この通知を受けたＣＵ２０が、他のＣＵ２０へ伝達するようにしてもよい。
【００９４】
ＮＭ−ＦＷドライバ２０１からＣＵ−ＦＷドライバ１０３への通知は、たとえば、前述した割り込み要求信号により行うことが可能である。つまり、この通知は、コマンドがエラー終了したことの応答（処理結果）とは区別可能なものとする。ＮＭ３０がコマンドを処理不能な状態であることをＣＵ２０が短時間に検知できるようになることは、そのＮＭ３０へのコマンドの発行の抑止をでき、または、そのＮＭ３０へ発行すべきコマンドについての何らかの対応を速やかに着手できることになるため、ストレージシステム１全体の性能改善に寄与する。
【００９５】
たとえば、ＣＵ２０が、ＮＭ３０に対するコマンドの発行を所定数並列に実行可能である場合、コマンドを処理不能な状態のＮＭ３０へのコマンドは退避し、コマンドを処理可能な状態のＮＭ３０へのコマンドの発行を当該所定数内においてより多く行うことで、ストレージシステム１全体の性能の低下を解消することができる。また、ＣＵ２０が、コマンドを処理不能な状態のＮＭ３０へのコマンドを、たとえば第１実施形態で説明したように処理する場合においては、この処理に速やかに着手可能となることで、当然、ストレージシステム１全体の性能の低下を解消することができる。
【００９６】
まず、図１５を参照して、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中ではなく、コマンドを処理可能な状態のＮＭ３０へＣＵ２０がコマンドを発行した場合におけるＣＵ２０−ＮＭ３０間の通信手順について説明する。なお、図１５では、ＣＵ２０のアプリケーション部１０１とストレージ管理部１０２とを統合して示している。
【００９７】
ＣＵ２０は、クライアント装置２からの要求をネットワークスイッチ１０より受け取ると、アプリケーション部１０１およびストレージ管理部１０２経由で、その要求に対応するＮＭ３０向けのコマンドをＣＵ−ＦＷドライバ１０３へ発行する（ａ１）。ＣＵ−ＦＷドライバ１０３は、このコマンドを、指定されたＮＭ３０へ発行する（ａ２）。このコマンドは、発行先のＮＭ３０において、ＮＭ−ＦＷドライバ２０１のコマンドキュー２０１Ａへ投入される。前述したように、ここでは、このＮＭ３０のＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中ではないことを想定している。
【００９８】
ＮＭ３０では、ＮＭ−ＦＷドライバ２０１が、コマンドキュー２０１Ａから取り出したコマンドをＮＡＮＤ型フラッシュメモリ３２へ発行し（ａ３）、その処理結果をＮＡＮＤ型フラッシュメモリ３２から受け取る（ａ４）。ＮＭ−ＦＷドライバ２０１は、ＮＡＮＤ型フラッシュメモリ３２から受け取った処理結果を、コマンドの発行元であるＣＵ２０へ転送する（ａ５）。この処理結果は、ＣＵ２０において、ＣＵ−ＦＷドライバ１０３により受信され、ＣＵ−ＦＷドライバ１０３は、ＮＭ３０から受け取った処理結果をストレージ管理部１０２へ転送する（ａ６）。
【００９９】
次に、図１６を参照して、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であり、コマンドを処理不能な状態のＮＭ３０へＣＵ２０がコマンドを発行した場合におけるＣＵ２０−ＮＭ３０間の通信手順について説明する。なお、図１６でも、ＣＵ２０のアプリケーション部１０１とストレージ管理部１０２とを統合して示している。
【０１００】
前述したように、ＣＵ２０は、クライアント装置２からの要求に対応するＮＭ３０向けのコマンドを、アプリケーション部１０１およびストレージ管理部１０２経由でＣＵ−ＦＷドライバ１０３へ発行する（ｂ１）。ＣＵ−ＦＷドライバ１０３は、このコマンドを、指定されたＮＭ３０へ発行する（ｂ２）。このコマンドは、発行先のＮＭ３０において、ＮＭ−ＦＷドライバ２０１のコマンドキュー２０１Ａへ投入される。ここでは、このＮＭ３０のＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることを想定している。
【０１０１】
ＮＭ３０のＮＭ−ＦＷドライバ２０１は、コマンドキュー２０１Ａからコマンドを取り出し、ＮＡＮＤ型フラッシュメモリ３２へ発行する（ｂ３）。しかしながら、ＮＡＮＤ型フラッシュメモリ３２はガベージコレクション処理中であるため、ＮＭ−ＦＷドライバ２０１は、そのコマンドの処理結果を、ＮＡＮＤ型フラッシュメモリ３２から制限時間内には得られない。この時、ＮＭ−ＦＷドライバ２０１は、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であると判断し、そのコマンドの発行元であるＣＵ２０に対して、ＮＭ３０がコマンドを処理不能な状態であることを通知する（ｂ４）。前述したように、この通知は、割り込み要求信号により行い得る。
【０１０２】
この通知は、ＣＵ２０において、ＣＵ−ＦＷドライバ１０３により受信される。ＣＵ−ＦＷドライバ１０３は、この通知を受信した後、通知元のＮＭ３０向けのコマンドをストレージ管理部１０２から受け取った場合（ｂ５）、そのコマンドをコマンド退避領域１０３Ａへ退避する（ｂ６）。なお、その他のＮＭ３０向けのコマンドについては、ＣＵ−ＦＷドライバ１０３は、そのＮＭ３０へ向けたコマンドの発行を通常通り実行する。
【０１０３】
ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理を終了させると、ＮＭ−ＦＷドライバ２０１によりタイムアウトが検知されたコマンドが処理され、その結果がＮＭ−ＦＷドライバ２０１へ転送される（ｂ７）。この処理結果をＮＡＮＤ型フラッシュメモリ３２から受け取ったＮＭ−ＦＷドライバ２０１は、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理を終了したと判断する。ＮＭ−ＦＷドライバ２０１は、そのコマンドの発行元であるＣＵ２０に対し、ＮＭ３０がコマンドを処理可能な状態に回復したこと（コマンドを処理不能な状態が解消されたこと）を通知するとともに、そのコマンドの処理結果を転送する（ｂ８）。この通知も、割り込み要求信号により行い得る。
【０１０４】
この通知およびコマンドの処理結果は、ＣＵ２０において、ＣＵ−ＦＷドライバ１０３により受信される。ＣＵ−ＦＷドライバ１０３は、ＮＭ３０から受け取ったコマンドの処理結果をストレージ管理部１０２へ転送する（ｂ９）。また、この通知を受け取ったＣＵ−ＦＷドライバ１０３は、コマンド退避領域１０３Ａへ退避した当該ＮＭ３０向けのコマンドを発行する（ｂ１０）。
【０１０５】
ここで、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることを検知するためにＮＭ−ＦＷドライバ２０１において設定される、ＮＡＮＤ型フラッシュメモリ３２へ発行したコマンドに対する応答（処理結果）を待機する時間、つまりタイムアウトとする制限時間の決め方について説明する。
【０１０６】
本実施形態のストレージシステム１においては、コマンドの種類ごとに、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理の影響を受けていない状況下での応答時間、より詳細には、ＮＭ−ＦＷドライバ２０１がＮＡＮＤ型フラッシュメモリ３２へコマンドを発行してからそのコマンドに対する応答（処理結果）をＮＭ−ＦＷドライバ２０１がＮＡＮＤ型フラッシュメモリ３２から取得するまでの時間を測定し、平均値（平均時間）と標準偏差とを算出する。ここでは、平均時間をｍ、標準偏差をσとする。
【０１０７】
本実施形態のストレージシステム１は、ＮＭ−ＦＷドライバ２０１がコマンドに対する応答（処理結果）を待機する時間、つまりタイムアウトとする制限時間として、ｍ+３σを設定する。ｍ+３σとする理由は、正規分布を仮定すれば、９９．７％の確率で異常を検知できるためである。このｍ+３σという時間は、前述したように一般論として設定され得る、（ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知するために）ＣＵ−ＦＷドライバ１０３においてタイムアウトとする制限時間と比較して極めて短い時間である。
【０１０８】
いま、ＣＵ２０からＮＭ３０までのコマンドの転送時間が０．５ｍｓ、上記平均時間ｍが１．０ｍｓ、上記標準偏差σが１．０、ＣＵ２０における割り込みの処理の所要時間が０．２ｍｓ（ＮＭ３０からＣＵ２０までの割り込み要求信号の転送時間０．５ｍｓを含めて合計０．７ｍｓとする）である場合を想定する。また、比較例として、（ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知するために）ＣＵ２０においてタイムアウトとする制限時間が１００ｍｓと設定されている場合を想定する。
【０１０９】
この場合、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理をＮＭ３０が検知するための制限時間は、上記ｍ+３σより、４．０ｍｓとなる。これは、ＣＵ２０から見ると、５．２ｍｓ（０．５ｍｓ+４．０ｍｓ+０．７ｍｓ）で、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知できることになる。すなわち、本実施形態のストレージシステム１は、比較例の１００ｍｓよりも極めて短い時間で、ＣＵ２０が、ＮＭ３０がコマンドを処理不能な状態であることを検知可能とする。
【０１１０】
また、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理を終了したことについても、従来、ＣＵ２０は、大凡の時間を仮定するしかなかったが、本実施形態のストレージシステム１では、ガベージコレクション処理の終了から、ブロックされていたコマンドの応答時間（１ｍｓ）+ＮＭ３０からＣＵ２０への通知時間（０．７ｍｓ）の１．７ｍｓで検知可能となる。
【０１１１】
なお、ＮＭ−ＦＷドライバ２０１が、稼働中、コマンドの種類ごとに、応答時間を測定し続けて、前述の平均時間ｍと標準偏差σとを適宜に算出し、タイムアウトとする制限時間（ｍ+３σ）を動的に更新するようにしてもよい。
【０１１２】
図１７は、ＮＭ３０（ＮＭ−ＦＷドライバ２０１）の動作の流れを示すフローチャートである。
【０１１３】
ＮＭ−ＦＷドライバ２０１は、ＣＵ２０により発行されたコマンドをコマンドキュー２０１Ａから取り出す（ステップＡ１）。ＮＭ−ＦＷドライバ２０１は、当該取り出したコマンドをＮＡＮＤ型フラッシュメモリ３２へ発行する（ステップＡ２）。
【０１１４】
ＮＭ−ＦＷドライバ２０１は、ＮＡＮＤ型フラッシュメモリ３２へコマンドを発行した後、予め定められた制限時間が経過していないかを監視する（ステップＡ３）。経過していない場合（ステップＡ３のＮＯ）、ＮＭ−ＦＷドライバ２０１は、続いて、発行したコマンドに対する応答（処理結果）がＮＡＮＤ型フラッシュメモリ３２から得られたか否かを調べる（ステップＡ４）。得られた場合（ステップＡ４のＹＥＳ）、ＮＭ−ＦＷドライバ２０１は、その応答（処理結果）をＣＵ２０へ転送する（ステップＡ５）。得られていない場合（ステップＡ４のＮＯ）、ＮＭ−ＦＷドライバ２０１は、ステップＡ３の処理へ戻る。
【０１１５】
発行したコマンドに対する応答（処理結果）がＮＡＮＤ型フラッシュメモリ３２から得られないまま、予め定められた制限時間が経過した場合（ステップＡ３のＹＥＳ）、ＮＭ−ＦＷドライバ２０１は、自ＮＭ３０のＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることをＣＵ２０へ転送する（ステップＡ６）。ＮＭ−ＦＷドライバ２０１は、発行したコマンドに対する応答（処理結果）がＮＡＮＤ型フラッシュメモリ３２から得られるのを待機し（ステップＡ７）、得られたら（ステップＡ７のＹＥＳ）、その応答（処理結果）をＣＵ２０へ転送するとともに、ガベージコレクション処理の終了をＣＵ２０へ転送する（ステップＡ８）。
【０１１６】
図１８は、ＣＵ２０（ＣＵ−ＦＷドライバ１０３）の動作の流れを示すフローチャートである。
【０１１７】
ＣＵ−ＦＷドライバ１０３は、ストレージ管理部１０２により発行されたコマンドをＮＭ３０へ発行する（ステップＢ１）。ＣＵ−ＦＷドライバ１０３は、発行したコマンドに対する応答（処理結果）がＮＭ３０から得られたか否かを調べる（ステップＢ２）。得られていない場合（ステップＢ２のＮＯ）、ＣＵ−ＦＷドライバ１０３は、続いて、コマンドを発行したＮＭ３０からＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることの通知を受けていないかを調べる（ステップＢ３）。受けていない場合（ステップＢ３のＮＯ）、ＣＵ−ＦＷドライバ１０３は、ステップＢ２の処理へ戻る。発行したコマンドに対する応答（処理結果）がＮＭ３０から得られた場合は（ステップＢ２のＹＥＳ）、ＣＵ−ＦＷドライバ１０３は、その応答（処理結果）をストレージ管理部１０２へ転送する（ステップＢ４）。
【０１１８】
ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることの通知を受けた場合（ステップＢ３のＹＥＳ）、ＣＵ−ＦＷドライバ１０３は、通知元のＮＭ３０へのコマンドの発行の保留、つまりコマンド退避領域１０３Ａへのコマンドの退避を開始する（ステップＢ５）。その後、ＣＵ−ＦＷドライバ１０３は、ガベージコレクション処理の終了の通知を受けていないかを調べ（ステップＢ６）、受けていたら（ステップＢ６のＹＥＳ）、通知元のＮＭ３０へのコマンドの退避を終了して、コマンド退避領域１０３Ａへ退避したコマンドを発行する（ステップＢ７）。また、この時、ＣＵ−ＦＷドライバ１０３は、ＮＭ３０から得た応答（処理結果）をストレージ管理部１０２へ転送する（ステップＢ４）。
【０１１９】
以上のように、本実施形態のストレージシステム１は、ＣＵ２０とＮＭ３０とが協働することにより、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクションを処理中のＮＭ３０に対するコマンドの発行を、ＣＵ２０において抑制・調停し、ストレージシステム１全体の性能の低下を解消することを実現する。
【０１２０】
なお、本実施形態では、ＮＭ３０からＣＵ２０へ割り込み要求信号を転送することにより、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることをＣＵ２０へ通知する例を説明した。この割り込み要求信号の転送に代えて、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることを検知したＮＭ３０が、その旨を示す情報を、たとえばＣＵ２０からＩ2Ｃバスなどのバス線経由でアクセス可能な内蔵レジスタへ格納することで、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることをＣＵ２０へ通知するようにしてもよい。この場合、ＣＵ２０は、ＮＭ３０の内蔵レジスタを巡回的にアクセスすることにより、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知する。
【０１２１】
また、本実施形態では、ＮＭ３０、より詳細には、ＮＭ−ＦＷドライバ２０１が、ＮＡＮＤ型フラッシュメモリ３２へコマンドを発行した際、そのコマンドに対する応答（処理結果）をｍ+３σを超えて得られなかった場合、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中であることを検知する例を説明した。タイムアウトとする制限時間の決め方として、前述のようにｍ+３σとすることは、ＣＵ２０が、ＮＭ３０からの通知によらず、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを検知する場合であって、たとえばＣＵ−ＦＷドライバ１０３がＮＭ３０へ発行したコマンドについてタイムアウトとする制限時間を設定する場合においても有効である。
【０１２２】
この場合、ＣＵ−ＦＷドライバ１０３がＮＭ３０へコマンドを発行してからそのコマンドに対する応答（処理結果）をＣＵ−ＦＷドライバ１０３がＮＭ３０から取得するまでの時間が測定され、平均値（平均時間ｍ）と標準偏差σとが算出される。
【０１２３】
また、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることを、ＣＵ−ＦＷドライバ１０３ではなく、アプリケーション部１０１またはストレージ管理部１０２で検知する場合であって、アプリケーション部１０１またはストレージ管理部１０２においてタイムアウトとする制限時間を設定する場合においても、タイムアウトとする制限時間の決め方として、前述のようにｍ+３σとすることは有効である。
【０１２４】
また、本実施形態では、ＮＡＮＤ型フラッシュメモリ３２がガベージコレクション処理中のためにＮＭ３０がコマンドを処理不能な状態であることをＮＭ３０からＣＵ２０へ通知する例を説明した。ＮＭ３０がコマンドを処理不能な状態となる要因としては、ＮＡＮＤ型フラッシュメモリ３２によるガベージコレクション処理のほか、たとえばデータの更新のためのロック取得待ちなども考えられ得る。このような要因でＮＭ３０がコマンドを処理不能な状態となっていることについても、前述したように、ＣＵ２０とＮＭ３０とが協働することにより、ＣＵ２０へ通知するようにしてもよい。
【０１２５】
本実施形態に記載された様々な機能の各々は、回路（処理回路）によって実現されてもよい。処理回路の例には、中央処理装置（ＣＰＵ）のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム（命令群）を実行することによって、記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。本実施形態に記載されたＣＰＵ以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
【０１２６】
また、本実施形態の各種処理はコンピュータプログラムによって実現することができるので、このコンピュータプログラムを格納したコンピュータ読み取り可能な記憶媒体を通じてこのコンピュータプログラムをコンピュータにインストールして実行するだけで、本実施形態と同様の効果を容易に実現することができる。
【０１２７】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１２８】
１…ストレージシステム、２…クライアント装置、１０…ネットワークスイッチ、２０…コネクションユニット（ＣＵ）、２１…ＣＰＵ、２２…ＲＡＭ、２３…ノードモジュールインターフェース（ＮＭ  Ｉ／Ｆ）、３０…ＮＭ、３１…ノードコントローラ（ＮＣ）、３２…ＮＡＮＤ型フラッシュメモリ、４０…データ記憶領域、１０１…アプリケーション部、１０２…ストレージ管理部、１０２Ａ…ＮＭ応答履歴、１０２Ｂ…退避情報、１０３…ＣＵ−ＦＷドライバ、１０３Ａ…コマンド退避領域、２０１…ＮＭ−ＦＷドライバ、２０１Ａ…コマンドキュー、３１１…ＣＰＵ、３１２…ＲＡＭ、３１３…Ｉ／Ｏコントローラ、３１４…ＮＡＮＤインタフェース、１０２１…ＩＯ分割部、１０２２…ＩＯ実行部、１０２３…ＧＣ検知部、１０２４…退避実行部。
【図１】
2018041153.tif 000003
【図２】
2018041153.tif 000004
【図３】
2018041153.tif 000005
【図４】
2018041153.tif 000006
【図５】
2018041153.tif 000007
【図６】
2018041153.tif 000008
【図７】
2018041153.tif 000009
【図８】
2018041153.tif 000010
【図９】
2018041153.tif 000011
【図１０】
2018041153.tif 000012
【図１１】
2018041153.tif 000013
【図１２】
2018041153.tif 000014
【図１３】
2018041153.tif 000015
【図１４】
2018041153.tif 000016
【図１５】
2018041153.tif 000017
【図１６】
2018041153.tif 000018
【図１７】
2018041153.tif 000019
【図１８】
2018041153.tif 000020