(57)【要約】  本発明の計算機システムは、サーバと、２つのコントローラを備えたストレージ装置とを有する。サーバは２つのコントローラに接続されており、ストレージ装置に対するＩ／Ｏ要求を２つのコントローラのいずれかに転送する機能を備えた振分モジュールを有する。  振分モジュールは、サーバのＭＰＵからＩ／Ｏ要求を受信すると、ストレージ装置に格納された振分テーブルからＩ／Ｏ要求の送信先情報を読み出して、読み出した送信先情報に基づいて、前記２つのコントローラのいずれにＩ／Ｏ要求を転送するかを決定し、決定されたコントローラに対してＩ／Ｏ要求を転送する。
2015079528.tif 000002
【特許請求の範囲】
【請求項１】
１以上のサーバと、ストレージ装置とを有する計算機システムであって、
前記ストレージ装置は、１以上の記憶媒体と、第１プロセッサ及び第１メモリを有する第１コントローラと、第２プロセッサ及び第２メモリを有する第２コントローラとを有し、第１コントローラと第２コントローラはいずれも前記サーバに接続されており、
前記サーバは、第３プロセッサと第３メモリと、前記第３プロセッサが発行する前記ストレージ装置に対するＩ／Ｏ要求を前記第１プロセッサまたは第２プロセッサのいずれかに送信する振分モジュールを有し、
前記振分モジュールは、
前記第３プロセッサが第１のＩ／Ｏ要求を発行すると、前記ストレージ装置が提供する振分情報に基づいて、前記第１プロセッサまたは前記第２プロセッサのいずれを前記第１のＩ／Ｏ要求の送信先にするか決定する処理を開始し、
前記第１のＩ／Ｏ要求の送信先が決定する前に、前記第３プロセッサから第２のＩ／Ｏ要求を受信すると、前記ストレージ装置が提供する振分情報に基づいて、前記第１プロセッサまたは前記第２プロセッサのいずれを前記第２のＩ／Ｏ要求の送信先にするか決定する処理を開始し、
前記第１のＩ／Ｏ要求の送信先が決定すると、前記決定された送信先に対して前記第１のＩ／Ｏ要求を送信し、
前記第１のＩ／Ｏ要求の送信先が決定するまでは、前記第２のＩ／Ｏ要求を前記送信先に送信しない、
ことを特徴とする、計算機システム。
【請求項２】
前記ストレージ装置は、前記第１メモリまたは前記第２メモリに、前記サーバのＩ／Ｏ要求の送信先についての情報を格納した振分テーブルを有し、
前記振分モジュールは、前記第３プロセッサからＩ／Ｏ要求を受信すると、前記振分テーブルに格納された前記情報を取得し、前記情報に基づいて前記第１プロセッサ、前記第２プロセッサのいずれを前記Ｉ／Ｏ要求の送信先にするか決定することを特徴とする、請求項１に記載の計算機システム。
【請求項３】
前記ストレージ装置は、前記１以上の記憶媒体で構成される複数のボリュームを前記サーバに提供し、
前記第３プロセッサから発行されるＩ／Ｏ要求には少なくとも、前記サーバに与えられた固有の識別子と、前記ストレージ装置が提供するボリュームの論理ユニット番号（ＬＵＮ）が含まれており、
前記振分テーブルには、前記ボリュームごとに、前記Ｉ／Ｏ要求の送信先についての情報が格納されている計算機システムであって、
前記振分モジュールは、
前記識別子及び前記識別子に対応付けられたインデックス番号との対応関係についての情報を格納した検索データテーブルを有し、
前記第３プロセッサから前記第１のＩ／Ｏ要求を受信すると、前記検索データテーブルを参照し、前記識別子が前記検索データテーブルに存在する場合には、前記識別子に基づいて前記インデックス番号を特定し、
前記特定したインデックス番号と前記第１のＩ／Ｏ要求に含まれるＬＵＮとに基づいて前記振分テーブル内の参照先アドレスを決定し、前記参照先アドレスで特定される前記第１メモリまたは第２メモリ上の領域に格納された情報を読み出すことによって、前記第１のＩ／Ｏ要求の送信先についての情報を取得し、
前記取得した情報に基づいて、前記第１プロセッサ、前記第２プロセッサのいずれを前記第１のＩ／Ｏ要求の送信先にするか決定することを特徴とする、
請求項２に記載の計算機システム。
【請求項４】
前記計算機システムでは、前記サーバの識別子に対応付けられたインデックス番号が前記検索データテーブルに存在しない場合の前記Ｉ／Ｏ要求の送信先の情報である、代表プロセッサ情報があらかじめ定義されており、
前記振分モジュールは、前記第３プロセッサから前記第２のＩ／Ｏ要求を受信すると、前記検索データテーブルを参照し、前記第２のＩ／Ｏ要求に含まれている前記識別子が前記検索データテーブルに存在しなかった場合、前記第１メモリまたは第２メモリ上の所定領域のデータの読み出しを実行した後、前記代表プロセッサ情報で特定される送信先に対して前記第２のＩ／Ｏ要求を送信することを特徴とする、
請求項３に記載の計算機システム。
【請求項５】
前記ストレージ装置は、前記第２のＩ／Ｏ要求に対する応答を前記サーバに返却した後、
前記識別子に対応付けられるべきインデックス番号を決定し、前記決定したインデックス番号を前記検索データテーブルに、前記識別子と対応付けて格納する
ことを特徴とする、請求項４に記載の計算機システム。
【請求項６】
前記ストレージ装置では、前記ボリュームに対するＩ／Ｏ要求の処理を担当するプロセッサが、前記ボリュームごとにあらかじめ定められており、
前記振分テーブルに格納されている、前記ボリュームごとの前記Ｉ／Ｏ要求の送信先についての情報は、前記各ボリュームに対するＩ／Ｏ要求を担当するプロセッサの情報である
ことを特徴とする、請求項３に記載の計算機システム。
【請求項７】
前記第１プロセッサ及び前記第２プロセッサは、それぞれ複数のプロセッサコアを有し、
前記振分モジュールは、前記第３プロセッサからＩ／Ｏ要求を受信すると、前記振分テーブルに格納された前記情報を取得し、前記情報に基づいて前記第１プロセッサまたは前記第２プロセッサの有する複数のプロセッサコアのうち、いずれのプロセッサコアを前記Ｉ／Ｏ要求の送信先にするか決定することを特徴とする、請求項２に記載の計算機システム。
【請求項８】
１以上のサーバと、ストレージ装置とを有する計算機システムの制御方法であって、
前記ストレージ装置は、１以上の記憶媒体と、第１プロセッサ及び第１メモリを有する第１コントローラと、第２プロセッサ及び第２メモリを有する第２コントローラとを有し、第１コントローラと第２コントローラはいずれも前記サーバに接続されており、
前記サーバは、第３プロセッサと第３メモリと、前記第３プロセッサが発行する前記ストレージ装置に対するＩ／Ｏ要求を前記第１プロセッサまたは第２プロセッサのいずれかに送信する振分モジュールを有し、
前記振分モジュールは、
前記第３プロセッサが第１のＩ／Ｏ要求を発行すると、前記ストレージ装置が提供する振分情報に基づいて、前記第１プロセッサまたは前記第２プロセッサのいずれを前記第１のＩ／Ｏ要求の送信先にするか決定する処理を開始し、
前記第１のＩ／Ｏ要求の送信先が決定する前に、前記第３プロセッサから第２のＩ／Ｏ要求を受信すると、前記ストレージ装置が提供する振分情報に基づいて、前記第１プロセッサまたは前記第２プロセッサのいずれを前記第２のＩ／Ｏ要求の送信先にするか決定する処理を開始し、
前記第１のＩ／Ｏ要求の送信先が決定すると、前記決定された送信先に対して前記第１のＩ／Ｏ要求を送信し、
前記第１のＩ／Ｏ要求の送信先が決定するまでは、前記第２のＩ／Ｏ要求を前記送信先に送信しない、
ことを特徴とする、計算機システムの制御方法。
【請求項９】
前記ストレージ装置は、前記第１メモリまたは前記第２メモリに、前記サーバのＩ／Ｏ要求の送信先についての情報を格納した振分テーブルを有し、
前記振分モジュールは、前記第３プロセッサからＩ／Ｏ要求を受信すると、前記振分テーブルに格納された前記情報を取得し、前記情報に基づいて前記第１プロセッサ、前記第２プロセッサのいずれを前記Ｉ／Ｏ要求の送信先にするか決定することを特徴とする、請求項８に記載の計算機システムの制御方法。
【請求項１０】
前記ストレージ装置は、前記１以上の記憶媒体で構成される複数のボリュームを前記サーバに提供するストレージ装置であって、
前記第３プロセッサから発行されるＩ／Ｏ要求には少なくとも、前記サーバに与えられた固有の識別子と、前記ストレージ装置が提供するボリュームの論理ユニット番号（ＬＵＮ）が含まれており、
前記振分テーブルには、前記ボリュームごとに、前記Ｉ／Ｏ要求の送信先についての情報が格納されており、
前記振分モジュールは、前記識別子及び前記識別子に対応付けられたインデックス番号との対応関係についての情報を格納した検索データテーブルを有しており、
前記振分モジュールは、
前記第３プロセッサから前記第１のＩ／Ｏ要求を受信すると、前記検索データテーブルを参照し、前記識別子が前記検索データテーブルに存在する場合には、前記識別子に基づいて前記インデックス番号を特定し、
前記特定したインデックス番号と前記第１のＩ／Ｏ要求に含まれるＬＵＮとに基づいて前記振分テーブル内の参照先アドレスを決定し、前記参照先アドレスで特定される前記第１メモリまたは第２メモリ上の領域に格納された情報を読み出すことによって、前記第１のＩ／Ｏ要求の送信先についての情報を取得し、
前記取得した情報に基づいて、前記第１プロセッサ、前記第２プロセッサのいずれを前記第１のＩ／Ｏ要求の送信先にするか決定する、
ことを特徴とする、請求項９に記載の計算機システムの制御方法。
【請求項１１】
前記計算機システムでは、前記サーバの識別子に対応付けられたインデックス番号が前記検索データテーブルに存在しない場合の前記Ｉ／Ｏ要求の送信先の情報である、代表プロセッサ情報があらかじめ定義されており、
前記振分モジュールは、前記第３プロセッサから前記第２のＩ／Ｏ要求を受信すると、前記検索データテーブルを参照し、前記第２のＩ／Ｏ要求に含まれている前記識別子が前記検索データテーブルに存在しなかった場合、前記第１メモリまたは第２メモリ上の所定領域のデータの読み出しを実行した後、前記代表プロセッサ情報で特定される送信先に対して前記第２のＩ／Ｏ要求を送信する、
ことを特徴とする、請求項１０に記載の計算機システムの制御方法。
【請求項１２】
前記ストレージ装置は、前記第２のＩ／Ｏ要求に対する応答を前記サーバに返却した後、
前記識別子に対応付けられるべきインデックス番号を決定し、前記決定したインデックス番号を前記検索データテーブルに、前記識別子と対応付けて格納する
ことを特徴とする、請求項１１に記載の計算機システムの制御方法。
【請求項１３】
前記ストレージ装置では、前記ボリュームに対するＩ／Ｏ要求の処理を担当するプロセッサが、前記ボリュームごとにあらかじめ定められており、
前記振分テーブルに格納されている、前記ボリュームごとの前記Ｉ／Ｏ要求の送信先についての情報は、前記各ボリュームに対するＩ／Ｏ要求を担当するプロセッサの情報である
ことを特徴とする、請求項１０に記載の計算機システムの制御方法。
【請求項１４】
前記第１プロセッサ及び前記第２プロセッサは、それぞれ複数のプロセッサコアを有し、
前記振分モジュールは、前記第３プロセッサからＩ／Ｏ要求を受信すると、前記振分テーブルに格納された前記情報を取得し、前記情報に基づいて前記第１プロセッサまたは前記第２プロセッサの有する複数のプロセッサコアのうち、いずれのプロセッサコアを前記Ｉ／Ｏ要求の送信先にするか決定することを特徴とする、請求項９に記載の計算機システムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ホスト計算機とストレージ装置で構成される計算機システムにおける、ホスト計算機のＩ／Ｏ要求の振分け方法に関する。
【背景技術】
【０００２】
ＩＴの進歩やインターネットの普及などにより、企業等における計算機システムが扱うデータ量は増加を続けており、データを格納するストレージ装置に対しても、高い性能が要求されている。そのため、中規模以上のストレージ装置（ストレージシステム）では、データアクセス要求を処理するストレージコントローラを複数搭載する構成をとるものが多い。【０００３】
一般に、ストレージコントローラ（以下、「コントローラ」と略記）を複数搭載するストレージ装置の場合、ストレージ装置の有する各ボリュームに対するアクセス要求の処理を担当するコントローラは、あらかじめ一意に決定されている。以下、複数のコントローラ（コントローラ１、コントローラ２）を有するストレージ装置において、あるボリュームＡに対するアクセス要求の処理を担当するコントローラが、コントローラ１であった場合、「コントローラ１はボリュームＡのオーナ権を持つ」と表現する。ストレージ装置に接続されるホスト計算機からボリュームＡに対するアクセス（たとえばリード要求）を、オーナ権を持たないコントローラが受信した場合、オーナ権を持たないコントローラは一旦、オーナ権を持つコントローラにアクセス要求を転送し、オーナ権を持つコントローラでアクセス要求の処理を行い、処理結果（たとえばリードデータ）を、オーナ権を持たないコントローラを経由してホスト計算機に返送するという処理が行われるため、オーバヘッドが大きい。性能低下の発生を回避するため、特許文献１ではオーナ権を有するコントローラに対してアクセス要求を割り振る専用ハードウェア(ＬＲ:ローカルルータ)を備えたストレージシステムについて開示している。特許文献１におけるストレージ装置では、ホストからボリュームアクセスコマンドを受領するホスト(チャネル)インタフェース(Ｉ／Ｆ)に備えられたＬＲは、オーナ権を有するコントローラを特定し、そのコントローラに対してコマンドを転送する。これにより複数のコントローラに適切に処理を割り振ることを可能としている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許出願公開第２０１２／０００５４３０号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示されているストレージ装置では、ストレージ装置のホストインタフェースに設けられた専用ハードウェア（ＬＲ）を設けることによって、オーナ権を有するコントローラに適切に処理を割り振ることを可能としている。しかしながら、専用ハードウェアを設けるためには、装置内に専用ハードウェアを搭載するための実装スペースを確保する必要があり、また装置の製造コストを押し上げることになる。そのため、専用ハードウェアを設ける構成は、装置規模が比較的大きい、大規模ストレージ装置に限られる。【０００６】
そのため、中小規模のストレージ装置で、上に挙げたような性能低下が発生する状況を回避するためには、ホスト計算機がストレージ装置にアクセス要求を発行する時点で、オーナ権を持つコントローラに対してアクセス要求を発行するようにしなければならないが、通常、どのコントローラがアクセス対象ボリュームのオーナ権を持つかは、ホスト計算機側は知ることができない。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明は、ホスト計算機とストレージ装置から構成される計算機システムにおいて、ホスト計算機がストレージ装置からオーナ権情報を取得し、ホスト計算機は取得したオーナ権情報に基づいてコマンド発行先のコントローラを決定する。【０００８】
本発明の一実施形態では、ホスト計算機がストレージ装置にボリュームアクセスコマンドを発行する際に、ホスト計算機はストレージ装置に対し、アクセス対象ボリュームのオーナ権を有するコントローラの情報を取得する要求を発行し、ホスト計算機は当該要求に応じてストレージ装置から返却されたオーナ権情報に基づいて、オーナ権を持つコントローラに対してコマンドを送信する。また別の実施形態として、ホスト計算機は、アクセス対象ボリュームのオーナ権を有するコントローラの情報を取得する第１要求を発行した後、第１要求に対する応答をストレージ装置から受信する前に、アクセス対象ボリュームのオーナ権を有するコントローラの情報を取得する第２要求を発行することを可能とする。
【発明の効果】
【０００９】
本発明により、ホスト計算機がオーナ権を持たないストレージコントローラに対してＩ／Ｏ要求を発行することを防ぐことができ、アクセス性能を向上させることができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施例１に係る計算機システムの構成図である。
【図２】論理ボリューム管理テーブルの一例を示した図である。
【図３】本発明の実施例１に係る計算機システムにおけるＩ／Ｏ処理の概要を示した図である。
【図４】振分テーブルのアドレスフォーマットを示した図である。
【図５】振分けテーブルの構成を示した図である。
【図６】検索データテーブルの内容を示した図である。
【図７】サーバの振分部の行う処理の詳細を示した図である。
【図８】代表ＭＰに対してＩ／Ｏコマンドが送信された場合の、ストレージ装置における処理の流れを示した図である。
【図９】振分モジュールが複数のＩ／Ｏコマンドを受け付けた場合の処理の流れを示した図である。
【図１０】コントローラの１つが停止した場合に、ストレージ装置が行う処理の流れを示した図である。
【図１１】インデックステーブルの内容を示した図である。
【図１２】本発明の実施例２に係る計算機システムの各構成要素を表した図である。
【図１３】本発明の実施例２に係るサーバブレード及びストレージコントローラモジュールの構成図である。
【図１４】本発明の実施例２に係るストレージコントローラモジュールの有するコマンドキューの概念図である。
【図１５】本発明の実施例２に係る計算機システムにおけるＩ／Ｏ処理の概要を示した図である。
【図１６】本発明の実施例２に係る計算機システムにおけるＩ／Ｏ処理の概要を示した図である。
【図１７】本発明の実施例２に係るストレージコントローラモジュールの代表ＭＰに対してＩ／Ｏコマンドが送信された場合の処理の流れを示した図である。
【図１８】本発明の実施例２に係る計算機システムの実装例（前面図）である。
【図１９】本発明の実施例２に係る計算機システムの実装例（背面図）である。
【図２０】本発明の実施例２に係る計算機システムの実装例（側面図）である。
【発明を実施するための形態】
【００１１】
以下、図面を参照して、本発明の一実施形態に係る計算機システムを説明する。なお、本発明は、以下に説明する実施形態に限定されるものではない。
【実施例１】
【００１２】
図１は、本発明の実施例１に係る計算機システム１の構成を示す。計算機システム１は、ストレージ装置２、サーバ３、管理端末４から構成される。ストレージ装置２は、Ｉ／Ｏバス７を介してサーバ３と接続される。Ｉ／Ｏバスとしてはたとえば、ＰＣＩ−Ｅｘｐｒｅｓｓが用いられる。またストレージ装置２はＬＡＮ６を介して管理端末４と接続される。【００１３】
ストレージ装置２は、複数のストレージコントローラ２１ａ、２１ｂ（図中では「ＣＴＬ」と略記されている。また、ストレージコントローラを「コントローラ」と略記することもある）、そしてデータを格納する記憶媒体である複数のＨＤＤ２２から構成される（なお、ストレージコントローラ２１ａ、２１ｂを総称して、「コントローラ２１」と呼ぶこともある）。コントローラ２１ａは、当該ストレージ装置２の制御を行うためのＭＰＵ２３ａ、ＭＰＵ２３ａで実行されるプログラムや制御情報を格納するメモリ２４ａ、ＨＤＤ２２を接続するためのディスクインタフェース（ディスクＩ／Ｆ）２５ａ、サーバ３とＩ／Ｏバスを介して接続するためのコネクタであるポート２６ａを備える（また、コントローラ２１ｂもコントローラ２１ａと同様の構成要素を持つのでコントローラ２１ｂについての説明は省略する）。なお、メモリ２４ａ、２４ｂの一部の領域は、ディスクキャッシュとしても用いられる。そしてコントローラ２１ａ、２１ｂは、コントローラ間接続パス（Ｉパス）２７で相互接続される。また、図示していないが、コントローラ２１ａ、２１ｂは、ストレージ管理端末２３を接続するためのＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃｏｎｔｒｏｌｌｅｒ）も有している。ＨＤＤ２２は、一例として磁気ディスクが用いられる。しかしそれ以外にＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の半導体記憶デバイスを用いることも可能である。【００１４】
なお、ストレージ装置２の構成は上で説明した構成に限定されるものではない。たとえばコントローラ２１内の各要素（ＭＰＵ２３、ディスクＩ／Ｆ２５等）は、図１に示した個数の構成に限定されるわけではなく、ＭＰＵ２３やディスクＩ／Ｆ２５がコントローラ２１内に複数存在する構成であっても、本発明は適用可能である。【００１５】
サーバ３は、ＭＰＵ３１、メモリ３２、振分モジュール３３が、相互接続スイッチ３４（図中では「ＳＷ」と略記している）に接続された構成をとる。またＭＰＵ３１、メモリ３２、振分モジュール３３と相互接続スイッチ３４との間は、ＰＣＩ−ＥｘｐｒｅｓｓのようなＩ／Ｏバスで接続されている。振分モジュール３３は、ＭＰＵ３１からストレージ装置２に向けて送出されるコマンド（リード、ライト等のＩ／Ｏ要求）を、ストレージ装置２のコントローラ２１ａ、２１ｂのいずれかに、選択的に転送するための制御を行うハードウェアであって、振分部３５、ＳＷ３４に接続されるポート、ストレージ装置２に接続するためのポート３７ａ、３７ｂを備える。また、サーバ３上では、複数の仮想計算機が稼働する構成であってもよい。さらに、図１では、サーバ３が１台だけ存在しているが、サーバ３の台数は１台に限定されず、複数台存在してもよい。【００１６】
管理端末４は、ストレージ装置２の管理操作を行うための端末である。図示していないが、管理端末４は周知のパーソナルコンピュータが備えている、ＭＰＵ、メモリ、ＬＡＮ６に接続するためのＮＩＣ、キーボードやディスプレイ等の入出力部２３４を有する。管理操作とは具体的には、サーバ３３等に提供するボリュームを定義する等の操作である。【００１７】
続いて、本発明の実施例１におけるＩ／Ｏ振分方法の説明に必要な、ストレージ装置２の機能について説明する。最初にストレージ装置２内に作成されるボリュームと、ボリュームを管理するためにストレージ装置２内で用いられる管理情報について説明する。【００１８】
（論理ボリューム管理テーブル）
本発明の実施例１におけるストレージ装置２は、１または複数のＨＤＤ２２から１つまたは複数の論理ボリューム（ＬＤＥＶとも呼ばれる）を形成する。各論理ボリュームにはストレージ装置２内で一意な番号を付与して管理しており、それを論理ボリューム番号（ＬＤＥＶ＃）と呼ぶ。また、サーバ３がＩ／Ｏコマンドの発行時などにアクセス対象のボリュームを指定する場合、計算機システム１内でサーバ３を一意に特定可能な情報（あるいはサーバ３内で仮想計算機が動作する環境の場合には、仮想計算機を一意に特定可能な情報）であるＳ＿ＩＤと、論理ユニット番号（ＬＵＮ）とを用いる。つまりサーバ３は、Ｉ／ＯコマンドのコマンドパラメータにＳ＿ＩＤとＬＵＮとを含めることによって、アクセス対象のボリュームを一意に特定するのであって、サーバ３はボリュームを指定する際に、ストレージ装置２で用いられるＬＤＥＶ＃を用いない。そのためストレージ装置２では、ＬＤＥＶ＃とＬＵＮとの対応関係を管理する情報（論理ボリューム管理テーブル２００）を保持し、その情報を用いて、サーバ３からＩ／Ｏコマンドで指定されたＳ＿ＩＤとＬＵＮの組の情報をＬＤＥＶ＃に変換している。図２に示す論理ボリューム管理テーブル２００（または「ＬＤＥＶ管理テーブル２００」とも呼ばれる）は、ＬＤＥＶ＃とＬＵＮの対応関係を管理するテーブルで、コントローラ２１ａ、２１ｂ内のそれぞれのメモリ２４ａ、２４ｂに同じテーブルが格納されている。Ｓ＿ＩＤ２００−１とＬＵＮ２００−２の欄には、ＬＤＥＶ＃２００−４で特定される論理ボリュームに対応付けられている、サーバ３のＳ＿ＩＤ、ＬＵＮが格納される。ＭＰ＃２００−４は、オーナ権という情報を格納する欄で、オーナ権については以下で説明する。【００１９】
本発明の実施例１におけるストレージ装置２では、各論理ボリュームに対するアクセス要求の処理を担当するコントローラ（２１ａ、２１ｂ）（またはプロセッサ２３ａ、２３ｂ）が、論理ボリュームごとに一意に定められている。この、論理ボリュームに対する要求の処理を担当するコントローラ（２１ａ、２１ｂ）（またはプロセッサ２３ａ、２３ｂ）のことを、「オーナ権を持つコントローラ（またはプロセッサ）」と呼び、オーナ権を持つコントローラ（またはプロセッサ）の情報のことを、「オーナ権情報」と呼ぶ。ＭＰ＃２００−４はオーナ権情報を格納する欄で、本発明の実施例１において、ＭＰ＃２００−４の欄に０が格納されているエントリの論理ボリュームは、コントローラ２１ａのＭＰＵ２３ａがオーナ権を持つボリュームで、ＭＰ＃２００−４の欄に１が格納されているエントリの論理ボリュームは、コントローラ２１ｂのＭＰＵ２３ｂがオーナ権を持つボリュームであることを表している。たとえば図２の先頭の行（エントリ）２０１は、ＬＤＥＶ＃が１番の論理ボリュームは、ＭＰ＃２００−４が０番のコントローラ（のプロセッサ）、つまりコントローラ２１ａのＭＰＵ２３ａがオーナ権を持つことを表している。なお、本発明の実施例１におけるストレージ装置２では、各コントローラ（２１ａ、２１ｂ）はそれぞれ１つのプロセッサ（２３ａ、２３ｂ）しか持たないので、「コントローラ２１ａがオーナ権を持つ」という表現と「プロセッサ（ＭＰＵ）２３ａがオーナ権を持つ」という表現は、実質的に同義である。【００２０】
ここで仮に、サーバ３からコントローラ２１に対して、コントローラ２１がオーナ権を持たないボリュームへのアクセスリクエストが到来した場合について説明する。図２の例では、ＬＤＥＶ＃が１番の論理ボリュームは、コントローラ２１ａがオーナ権を持つが、コントローラ２１ｂがサーバ３から、ＬＤＥＶ＃が１番の論理ボリュームに対するリード要求を受信すると、コントローラ２１ｂはオーナ権を持たないため、コントローラ２１ｂのＭＰＵ２３ｂは、コントローラ間接続パス（Ｉパス）２７を介してコントローラ２１ａのＭＰＵ２３ａにリード要求を転送する。ＭＰＵ２３ａはＨＤＤ２２からリードデータを読み出して、自身のキャッシュメモリ（メモリ２４ｂ内）にリードデータを格納する。その後、リードデータは、コントローラ間接続パス（Ｉパス）２７、コントローラ２１ａを経由してサーバ３に返送される。このように、ボリュームに対するオーナ権を持たないコントローラ２１がＩ／Ｏ要求を受け付けると、Ｉ／Ｏ要求やＩ／Ｏ要求に付随するデータの転送がコントローラ２１ａ、２１ｂ間で発生し、処理オーバヘッドが大きくなる。本発明では、このような処理オーバヘッドを発生させないために、ストレージ装置２がサーバ３に、各ボリュームのオーナ権情報を提供する仕組みを持つ。以下、サーバ３の機能について説明する。【００２１】
（Ｉ／Ｏ処理の概要）
図３は、サーバ３がストレージ装置２に対してＩ／Ｏ要求を送信する際の処理の概要を示している。まずＳ１は、計算機システム１の起動後の初期設定時のみ行われる処理で、ストレージコントローラ２１ａまたは２１ｂが振分テーブル２４１ａ、２４１ｂを生成し、そして振分テーブルのリード先情報と振分テーブルベースアドレス情報とをサーバ３の振分モジュール３３に通知する。振分テーブル２４１は、オーナ権情報を格納したテーブルであり、その内容は後述する。また、Ｓ１での振分テーブル２４１ａ（または２４１ｂ）の生成処理は、振分テーブル２４１を格納する記憶領域をメモリ上に確保し、内容を初期化（たとえばテーブル上全領域に０を書き込む等）する処理である。【００２２】
また本発明の実施例１では、振分テーブル２４１ａ、２４１ｂはコントローラ２１ａ、２１ｂのいずれか一方のメモリ２４に格納されるが、振分テーブルのリード先情報は、振分モジュール３３が振分テーブルにアクセスするにはいずれのコントローラのメモリ２４にアクセスすべきかを示した情報である。そして振分テーブルベースアドレス情報は振分モジュール３３が振分テーブル２４１にアクセスする際に必要な情報だが、これも詳細は後述する。振分モジュール３３はリード先情報を受信すると、リード先情報と振分テーブルベースアドレス情報を振分モジュール３３内に格納しておく（Ｓ２）。ただし、メモリ２４ａ、２４ｂの両方に同内容の振分テーブル２４１を格納する構成であっても、本発明は有効である。【００２３】
Ｓ２の処理が終了した後、サーバ３がストレージ装置２のボリュームにアクセスする処理が発生した場合を想定する。その場合、Ｓ３でＭＰＵ３１はＩ／Ｏコマンドを生成する。先に述べたとおりＩ／Ｏコマンドには、送信元サーバ３の情報であるＳ＿ＩＤとボリュームのＬＵＮが含まれている。【００２４】
振分モジュール３３はＭＰＵ３１からＩ／Ｏコマンドを受信すると、Ｉ／Ｏコマンド内のＳ＿ＩＤとＬＵＮを抽出し、Ｓ＿ＩＤとＬＵＮを用いて振分テーブル２４１のアクセスアドレス算出を行う（Ｓ４）。この処理の詳細は後述する。なお、振分モジュール３３はストレージ装置２のメモリ２４１に対し、アドレスを指定したアクセス要求を発行することで、当該アドレスのデータを参照可能な構成になっており、Ｓ６では、Ｓ４にて算出したアドレスを用いて、コントローラ２１の振分テーブル２４１にアクセスする。この時、Ｓ２で記憶したテーブルリード先情報に基づいて、コントローラ２１ａ、２１ｂのいずれかにアクセスする（図３では、振分テーブル２４１ａにアクセスする場合について記述している）。振分テーブル２４１にアクセスすると、コントローラ２１ａ、２１ｂのいずれがアクセス対象ボリュームのオーナ権を持つか判明する。【００２５】
Ｓ７では、Ｓ６で取得した情報に基づき、コントローラ２１ａ、コントローラ２１ｂのいずれかに、（Ｓ３で受信した）Ｉ／Ｏコマンドを転送する。なお、図３では、コントローラ２１ｂがオーナ権を持っていた場合の例を記載している。Ｉ／Ｏコマンドを受信したコントローラ２１（２１ｂ）は、コントローラ２１内で処理を行って、その応答をサーバ３（のＭＰＵ３１）に返却し（Ｓ８）、Ｉ／Ｏ処理が終了する。以降、Ｉ／ＯコマンドがＭＰＵ３１から発行されるたびにＳ３〜Ｓ８の処理が行われる。【００２６】
（振分テーブル、インデックステーブル）
続いて、図３のＳ４で振分モジュール３３が算出する振分テーブル２４１のアクセスアドレス及び振分テーブル２４１の内容について図４、図５を用いて説明する。ストレージコントローラ２１のメモリ２４は、６４ビットのアドレス空間を持つ記憶領域で、振分テーブル２４１はメモリ２４内の連続領域に格納されている。図４は、振分モジュール３３が算出する振分テーブル２４１内アドレス情報のフォーマットを示している。このアドレス情報は、４２ビットの振分テーブルベースアドレス、８ビットのＩｎｄｅｘ、１２ビットのＬＵＮ、そして２ビットの固定値（値は００）で構成される。振分テーブルベースアドレスは、図３のＳ２で振分モジュール３３がコントローラ２１から受信する情報である。【００２７】
Ｉｎｄｅｘ４０２は、Ｉ／Ｏコマンドに含まれるサーバ３の情報（Ｓ＿ＩＤ）をもとに、ストレージ装置２が導出する８ビットの情報であり、導出方法は後述する（なお、以下ではこのサーバ３のＳ＿ＩＤから導出される情報のことを、「Ｉｎｄｅｘ番号」と呼ぶ）。また、コントローラ２１ａ、２１ｂは、Ｓ＿ＩＤとＩｎｄｅｘ番号の対応関係の情報を、図１１に示すようなインデックステーブル６００として維持管理している（この情報の生成契機、生成方法についても後述する）。ＬＵＮ４０３はＩ／Ｏコマンドに含まれるアクセス対象ＬＵ（ボリューム）の論理ユニット番号（ＬＵＮ）である。サーバ３の振分モジュール３３は図３のＳ４の処理において、図４のフォーマットに従ったアドレスを生成する。たとえば振分テーブルベースアドレスが０で、Ｉｎｄｅｘ番号が０のサーバ３がＬＵＮ＝１のＬＵのオーナ権情報を取得したい場合、振分モジュール３３はアドレス０ｘ００００  ００００  ００００  ０００４を生成し、メモリ２４のアドレス０ｘ００００  ００００  ００００  ０００４の内容を読み出すことで、オーナ権情報を取得する。【００２８】
次に振分テーブル２４１の内容について、図５を用いて説明する。振分テーブル２４１の各エントリ（行）は、サーバ３のアクセスする各ＬＵのオーナ権情報及びＬＤＥＶ＃が格納された情報であり、各エントリは、イネーブルビット（図中では「Ｅｎ」と表記）５０１、オーナ権を持つコントローラ２１の番号が格納されるＭＰ＃５０２、サーバ３のアクセスするＬＵのＬＤＥＶ＃が格納されるＬＤＥＶ＃５０３で構成されている。Ｅｎ５０１は１ビット、ＭＰ＃５０２は７ビット、そしてＬＤＥＶ＃は２４ビットの情報で、１エントリは合計３２ビット（４バイト）の情報である。Ｅｎ５０１は、当該エントリが有効なエントリであるか否かを表す情報で、Ｅｎ５０１の値が１の場合には当該エントリが有効であることを表し、０の場合、当該エントリは無効（つまり当該エントリに対応するＬＵは、現時点でストレージ装置２内に定義されていない）であることを表し、その場合にＭＰ＃５０２、ＬＤＥＶ＃５０３に格納されている情報は無効な（使用できない）情報である。【００２９】
振分テーブル２４１の各エントリのアドレスについて説明する。なお、ここでは振分テーブルベースアドレスが０の場合について説明する。振分テーブル２４１のアドレス０（０ｘ００００  ００００  ００００  ００００）から始まる４バイトの領域には、図５から分かる通り、Ｉｎｄｅｘ番号が０のサーバ３（あるいはサーバ３上で稼動する仮想計算機）がアクセスする、ＬＵＮが０番のＬＵについてのオーナ権情報（及びＬＤＥＶ＃）が格納される。以下、アドレス０ｘ００００  ００００  ００００  ０００４〜０ｘ００００  ００００  ００００  ０００７、０ｘ００００  ００００  ００００  ０００８〜０ｘ００００  ００００  ００００  ０００Ｆにはそれぞれ、ＬＵＮが１番のＬＵ、ＬＵＮが２番のＬＵについてのオーナ権情報が格納される。そしてＩｎｄｅｘ番号が０のサーバ３がアクセスする全ＬＵのオーナ権情報は、アドレス０ｘ００００  ００００  ００００  ００００から０ｘ００００  ００００  ３ＦＦＦ  ＦＦＦＦまでの範囲に格納されている。そしてアドレス０ｘ００００  ００００  ４０００  ００００からは、Ｉｎｄｅｘ番号が１のサーバ３がアクセスするＬＵのオーナ権情報が、ＬＵＮ＝０のＬＵから順に格納されるという構造を持つ。【００３０】
（検索データテーブル）
次に、サーバ３の振分部３５の行う処理（図３のＳ４、Ｓ６に相当する処理）の詳細を説明するが、その前に振分部３５が自身のメモリ内に保持する情報について図６を用いて説明する。振分部３５がＩ／Ｏ振分け処理を行うために必要な情報として、検索データテーブル３０１０、振分けテーブルベースアドレス情報３１１０、振分けテーブルリード先ＣＴＬ＃情報３１２０がある。検索データテーブル３０１０のＩｎｄｅｘ＃３０１１には、Ｓ＿ＩＤ３０１２の欄に格納されているＳ＿ＩＤに対応するＩｎｄｅｘ番号が格納されており、サーバ３からＩ／Ｏコマンドを受信すると、この検索データテーブル３０１０を用いてＩ／Ｏコマンド中のＳ＿ＩＤからＩｎｄｅｘ番号を導出する。ただし、図６の検索データテーブル３０１０の構成は一例であり、図６で示した構成以外に、たとえばＳ＿ＩＤ３０１２の欄のみを有するテーブルで、Ｉｎｄｅｘ番号が０番、１番、２番…のＳ＿ＩＤが、Ｓ＿ＩＤ３０１２欄の先頭から順に格納されるテーブルなどを用いても、本発明は有効である。【００３１】
なお、初期状態では検索データテーブル３０１０のＳ＿ＩＤ３０１２の列には値が何も格納されておらず、サーバ３（あるいはサーバ３上で稼動する仮想計算機）がストレージ装置２に対して最初にＩ／Ｏコマンドを発行すると、そのときにストレージ装置２が検索データテーブル３０１０のＳ＿ＩＤ３０１２に情報を格納する。この処理は後述する。【００３２】
振分けテーブルベースアドレス情報３１１０は、先に説明した振分けテーブル２４１の格納アドレス算出時に用いる、振分けテーブルベースアドレスの情報である。計算機システム１の起動直後に、ストレージ装置２から振分部３５に対してこの情報が送信されてくるので、それを受け取った振分部３５が自身のメモリ内にこの情報を格納し、以降振分けテーブル２４１のアクセス先アドレスの算出の際にこの情報を用いる。振分けテーブルリード先ＣＴＬ＃情報３１２０は振分部３５が振分けテーブル２４１にアクセスする際、コントローラ２１ａ、２１ｂのいずれにアクセスするべきかを特定する情報である。振分けテーブルリード先ＣＴＬ＃情報３１２０の内容が「０」の時には、振分部３５はコントローラ２１ａのメモリ２４１ａにアクセスし、振分けテーブルリード先ＣＴＬ＃情報３１２０の内容が「１」の時には、コントローラ２１ｂのメモリ２４１ｂにアクセスする。振分けテーブルリード先ＣＴＬ＃情報３１２０も振分けテーブルベースアドレス情報３１１０と同様に、計算機システム１が起動直後に、ストレージ装置２から振分部３５に対して送信されてくる情報である。【００３３】
（振分処理）
図７を用いて、サーバ３の振分部３５の行う処理（図３のＳ４、Ｓ６に相当する処理）の詳細を説明する。振分部３５がポート３６を介してＭＰＵ３１からＩ／Ｏコマンドを受信すると、Ｉ／Ｏコマンドに含まれるサーバ３（あるいはサーバ３上の仮想計算機）のＳ＿ＩＤ、アクセス対象ＬＵのＬＵＮを抽出する（Ｓ４１）。振分部３５は続いて、抽出されたＳ＿ＩＤをＩｎｄｅｘ番号に変換する処理を行う。この時、振分部３５内で管理する検索データテーブル３０１０を用いる。振分部３５は検索データテーブル３０１０のＳ＿ＩＤ３０１２を参照して、Ｓ４１で抽出したＳ＿ＩＤと一致する行（エントリ）を検索する。【００３４】
Ｓ４１で抽出したＳ＿ＩＤと一致する行のＩｎｄｅｘ＃３０１１が見つかった場合（Ｓ４３：Ｙｅｓ）、そのＩｎｄｅｘ＃３０１１の内容を用いて振分テーブルアクセスアドレスを作成し（Ｓ４４）、この作成されたアドレスを用いて振分テーブル２４１にアクセスして、Ｉ／Ｏ要求を送信すべきコントローラ２１の情報（図５のＭＰ＃５０２に格納されている情報）を得る（Ｓ６）。そしてＳ６で得られた情報から特定されたコントローラ２１に対して、Ｉ／Ｏコマンドを送信する（Ｓ７）。【００３５】
ところで検索データテーブル３０１０のＳ＿ＩＤ３０１２には、最初は何も値が格納されていない。サーバ３（あるいはサーバ３上で稼動する仮想計算機）が最初にストレージ装置２にアクセスした時、ストレージ装置２のＭＰＵ２３がＩｎｄｅｘ番号を決定し、サーバ３（またはサーバ３上の仮想計算機）のＳ＿ＩＤを、検索データテーブル３０１０内の、決定されたＩｎｄｅｘ番号に対応する行に格納する。そのため、サーバ３（またはサーバ３上の仮想計算機）が最初にストレージ装置２にＩ／Ｏ要求を発行する時には、検索データテーブル３０１０のＳ＿ＩＤ３０１２には、サーバ３（またはサーバ３上の仮想計算機）のＳ＿ＩＤの情報が格納されていないため、Ｉｎｄｅｘ番号の検索は失敗する。【００３６】
本発明の実施例１における計算機システム１では、Ｉｎｄｅｘ番号の検索が失敗した場合、つまり検索データテーブル３０１０にサーバ３のＳ＿ＩＤの情報が格納されていなかった場合には、あらかじめ定められた特定のコントローラ２１のＭＰＵ（以下、このＭＰＵのことを「代表ＭＰ」と呼ぶ）に対してＩ／Ｏコマンドを送信することになっている。ただしＩｎｄｅｘ番号の検索が失敗した場合（Ｓ４３の判定で、Ｎｏの場合）、振分部３５はダミーアドレスを生成し（Ｓ４５）、ダミーアドレスを指定してメモリ２４にアクセス（たとえばリード）する（Ｓ６’）。ダミーアドレスとは、振分テーブル２４１の格納されているアドレスとは無関係のアドレスである。Ｓ６’の後、振分部３５は代表ＭＰにＩ／Ｏコマンドを送信する（Ｓ７’）。なお、ダミーアドレスを指定してメモリ２４にアクセスする処理を行う理由は後述する。【００３７】
（振分テーブルの更新）
続いて、Ｉｎｄｅｘ番号の検索が失敗した場合に（Ｓ４３の判定で、Ｎｏの場合）、代表ＭＰに対して送信されたＩ／Ｏコマンドを受信した、ストレージ装置２での処理の流れを、図８を用いて説明する。代表ＭＰ（ここでは、コントローラ２１ａのＭＰＵ２３ａが代表ＭＰだった場合を例にとって説明する）がＩ／Ｏコマンドを受信すると、コントローラ２１ａは、Ｉ／Ｏコマンドに含まれているＳ＿ＩＤとＬＵＮ、及びＬＤＥＶ管理テーブル２００を参照して、自身がアクセス対象のＬＵのオーナ権を持っているか判定する（Ｓ１１）。オーナ権がある場合は、以降の処理をコントローラ２１ａで実施し、オーナ権がない場合には、コントローラ２１ｂにＩ／Ｏコマンドを転送する。以降の処理はコントローラ２１ａ、２１ｂのいずれか一方で行われ、かつコントローラ２１ａ、２１ｂのいずれで処理が行われたとしても、処理に大きな違いはないため、「コントローラ２１」が処理を行うこととして記載している。【００３８】
Ｓ１２では、コントローラ２１は受信したＩ／Ｏ要求を処理し、処理結果をサーバ３に返送する。【００３９】
Ｓ１３では、コントローラ２１はＳ１２までで処理していたＩ／Ｏコマンドに含まれていたＳ＿ＩＤを、Ｉｎｄｅｘ番号に対応付ける処理を行う。対応付けの際、コントローラ２１はインデックステーブル６００を参照し、まだどのＳ＿ＩＤにも対応付けられていないＩｎｄｅｘ番号を検索し、いずれか１つのＩｎｄｅｘ番号を選択する。そして選択されたインデックス番号（Ｉｎｄｅｘ＃６０２）に対応する行のＳ＿ＩＤ６０１欄に、Ｉ／Ｏコマンドに含まれていたＳ＿ＩＤを登録する。【００４０】
Ｓ１４で、コントローラ２１は振分けテーブル２４１の更新を行う。ＬＤＥＶ管理テーブル２００内の情報のうち、Ｓ＿ＩＤ（２００−１）が今回のＩ／Ｏコマンドに含まれていたＳ＿ＩＤと一致するエントリを選択し、この選択されたエントリの情報を振分けテーブル２４１へと登録する。【００４１】
振分けテーブル２４１への登録方法について、たとえば今回のＩ／Ｏコマンドに含まれていたＳ＿ＩＤがＡＡＡで、ＬＤＥＶ管理テーブル２００には図２に示されている情報が格納されていた場合を例にとって説明する。この場合、ＬＤＥＶ管理テーブル２００から、ＬＤＥＶ＃（２００−３）が１、２、３のエントリ（図２中の行２０１〜２０３）を選択し、これら３エントリの情報を振分けテーブル２４１へと登録する。【００４２】
振分けテーブル２４１には、図５の説明で述べたような規則で各情報が格納されているため、Ｉｎｄｅｘ番号とＬＵＮの情報があれば、オーナ権（ＭＰ＃５０２に格納する情報）とＬＤＥＶ＃（ＬＤＥＶ＃５０３に格納する情報）を、振分テーブル２４１内のどの位置（アドレス）に登録すればよいか判明する。今回のＩ／Ｏコマンドに含まれていたＳ＿ＩＤ（ＡＡＡ）がＩｎｄｅｘ番号０１ｈに対応付けられたとすると、Ｉｎｄｅｘ番号が１、そしてＬＵＮが０のＬＤＥＶについての情報は、図５の振分テーブル２４１のアドレス０ｘ００００  ００００  ４０００  ００００から開始される４バイトの領域に格納されることが分かる。そこで、振分テーブル２４１のアドレス０ｘ００００  ００００  ４０００  ００００のエントリのＭＰ＃５０２、ＬＤＥＶ＃５０３のそれぞれに、ＬＤＥＶ管理テーブル２００の行２０１中のＭＰ＃２００−４（図２の例では「０」）、ＬＤＥＶ＃２００−３（図２の例では「１」）を格納し、またＥｎ５０１に「１」を格納する。図２の行２０２、２０３の情報についても同様に、振分テーブル２４１（のアドレス０ｘ００００  ００００  ４０００  ０００４、０ｘ００００  ００００  ４０００  ０００８）に格納することで、振分けテーブル２４１の更新が完了する。【００４３】
最後にＳ１５で、Ｓ１３でＳ＿ＩＤに対して対応付けられたＩｎｄｅｘ番号の情報を振分モジュール３３の検索データテーブル３０１０に書き込む。なお、Ｓ１４、Ｓ１５の処理は、図３のＳ１、Ｓ２の処理に相当する処理である。【００４４】
（ＬＵ生成時の処理）
振分テーブル２４１は、オーナ権、ＬＵ、ＬＤＥＶに関する情報を格納しているテーブルであるため、ＬＵが生成された場合やオーナ権に変更が発生する場合にも、情報の登録・更新が発生する。ここではＬＵを生成した場合を例にとって、振分テーブル２４１への情報登録の流れを説明する。【００４５】
計算機システム１の管理者が管理端末４などを用いて、ＬＵの定義を行う場合、サーバ３の情報（Ｓ＿ＩＤ）、定義するＬＵに対応付けられるＬＤＥＶのＬＤＥＶ＃、そして定義するＬＵのＬＵＮを指定する。管理端末４がこれらの情報の指定を受け付けると、ストレージコントローラ２１（２１ａまたは２１ｂ）に対してＬＵの生成を指示する。コントローラ２１は指示を受け付けると、メモリ２４ａ及び２４ｂ内のＬＤＥＶ管理テーブル２００のＳ＿ＩＤ２００−１、ＬＵＮ２００−２、ＬＤＥＶ＃２００−３の欄に、指定された情報を登録する。その際、当該ボリュームのオーナ権情報をコントローラ２１で自動決定して、ＭＰ＃２００−４に登録する。別の実施形態として、管理者がオーナ権を持つコントローラ２１（ＭＰＵ２３）を指定できるようにしてもよい。【００４６】
ＬＵ定義作業によりＬＤＥＶ管理テーブル２００への登録を行った後、コントローラ２１は振分テーブル２４１の更新を行う。ＬＵの定義で使用された情報（Ｓ＿ＩＤ、ＬＵＮ、ＬＤＥＶ＃、オーナ権情報）のうち、インデックステーブル６００を用いてＳ＿ＩＤをＩｎｄｅｘ番号に変換する。上で説明したとおり、Ｉｎｄｅｘ番号とＬＵＮの情報があれば、オーナ権（ＭＰ＃５０２に格納する情報）とＬＤＥＶ＃（ＬＤＥＶ＃５０３に格納する情報）を、振分テーブル２４１内のどの位置（アドレス）に登録すればよいか判明する。たとえばＳ＿ＩＤをＩｎｄｅｘ番号に変換した結果、Ｉｎｄｅｘ番号が０、そして定義したＬＵのＬＵＮが１だったとすると、図５の振分テーブル２４１のアドレス０ｘ００００  ００００  ００００  ０００４の情報を更新すればよいことが分かる。そこで、振分テーブル２４１のアドレス０ｘ００００  ００００  ００００  ０００４のエントリのＭＰ＃５０２、ＬＤＥＶ＃５０３に、今回定義したＬＵに対応付けられたオーナ権情報、ＬＤＥＶ＃を格納し、またＥｎ５０１に「１」を格納する。なお、サーバ３（あるいはサーバ３上で稼動する仮想計算機）のＳ＿ＩＤに対応するＩｎｄｅｘ番号が決定していない場合には振分テーブル２４１への登録はできないため、その場合、コントローラ２１は振分テーブル２４１の更新は行わない。【００４７】
（コマンドの多重処理）
なお、本発明の実施例１の振分モジュール３３は、同時に複数のＩ／Ｏコマンドを受信し、コントローラ２１ａまたは２１ｂへと振り分ける処理を行うことが可能である。つまりＭＰＵ３１から第１のコマンドを受信し、第１のコマンドの送信先の決定処理を行っている間に、ＭＰＵ３１から第２のコマンドを受信することが可能である。この場合の処理の流れについて、図９を用いて説明する。【００４８】
ＭＰＵ３１がＩ／Ｏコマンド（１）を生成し、振分モジュールに送信すると（図９：Ｓ３）、振分部３５はＩ／Ｏコマンド（１）の送信先を決定するための処理、つまり図３のＳ４（あるいは図７のＳ４１〜Ｓ４５の処理）、Ｓ６の処理（振分テーブル２４１へのアクセス）を行う。ここでは、Ｉ／Ｏコマンド（１）の送信先を決定するための処理のことを「タスク（１）」と呼ぶ。このタスク（１）の処理中に、ＭＰＵ３１がＩ／Ｏコマンド（２）を生成し、振分モジュールに送信すると（図９：Ｓ３’）、振分部３５は一旦タスク（１）を中断（タスク切替）し（図９：Ｓ５）、Ｉ／Ｏコマンド（２）の送信先を決定するための処理を開始する（この処理を「タスク（２）」）と呼ぶ）。タスク（２）もタスク（１）と同様、振分テーブル２４１へのアクセス処理を行う。図９に記載されている例では、タスク（１）による振分テーブル２４１へのアクセス要求の応答が振分モジュール３３に戻ってくる前に、タスク（２）による振分テーブル２４１へのアクセス要求が発行されている。これは振分モジュール３３が、サーバ３の外部（ストレージ装置２）にあるメモリ２４にアクセスする場合、振分モジュール３３内のメモリにアクセスする場合に比べて応答時間が長くなり、タスク（２）が、タスク（１）による振分テーブル２４１へのアクセス要求の完了を待っていると、システム性能が低下する。そのため、タスク（１）による振分テーブル２４１へのアクセス要求の完了を待たずに、タスク（２）による振分テーブル２４１へのアクセスを行えるようにしている。【００４９】
そしてタスク（１）による、振分テーブル２４１へのアクセス要求の応答が、コントローラ２１から振分モジュール３３に戻ってくると、振分部３５はまたタスク切り替えを行い（Ｓ５’）、タスク（１）の実行に戻り、Ｉ／Ｏコマンド（１）の送信処理（図９：Ｓ７）を行う。その後、タスク（２）による、振分テーブル２４１へのアクセス要求の応答が、コントローラ２１から振分モジュール３３に戻ってくると、振分部３５はまたタスク切り替えを行い（図９：Ｓ５’’）、タスク（２）の実行に移り、Ｉ／Ｏコマンド（２）の送信処理（図９：Ｓ７’）を行う。【００５０】
ここで、タスク（１）、タスク（２）で行われる振分テーブルアクセスアドレス算出（Ｓ４）は、図７で説明したとおり、Ｉｎｄｅｘ番号の検索が失敗し、振分テーブル２４１へのアクセスアドレスの生成ができない場合もある。その場合には、図７で説明したとおりダミーアドレスを指定してメモリ２４にアクセスする処理を行う。Ｉｎｄｅｘ番号の検索が失敗した場合には、代表ＭＰに対してＩ／Ｏコマンドを送信する以外の選択肢はないため、本来メモリ２４にアクセスする必要がないが、以下の理由により、ダミーアドレスを指定してメモリ２４にアクセスする。【００５１】
たとえば図７のタスク（２）でＩｎｄｅｘ番号の検索が失敗した場合を想定する。その場合、Ｉｎｄｅｘ番号の検索が失敗した時点で（メモリ２４にアクセスせず）直接代表ＭＰにＩ／Ｏコマンドを送信するようにすると、タスク（１）による、振分テーブル２４１へのアクセス要求に時間がかかり、その応答がコントローラ２１から振分モジュール３３に戻ってくる前に、タスク（２）はＩ／Ｏコマンドを代表ＭＰに送信することができてしまうことがある。そうすると、Ｉ／Ｏコマンド（１）とＩ／Ｏコマンド（２）の処理の順序が入れ替わってしまうという好ましくない事態が発生するため、本発明の実施例１における振分部３５では、Ｉｎｄｅｘ番号の検索が失敗した場合でも、メモリ２４にアクセスする処理を行うようにしている。なお、本発明の計算機システム１では、振分モジュール３３がメモリ２４に複数のアクセス要求を発行すると、アクセス要求の発行順に、各アクセス要求に対応した応答が戻ってくる（順序性が保証されている）ようになっている。【００５２】
ただし、メモリ２４上のダミーアドレスへのアクセス処理を行わせることは、Ｉ／Ｏコマンドの順序を保証するための一手法に過ぎず、その他の手法を採用することも可能である。たとえばタスク（２）によるＩ／Ｏコマンドの発行先（たとえば代表ＭＰなど）が決定していても、タスク（１）のＩ／Ｏコマンド発行先が決定するまで、あるいはタスク（１）がＩ／Ｏコマンドをストレージ装置２に発行するまでは、振分モジュール３３はタスク（２）によるＩ／Ｏコマンド発行を待たせる（図７のＳ６の実行を待たせる）等の制御を行う方法が考えられる。【００５３】
（障害発生時の処理）
続いて、本発明の実施例１におけるストレージ装置２で障害が発生した場合、特に複数のコントローラ２１のうちの１つが停止した場合の処理について説明する。１つのコントローラ２１が停止した時、当該停止したコントローラ２１が振分テーブル２４１を有していたとすると、サーバ３はそれ以降振分テーブル２４１にアクセスできなくなるため、振分テーブル２４１を別のコントローラ２１に移動し（再作成し）、かつ振分モジュールが振分テーブル２４１にアクセスする際のアクセス先コントローラ２１の情報を変更する必要がある。また停止したコントローラ２１がオーナ権を有していたボリュームについてもオーナ権を変更する必要がある。【００５４】
図１０を用いて、複数のコントローラ２１のうちの１つが停止した場合に、ストレージ装置２が行う処理について説明する。この処理は、ストレージ装置２内のいずれかのコントローラ２１が、別のコントローラ２１の停止を検知した時に、当該停止を検知したコントローラ２１によって開始される。以下、コントローラ２１ａで障害が発生して停止し、コントローラ２１ｂはコントローラ２１ａが停止したことを検知した場合について説明する。まず、障害により停止したコントローラ２１（コントローラ２１ａ）がオーナ権を持っていたボリュームについて、それらのボリュームのオーナ権を別のコントローラ２１（コントローラ２１ｂ）に変更する（Ｓ１１０）。具体的にはＬＤＥＶ管理テーブル２００で管理されているオーナ権の情報を変更する。図２を用いて説明すると、ＬＤＥＶ管理テーブル２００で管理されているボリュームのうち、ＭＰ＃２００−４が「０」（コントローラ２１ａを意味する）のボリュームのオーナ権を全て別のコントローラ（コントローラ２１ｂ）に変更する。つまりＭＰ＃２００−４に「０」が格納されているエントリについて、ＭＰ＃２００−４の内容を「１」に変更する。【００５５】
続いてＳ１２０では、停止したコントローラ２１ａが振分テーブル２４１を有していたか否かを判定する。当該判定がＹｅｓの場合には、コントローラ２１ｂはＬＤＥＶ管理テーブル２００、インデックステーブル６００を用いて振分テーブル２４１ｂを作成する（Ｓ１３０）、サーバ３（の振分モジュール３３）に対して、振分テーブル２４１ｂの振分テーブルベースアドレスとテーブルリード先コントローラ（コントローラ２１ｂ）の情報を送信し（Ｓ１４０）、処理を終了する。Ｓ１４０の処理により、サーバ３に情報が送信されると、サーバ３では今後はコントローラ２１ｂ内の振分テーブル２４１ｂに対してアクセスを行うように設定が変更される。【００５６】
一方Ｓ１２０における判定がＮｏの場合は、コントローラ２１ｂが振分テーブル２４１ｂを管理していた場合であり、この場合はサーバ３で振分テーブル２４１のアクセス先を変更する必要がない。ただし振分テーブル２４１にはオーナ権の情報が含まれており、この情報は更新の必要があるので、ＬＤＥＶ管理テーブル２００、インデックステーブル６００の情報に基づいて振分テーブル２４１ｂの更新を行い（Ｓ１５０）、処理を終了する。
【実施例２】
【００５７】
続いて、本発明の実施例２に係る計算機システム１０００の構成を説明する。図１２は、本発明の実施例２に係る計算機システム１０００の主要構成要素と、それらの接続関係を示した図である。計算機システム１０００の主要構成要素には、ストレージコントローラモジュール１００１（「コントローラ１００１」と略記されることもある）、サーバブレード（図中では「ブレード」と略記している）１００２、ホストＩ／Ｆモジュール１００３、ディスクＩ／Ｆモジュール１００４、ＳＣモジュール１００５、ＨＤＤ１００７がある。なお、ホストＩ／Ｆモジュール１００３とディスクＩ／Ｆモジュール１００４とを総称して、「Ｉ／Ｏモジュール」と呼ぶこともある。【００５８】
コントローラ１００１とディスクＩ／Ｆモジュール１００４の組は、実施例１におけるストレージ装置２のストレージコントローラ２１と同様の機能を有するものである。またサーバブレード１００２は、実施例１におけるサーバ３と同様の機能を有するものである。【００５９】
また、ストレージコントローラモジュール１００１、サーバブレード１００２、ホストＩ／Ｆモジュール１００３、ディスクＩ／Ｆモジュール１００４、ＳＣモジュール１００５は、計算機システム１０００内に複数存在してよい。以下では、ストレージコントローラモジュール１００１が２つ存在する構成について説明するが、２つのストレージコントローラモジュール１００１を区別して表記する必要がある場合、それぞれを「ストレージコントローラモジュール１００１−１」（あるいは「コントローラ１００１−１」）、「ストレージコントローラモジュール１００１−２」（あるいは「コントローラ１００１−２」）と表記する。またサーバブレード１００２は８台存在する構成について説明するが、複数のサーバブレード１００２を区別して表記する必要がある場合には、サーバブレード１００２−１、１００２−２、…１００２−８、と表記する。【００６０】
コントローラ１０００とサーバブレード１００２の間、及びコントローラ１０００とＩ／Ｏモジュールとの間では、Ｉ／Ｏシリアルインタフェース（拡張バスの一種）であるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）  Ｅｘｐｒｅｓｓ（以下、「ＰＣＩｅ」と略記）の規格に従う通信が行われる。コントローラ１０００、サーバブレード１００２、Ｉ／Ｏモジュールをバックプレーン１００６に接続すると、コントローラ１０００とサーバブレード１００２の間、及びコントローラ１０００とＩ／Ｏモジュール（１００３、１００４）との間が、ＰＣＩｅの規格に従う通信線で接続される。【００６１】
コントローラ１００１は、サーバブレード１００２に論理ユニット（ＬＵ）を提供し、サーバブレード１００２からのＩ／Ｏ要求を処理する。コントローラ１００１−１、１００１−２はいずれも同一の構成であり、それぞれがＭＰＵ１０１１ａ、ＭＰＵ１０１１ｂ、ストレージメモリ１０１２ａ、１０１２ｂを有する。コントローラ１００１内のＭＰＵ１０１１ａ、１０１１ｂは、Ｉｎｔｅｌ社のチップ間接続技術であるＱＰＩ（ＱｕｉｃｋＰａｔｈ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）リンクで相互接続されており、またコントローラ１００１−１、１００１−２のＭＰＵ１０１１ａ同士、そしてコントローラ１００１−１、１００１−２のＭＰＵ１０１１ｂ同士は、ＮＴＢ（Ｎｏｎ−Ｔｒａｎｓｐａｒｅｎｔ  Ｂｒｉｄｇｅ）を介して相互に接続されている。また、図では記載を省略しているが、各コントローラ１００１は実施例１のストレージコントローラ２１と同様に、ＬＡＮに接続するためのＮＩＣを有し、ＬＡＮ経由で管理端末（非図示）と通信可能な状態にされている。【００６２】
ホストＩ／Ｆモジュール１００３は、計算機システム１０００の外部に存在するホスト１００８をコントローラ１００１に接続するためのインタフェースを有するモジュールで、ホスト１００８の有するＨＢＡ（Ｈｏｓｔ  Ｂｕｓ  Ａｄａｐｔｅｒ）に接続するためのＴＢＡ（Ｔａｒｇｅｔ  Ｂｕｓ  Ａｄａｐｔｅｒ）を有する。【００６３】
ディスクＩ／Ｆモジュール１００４は、複数のハードディスク（ＨＤＤ）１００７をコントローラ１００１に接続するためのＳＡＳコントローラ１００４１を有するモジュールで、コントローラ１００１は、サーバブレード１００２あるいはホスト１００８からのライトデータを、ディスクＩ／Ｆモジュール１００４に接続された複数のＨＤＤ１００７へと格納する。つまりコントローラ１００１、ホストＩ／Ｆモジュール１００３、ディスクＩ／Ｆモジュール１００４、複数のＨＤＤ１００７の組は、実施例１におけるストレージ装置２に相当するものである。なお、ＨＤＤ１００７は、ハードディスクのような磁気ディスク以外に、ＳＳＤ等の半導体記憶デバイスを用いることも可能である。【００６４】
サーバブレード１００２は、１以上のＭＰＵ１０２１、メモリ１０２２を有するとともに、ＡＳＩＣ１０２４の搭載されたメザニンカード１０２３を有する。ＡＳＩＣ１０２４は、実施例１におけるサーバ３に搭載されている振分モジュール３３に相当するもので、詳細は後述する。またＭＰＵ１０２１は、複数のプロセッサコアを有する、いわゆるマルチコアプロセッサであってもよい。【００６５】
ＳＣモジュール１００５は、伝送信号のリピーターであるＳｉｇｎａｌ  Ｃｏｎｄｉｔｉｏｎｅｒ（ＳＣ）を搭載したモジュールで、コントローラ１００１とサーバブレード１００２間を流れる信号の劣化を防ぐために設けられている。【００６６】
続いて図１８〜２０を用いて、図１２で説明した各構成要素の実装形態の一例を説明する。図１８は計算機システム１０００を１９インチラック等のラックに実装した場合の前面図の一例を示したものである。実施例２に係る計算機システム１０００の各構成要素のうち、ＨＤＤ１００７を除く構成要素は、ＣＰＦシャーシ１００９と呼ばれる単一の筐体に格納される。そしてＨＤＤ１００７は、ＨＤＤ  Ｂｏｘ１０１０と呼ばれる筐体に格納される。ＣＰＦシャーシ１００９やＨＤＤ  Ｂｏｘ１０１０は、たとえば１９インチラック等のラックに搭載されるが、計算機システム１０００で扱うデータ量の増加にあわせて、ＨＤＤ１００７（及びＨＤＤ  Ｂｏｘ１０１０）は増設されていくので、図１８に示す通り、ラックの下段にＣＰＦシャーシ１００９を設置し、ＣＰＦシャーシ１００９の上にＨＤＤ  Ｂｏｘ１０１０を設置する規則にしている。【００６７】
また、ＣＰＦシャーシ１００９内に搭載される構成要素はそれぞれ、ＣＰＦシャーシ１００９内のバックプレーン１００６に接続されることにより、相互接続される。図２０に、図１８に記載の線Ａ−Ａ’に沿った断面図を示す。図２０に記載の通り、コントローラ１００１、ＳＣモジュール１００５、サーバブレード１００２は、ＣＰＦシャーシ１００９の前面に搭載され、コントローラ１００１及びサーバブレード１００２の背面についているコネクタが、バックプレーン１００６に接続されている。またＩ／Ｏモジュール（ディスクＩ／Ｆモジュール）１００４は、ＣＰＦシャーシ１００９の背面に搭載され、これもコントローラ１００１と同じく、バックプレーン１００６に接続されている。バックプレーン１００６は、サーバブレード１００２やコントローラ１００１等の、計算機システム１０００の各構成要素を相互接続するためのコネクタを備えた回路基板で、コントローラ１００１、サーバブレード１００２、Ｉ／Ｏモジュール１００３、１００４、ＳＣモジュール１００５のコネクタ（図２０において、コントローラ１００１やサーバブレード１００２等とバックプレーン１００６の間に存在するボックス１０２５がコネクタである）をバックプレーン１００６のコネクタに接続することにより、各構成要素が相互接続される。【００６８】
また図２０には示されていないが、Ｉ／Ｏモジュール（ホストＩ／Ｆモジュール）１００３もディスクＩ／Ｆモジュール１００４と同じく、ＣＰＦシャーシ１００９の背面に搭載され、バックプレーン１００６に接続されている。図１９に、計算機システム１０００の背面図の一例を示すが、ここから分かるように、ホストＩ／Ｆモジュール１００３とディスクＩ／Ｆモジュール１００４はいずれもＣＰＦシャーシ１００９の背面に搭載されている。また、Ｉ／Ｏモジュール１００３、１００４の下の空間部分には、ファンやＬＡＮのコネクタ等が搭載されているが、これらは本発明の説明上、必須の構成要素ではないため、説明を省略する。【００６９】
これにより、サーバブレード１００２とコントローラ１００１は、ＳＣモジュール１００５を挟んでＰＣＩｅの規格に従う通信線で接続され、Ｉ／Ｏモジュール１００３、１００４とコントローラ１００１の間もＰＣＩｅの規格に従う通信線で接続される。またコントローラ１００１−１、１００１−２同士も、ＮＴＢを介して相互接続される。【００７０】
また，ＣＰＦシャーシ１００９の上に配置されるＨＤＤ  Ｂｏｘ１０１０は、Ｉ／Ｏモジュール１００４と接続されるが、その接続は、筐体の背面に配線されるＳＡＳケーブルによって接続される。【００７１】
先に述べたとおり、ＨＤＤ  Ｂｏｘ１０１０はＣＰＦシャーシ１００９の上に配置される。保守性を考慮すると、ＨＤＤ  Ｂｏｘとコントローラ１００１及びＩ／Ｏモジュール１００４は近接した位置に配置することが望ましいため、コントローラ１００１はＣＰＦシャーシ１００９内の上部に搭載され、サーバブレード１００２はＣＰＦシャーシ１００９内の下部に搭載される。そうすると、特に最下部のサーバブレード１００２と最上部のコントローラ１００１との通信線の長さが長くなってしまうので、両者の間を流れる信号の劣化を防ぐためのＳＣモジュール１００５を、サーバブレード１００２とコントローラ１００１の間に挿入している。【００７２】
続いて、コントローラ１００１、サーバブレード１００２の内部構成について、図１３を用いてやや詳細に説明する。【００７３】
サーバブレード１００２は、コントローラ１００１−１、１００１−２のいずれかにＩ／Ｏ要求（リード、ライトコマンド）を振り分けるためのデバイスであるＡＳＩＣ１０２４を備えている。サーバブレード１００２のＭＰＵ１０２１とＡＳＩＣ１０２４との間の通信では、コントローラ１０００とサーバブレード１００２の間の通信方式と同様、ＰＣＩｅが用いられる。サーバブレード１００２のＭＰＵ１０２１には、ＭＰＵ１０２１と外部デバイスを接続するためのルートコンプレックス（Ｒｏｏｔ  Ｃｏｍｐｌｅｘ。図中では「ＲＣ」と略記している）１０２１１が内蔵され、ＡＳＩＣ１０２４には、ルートコンプレックス１０２１１に接続される、ＰＣＩｅツリーの終端デバイスであるエンドポイント（Ｅｎｄｐｏｉｎｔ。図中では「ＥＰ」と略記している）１０２４１が内蔵されている。【００７４】
コントローラ１００１もサーバブレード１００２と同様、コントローラ１００１内のＭＰＵ１０１１と、Ｉ／Ｏモジュール等のデバイスとの間の通信規格にＰＣＩｅが用いられている。ＭＰＵ１０１１はルートコンプレックス１０１１２を有し、各Ｉ／Ｏモジュール（１００３、１００４）にはルートコンプレックス１０１１２に接続されるエンドポイントが内蔵されている。また、ＡＳＩＣ１０２４には、先に説明したエンドポイント１０２４１の他、２つのエンドポイント（１０２４２、１０２４３）が存在する。これらの２つのエンドポイント（１０２４２、１０２４３）は先に説明したエンドポイント１０２４１とは異なり、ストレージコントローラ１０１１内のＭＰＵ１０１１のルートコンプレックス１０１１２に接続されるエンドポイントである。【００７５】
図１３の構成例に記載の通り、２つのエンドポイント（１０２４２、１０２４３）のうち、一方のエンドポイント（たとえばエンドポイント１０２４２）は、ストレージコントローラ１０１１−１内のＭＰＵ１０１１のルートコンプレックス１０１１２に接続され、もう一方のエンドポイント（たとえばエンドポイント１０２４３）は、ストレージコントローラ１０１１−２内のＭＰＵ１０１１のルートコンプレックス１０１１２に接続されるように構成される。つまり、ルートコンプレックス１０２１１とエンドポイント１０２４１を含むＰＣＩｅドメインと、コントローラ１００１−１内ルートコンプレックス１０１１２とエンドポイント１０２４２を含むＰＣＩｅドメインとは、異なるドメインである。またコントローラ１００１−２内ルートコンプレックス１０１１２とエンドポイント１０２４３を含むドメインも、他のドメインとは異なるＰＣＩｅドメインである。【００７６】
ＡＳＩＣ１０２４には、先に説明したエンドポイント１０２４１、１０２４２、１０２４３と、後述する振り分け処理を実行するプロセッサであるＬＲＰ１０２４４、サーバブレード１００２とストレージコントローラ１００１間のデータ転送処理を実行するＤＭＡコントローラ（ＤＭＡＣ）１０２４５、内部ＲＡＭ１０２４６が含まれる。なお、サーバブレード１００２とコントローラ１００１間でのデータ転送（リード、ライト処理）の際、ＬＲＰ１０２４４、ＤＭＡＣ１０２４５、内部ＲＡＭ１０２４６で構成される機能ブロック１０２４０はＰＣＩｅのマスタデバイスとして動作するため、この機能ブロック１０２４０をＰＣＩｅマスタブロック１０２４０と呼ぶ。また各エンドポイント１０２４１、１０２４２、１０２４３は、それぞれ異なるＰＣＩｅドメインに属するため、サーバブレード１０２１のＭＰＵ１０２１が直接コントローラ１００１（のストレージメモリ１０１２等）にアクセスすることはできない。逆にコントローラ１００１のＭＰＵ１０１１が、サーバブレード１０２１のサーバメモリ１０２２にアクセスすることもできない。一方、ＰＣＩｅマスタブロック１０２４０の構成要素（ＬＲＰ１０２４４やＤＭＡＣ１０２４５）は、コントローラ１００１のストレージメモリ１０１２とサーバブレード１０２１のサーバメモリ１０２２のいずれに対してもアクセス（リード、ライト）可能である。【００７７】
また、ＰＣＩｅでは、Ｉ／Ｏデバイスのレジスタ等をメモリ空間にマップすることができ、レジスタ等がマップされたメモリ空間のことをＭＭＩＯ（Ｍｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）空間と呼ぶ。ＡＳＩＣ１０２４には、サーバブレード１００２のＭＰＵ１０２１がアクセス可能なＭＭＩＯ空間であるサーバＭＭＩＯ空間１０２４７、コントローラ１００１−１（ＣＴＬ１）のＭＰＵ１０１１（プロセッサコア１０１１１）がアクセス可能なＭＭＩＯ空間であるＣＴＬ１用ＭＭＩＯ空間１０２４８、そしてコントローラ１００１−２（ＣＴＬ２）のＭＰＵ１０１１（プロセッサコア１０１１１）がアクセス可能なＭＭＩＯ空間であるＣＴＬ２用ＭＭＩＯ空間１０２４９が設けられている。これにより、ＭＰＵ１０１１（プロセッサコア１０１１１）やＭＰＵ１０２１は、このＭＭＩＯ空間に対して制御情報の読み書きを行うことで、ＬＲＰ１０２４４やＤＭＡＣ１０２４等に対してデータ転送等の指示を行うことができるように構成されている。【００７８】
また、コントローラ１００１−１内ルートコンプレックス１０１１２及びエンドポイント１０２４２を含むＰＣＩｅドメインと、コントローラ１００１−２内ルートコンプレックス１０１１２及びエンドポイント１０２４３を含むドメインとは、それぞれ異なるＰＣＩｅドメインであるが、そしてコントコントローラ１００１−１、１００１−２のＭＰＵ１０１１ａ同士、そしてコントローラ１００１−１、１００１−２のＭＰＵ１０１１ｂ同士は、ＮＴＢを介して相互に接続されているので、コントローラ１００１−１（のＭＰＵ１０１１など）からコントローラ１００１−２のストレージメモリ（１０１２ａ、１０１２ｂ）に対してデータを書き込む（転送する）ことが可能になっている。逆にコントローラ１００１−２（のＭＰＵ１０１１など）からコントローラ１００１−１のストレージメモリ（１０１２ａ、１０１２ｂ）に対してデータを書き込む（転送する）ことも可能である。【００７９】
図１２に記載されているように、各コントローラ１００１には２つのＭＰＵ１０１１（ＭＰＵ１０１１ａ、１０１１ｂ）が存在し、ＭＰＵ１０１１ａ、１０１１ｂはそれぞれ、一例として４つのプロセッサコア１０１１１を有する。それぞれのプロセッサコア１０１１１は、サーバブレード１００２から到来する、ボリュームに対するリード、ライトコマンド要求を処理する。また、ＭＰＵ１０１１ａ、１０１１ｂにはそれぞれ、ストレージメモリ１０１２ａ、１０１２ｂが接続されている。ストレージメモリ１０１２ａ、１０１２ｂはそれぞれ物理的に独立しているが、先に述べたとおり、ＭＰＵ１０１１ａ、１０１１ｂ同士はＱＰＩリンクで相互接続されているので、ＭＰＵ１０１１ａ、１０１１ｂ（そしてＭＰＵ１０１１ａ、１０１１ｂ内のプロセッサコア１０１１１）からは、ストレージメモリ１０１２ａ、１０１２ｂのいずれにもアクセス可能になっている（単一のメモリ空間としてアクセス可能になっている）。【００８０】
そのため、図１３に示すように、コントローラ１００１−１には、実質的に１つのＭＰＵ１０１１−１、１つのストレージメモリ１０１２−１が存在する構成とみなすことができる。同様に、コントローラ１００１−２には、実質的に１つのＭＰＵ１０１１−２、１つのストレージメモリ１０１２−２が存在する構成とみなすことができる。また、ＡＳＩＣ１０２４上のエンドポイント１０２４２は、コントローラ１００１−１上の２つのＭＰＵ（１０１１ａ、１０１１ｂ）のうちのいずれのＭＰＵ（１０１１ａ、１０１１ｂ）の有するルートコンプレックス１０１１２に接続されていてもよく、同様にエンドポイント１０２４３は、コントローラ１００１−２上のいずれのＭＰＵ（１０１１ａ、１０１１ｂ）の有するルートコンプレックス１０１１２に接続されていてもよい。【００８１】
以下では、コントローラ１００１−１内の複数のＭＰＵ１０１１ａ、１０１１ｂ、そしてストレージメモリ１０１２ａ、１０１２ｂを区別せず、コントローラ１００１−１内のＭＰＵを「ＭＰＵ１０１１−１」と表記し、ストレージメモリを「ストレージメモリ１０１２−１」と表記する。同様に、コントローラ１００１−２内のＭＰＵを「ＭＰＵ１０１１−２」と表記し、ストレージメモリを「ストレージメモリ１０１２−２」と表記する。また、先に述べたとおり、ＭＰＵ１０１１ａ、１０１１ｂはそれぞれ４つのプロセッサコア１０１１１を有しているので、ＭＰＵ１０１１−１、１０１１−２はそれぞれ、８つのプロセッサコアを備えるＭＰＵとみなすことができる。【００８２】
（ＬＤＥＶ管理テーブル）
続いて、本発明の実施例２におけるストレージコントローラ１００１が有する管理情報について説明していく。まずストレージコントローラ１００１がサーバブレード１００２やホスト１００８に提供する論理ボリューム（ＬＵ）についての管理情報について説明する。【００８３】
実施例２におけるコントローラ１００１も、実施例１のコントローラ２１が有するＬＤＥＶ管理テーブル２００と同じＬＤＥＶ管理テーブル２００を有する。ただし実施例２におけるＬＤＥＶ管理テーブル２００では、ＭＰ＃２００−４に格納される内容が実施例１のＬＤＥＶ管理テーブル２００と若干異なる。【００８４】
実施例２におけるコントローラ１００１では、プロセッサコアが１つのコントローラ１００１について８つ存在する、つまりコントローラ１００１−１とコントローラ１００１−２に存在するプロセッサコアの数の合計は１６個である。以下、実施例２における各プロセッサコアはそれぞれ、０ｘ００〜０ｘ０Ｆのいずれか識別番号を持つものとし、コントローラ１００１−１には、識別番号が０ｘ００〜０ｘ０７のプロセッサコアが存在し、コントローラ１００１−２には、識別番号が０ｘ０８〜０ｘ０Ｆのプロセッサコアが存在するものとする。また、識別番号がＮ番（Ｎは０ｘ００〜０ｘ０Ｆまでの値）のプロセッサコアのことを、「コアＮ」と表記することもある。【００８５】
実施例１におけるコントローラ２１ａまたは２１ｂには、それぞれ１つのＭＰＵが搭載されているだけであったため、ＬＤＥＶ管理テーブル２００のＭＰ＃２００−４の欄（ＬＵのオーナ権を持つプロセッサの情報を格納する欄）には、０または１のいずれかの値が格納されていた。一方実施例２におけるコントローラ１００１は、１６個のプロセッサコアのいずれかが各ＬＵのオーナ権を持つ。そのため、実施例２におけるＬＤＥＶ管理テーブル２００のＭＰ＃２００−４の欄には、オーナ権を持つプロセッサコアの識別番号（０ｘ００〜０ｘ０Ｆの値）が格納される。【００８６】
（コマンドキュー）
ストレージメモリ１０１２−１、１０１２−２には、サーバブレード１００２がコントローラ１００１に対して発行するＩ／Ｏコマンドを格納する、ＦＩＦＯ型の領域が設けられており、実施例２ではそれをコマンドキューと呼ぶ。図１４に、ストレージメモリ１０１２−１に設けられているコマンドキューの一例を示す。図１４に示されているように、コマンドキューはサーバブレード１００２ごと、及びコントローラ１００１のプロセッサコアごとに設けられている。たとえばサーバブレード１００２−１が、識別番号０ｘ０１のプロセッサコア（コア０ｘ０１）がオーナ権を持つＬＵに対するＩ／Ｏコマンドを発行すると、サーバブレード１００２−１は、サーバブレード１００２−１用のコマンドキューの集合１０１３１−１の中の、コア０ｘ０１用キューにコマンドを格納する。なお、ストレージメモリ１０１２−２にも同様に、サーバブレードごとのコマンドキューが設けられているが、ストレージメモリ１０１２−２に設けられるコマンドキューは、ＭＰＵ１０１１−２の持つプロセッサコア、つまり識別番号０ｘ０８〜０ｘ０Ｆのプロセッサコアに対するコマンドを格納するキューである点が、ストレージメモリ１０１２−１に設けられているコマンドキューと異なる。【００８７】
（振分テーブル）
実施例２におけるコントローラ１００１も実施例１のコントローラ２１と同様、振分テーブル２４１を有する。振分テーブル２４１の内容は実施例１で説明したもの（図５）と同様である。相違点は、実施例２の振分テーブル２４１では、ＭＰＵ＃５０２にプロセッサコアの識別番号（つまり０ｘ００〜０ｘ０Ｆ）が格納される点であり、それ以外の点は実施例１における振分テーブルと同じである。【００８８】
また実施例１ではコントローラ２１内に１つの振分テーブル２４１が存在したが、実施例２におけるコントローラ１００１では、サーバブレード１００２の台数と同数の振分テーブルが格納される（たとえばサーバブレード１００２−１、１００２−２の、２台のサーバブレードが存在する場合、コントローラ１００１には、サーバブレード１００２−１用の振分テーブルと、サーバブレード１００２−２用の振分テーブルの、合計２つの振分テーブルが格納される）。実施例１と同様、計算機システム１０００の起動時に、コントローラ１００１は振分テーブル２４１を作成（振分テーブル２４１を格納する記憶領域をストレージメモリ１０１２上に確保し、内容を初期化）し、サーバブレード１００２（仮にサーバブレード１００２−１とする）に対して振分テーブルのベースアドレスを通知する（図３：Ｓ１の処理）。その際に、コントローラは、複数存在する振分テーブルのうち、サーバブレード１００２−１がアクセスすべき振分テーブルの格納されているストレージメモリ１０１２上の先頭アドレスをもとにベースアドレスを生成し、生成したベースアドレスを通知する。これによりサーバブレード１００２−１〜１００２−８は、Ｉ／Ｏコマンドの発行先を決定する際、コントローラ１００１内の８つの振分テーブルのうち、自身がアクセスすべき振分テーブルにアクセスすることができる。なお、振分テーブル２４１のストレージメモリ１０１２上の格納位置は、あらかじめ固定的に定められていても良いし、振分テーブル生成時にコントローラ１００１が動的に決定するようにしてもよい。【００８９】
（インデックステーブル）
実施例１のストレージコントローラ２１は、Ｉ／Ｏコマンドに含まれるサーバ３（あるいはサーバ３上で動作する仮想計算機）の情報（Ｓ＿ＩＤ）をもとに、８ビットのＩｎｄｅｘ番号を導出し、サーバ３はＩｎｄｅｘ番号を用いて振分テーブル内アクセス先を決定していた。そしてコントローラ２１は、Ｓ＿ＩＤとＩｎｄｅｘ番号の対応関係の情報をインデックステーブル６００に管理していた。実施例２におけるコントローラ１００１も同様に、インデックステーブル６００を保持し、Ｓ＿ＩＤとＩｎｄｅｘ番号の対応関係の情報を管理している。【００９０】
また、振分テーブルと同様に、実施例２におけるコントローラ１００１は、コントローラ１００１に接続されるサーバブレード１００２ごとにインデックステーブル６００を管理している。そのため、サーバブレード１００２の台数と同数のインデックステーブル６００を有する。【００９１】
（ブレードサーバ側管理情報）
本発明の実施例２のブレードサーバ１００２がＩ／Ｏ振分処理を行うために、ブレードサーバ１００２で維持管理する情報は、実施例１のサーバ３（の振分部３５）が有する情報（検索データテーブル３０１０、振分けテーブルベースアドレス情報３１１０、振分けテーブルリード先ＣＴＬ＃情報３１２０）と同じである。実施例２のブレードサーバ１００２では、これらの情報はＡＳＩＣ１０２４の内部ＲＡＭ１０２４６に格納される。【００９２】
（Ｉ／Ｏ処理の流れ）
続いて、図１５、１６を用いて、サーバブレード１００２がストレージコントローラモジュール１００１に対してＩ／Ｏ要求（リード要求を例にとる）を送信する際の処理の概要を説明する。この処理の流れは実施例１の図３に記載の流れと同様である。なお、実施例２における計算機システム１０００でも、初期設定時には、図３のＳ１、Ｓ２の処理（振分テーブルの生成と、振分テーブルのリード先、振分テーブルベースアドレス情報の送信）は行われるが、図１５、１６ではその処理は省略している。【００９３】
最初にサーバブレード１００２のＭＰＵ１０２１が、Ｉ／Ｏコマンドの生成を行う（Ｓ１００１）。実施例１と同様に、Ｉ／Ｏコマンドのパラメータには送信元サーバブレード１００２を特定可能な情報であるＳ＿ＩＤ、そしてアクセス対象ＬＵのＬＵＮが含まれている。またリード要求の場合、Ｉ／Ｏコマンドのパラメータにはリードデータを格納するべきメモリ１０２２上のアドレスが含まれる。ＭＰＵ１０２１は生成したＩ／Ｏコマンドのパラメータをメモリ１０２２に格納する。Ｉ／Ｏコマンドのパラメータをメモリ１０２２に格納した後、ＭＰＵ１０２１はＩ／Ｏコマンドの格納が完了したことをＡＳＩＣ１０２４に通知する（Ｓ１００２）。この時、ＭＰＵ１０２１はサーバ用ＭＭＩＯ空間１０２４７の所定のアドレスへと情報を書き込むことで、ＡＳＩＣ１０２４への通知を行う。【００９４】
ＭＰＵ１０２１からコマンド格納完了の通知を受け取ったＡＳＩＣ１０２４のプロセッサ（ＬＲＰ１０２４４）は、メモリ１０２２からＩ／Ｏコマンドのパラメータを読み出し、ＡＳＩＣ１０２４の内部ＲＡＭ１０２４６に格納し（Ｓ１００４）、パラメータの加工（Ｓ１００５）を行う。サーバブレード１００２側とストレージコントローラモジュール１００１側ではコマンドのパラメータのフォーマットが異なる（たとえばサーバブレード１００２で作成されるコマンドパラメータには、リードデータ格納先メモリアドレスが含まれているが、それはストレージコントローラモジュール１００１では不要のパラメータである）ため、ストレージコントローラモジュール１００１に不要な情報を取り除くなどの処理を行う。【００９５】
Ｓ１００６では、ＡＳＩＣ１０２４のＬＲＰ１０２４４は、振分テーブル２４１のアクセスアドレスを算出する。この処理は実施例１の図３、図７で説明したＳ４（Ｓ４１〜Ｓ４５）と同じ処理で、ＬＲＰ１０２４４が検索データテーブル３０１０からＩ／Ｏコマンドに含まれていたＳ＿ＩＤに対応するＩｎｄｅｘ番号を得て、それをもとにアクセスアドレスを算出する。さらに、Ｉｎｄｅｘ番号の検索が失敗しアクセスアドレスの算出に失敗することもある点も実施例１と同様で、その場合、ＬＲＰ１０２４４は実施例１と同様にダミーアドレスを生成する。【００９６】
Ｓ１００７では、図３のＳ６と同様の処理を行う。ＬＲＰ１０２４４はテーブルリード先ＣＴＬ＃３１２０で特定されるコントローラ１００１（１００１−１または１００１−２）の振分テーブル２４１の所定アドレス（Ｓ１００６で算出した振分テーブル２４１のアクセスアドレス）の情報を読み出す。これにより、アクセス対象ＬＵのオーナ権を持つプロセッサ（プロセッサコア）が判明する。【００９７】
Ｓ１００８は、実施例１のＳ７（図３）と同様の処理である。ＬＲＰ１０２４４はＳ１００５で加工したコマンドパラメータを、ストレージメモリ１０１２に書き込む。なお、図１５では、Ｓ１００７の処理における、振分テーブルのリード先となるコントローラ１００１と、Ｓ１００８の処理における、コマンドパラメータのライト先コントローラ１００１とが同じ場合の例のみを記載している。ただし実施例１と同様に、Ｓ１００７において判明した、アクセス対象ＬＵのオーナ権を持つプロセッサコアの属するコントローラ１００１が、振分テーブルのリード先となるコントローラ１００１と異なるケースも発生し、その場合にはコマンドパラメータの書き込み先は当然、アクセス対象ＬＵのオーナ権を持つプロセッサコアの属するコントローラ１００１上のストレージメモリ１０１２である。【００９８】
また、実施例２のコントローラ１００１では複数のプロセッサコア１０１１１が存在するため、Ｓ１００７で判明した、アクセス対象ＬＵのオーナ権を持つプロセッサコアの識別番号が、０ｘ００〜０ｘ０７の範囲であるか、あるいは０ｘ０８〜０ｘ０Ｆの範囲であるかを判定し、識別番号が０ｘ００〜０ｘ０７の範囲である場合には、コントローラ１００１−１のストレージメモリ１０１２−１上に設けられているコマンドキューにコマンドパラメータを書き込み、０ｘ０８〜０ｘ０Ｆの範囲である場合には、コントローラ１００１−２のストレージメモリ１０１２−２上に設けられているコマンドキューにコマンドパラメータを書き込む。【００９９】
たとえばＳ１００７で判明した、アクセス対象ＬＵのオーナ権を持つプロセッサコアの識別番号が０ｘ０１で、コマンドを発行するサーバブレードがサーバブレード１００２−１とすると、ＬＲＰ１０２４４は、ストレージメモリ１０１２上に設けられているサーバブレード１００２−１用の８つのコマンドキューのうち、コア０ｘ０１用のコマンドキューにコマンドパラメータを格納する。コマンドパラメータの格納後、ＬＲＰ１０２４４はコマンドパラメータの格納が完了したことを、ストレージコントローラモジュール１００１のプロセッサコア１０１１１（アクセス対象ＬＵのオーナ権を持つプロセッサコア）に通知する。【０１００】
なお、Ｓ１００７の処理で、ＡＳＩＣ１０２４上の検索データテーブルにサーバブレード１００２（またはサーバブレード１００２上で稼働する仮想計算機）のＳ＿ＩＤが登録されていないためにＩｎｄｅｘ番号の検索が失敗し、結果としてアクセス対象ＬＵのオーナ権を持つプロセッサコアが判明しないこともある点は実施例１と同様である。この場合ＬＲＰ１０２４４は、実施例１と同様に、あらかじめ定められた特定のプロセッサコア（このプロセッサコアのことを、実施例１と同様に「代表ＭＰ」と呼ぶ）にＩ／Ｏコマンドを送信する。つまり、代表ＭＰ用のコマンドキューに、コマンドパラメータを格納し、コマンドパラメータの格納後、代表ＭＰにコマンドパラメータの格納完了を通知する。【０１０１】
Ｓ１００９で、ストレージコントローラモジュール１００１のプロセッサコア１０１１１は、コマンドキューからＩ／Ｏコマンドパラメータを取得し、取得したＩ／Ｏコマンドパラメータをもとに、リードデータの準備を行う。具体的にはＨＤＤ１００７からデータを読み出し、ストレージメモリ１０１２のキャッシュ領域に格納する等である。Ｓ１０１０では、プロセッサコア１０１１１は、キャッシュ領域に格納されたリードデータを転送するための、ＤＭＡ転送用パラメータを生成して、自身のストレージメモリ１０１２に格納する。ＤＭＡ転送用パラメータの格納が完了すると、プロセッサコア１０１１１は格納が完了した旨をＡＳＩＣ１０２４のＬＲＰ１０２４４に通知する（Ｓ１０１０）。この通知は具体的には、コントローラ１００１用のＭＭＩＯ空間（１０２４８あるいは１０２４９）の所定アドレスに情報の書き込みを行うことで実現される。【０１０２】
Ｓ１０１１では、ＬＲＰ１０２４４は、ストレージメモリ１０１２からＤＭＡ転送パラメータを読み出す。続いてＳ１０１２では、Ｓ１００４で保存しておいたサーバブレード１００２からのＩ／Ｏコマンドパラメータを読み出す。Ｓ１０１１で読み出されたＤＭＡ転送パラメータには、リードデータの格納されている転送元メモリアドレス（ストレージメモリ１０１２上アドレス）が含まれており、サーバブレード１００２からのＩ／Ｏコマンドパラメータにはリードデータの転送先メモリアドレス（サーバブレード１００２のメモリ１０２２上アドレス）が含まれているので、Ｓ１０１３ではＬＲＰ１０２４４はこれらの情報を用いて、ストレージメモリ１０１２上のリードデータをサーバブレード１００２のメモリ１０２２に転送するためのＤＭＡ転送リストを生成し、内部ＲＡＭ１０２４６に格納する。その後Ｓ１０１４で、ＬＲＰ１０２４４がＤＭＡコントローラ１０２４５に対してＤＭＡ転送の開始（起動）を指示すると、ＤＭＡコントローラ１０２４５は、Ｓ１０１３で内部ＲＡＭ１０２４６に格納されたＤＭＡ転送リストに基づいて、ストレージメモリ１０１２からサーバブレード１００２のメモリ１０２２へとデータ転送を実施する（Ｓ１０１５）。【０１０３】
Ｓ１０１５でのデータ転送が完了すると、ＤＭＡコントローラ１０２４５はＬＲＰ１０２４４にデータ転送が完了したことを通知する（Ｓ１０１６）。ＬＲＰ１０２４４はデータ転送完了の通知を受け取ると、Ｉ／Ｏコマンド完了のステータス情報を作成し、サーバブレード１００２のメモリ１０２２、ストレージコントローラモジュール１００１のストレージメモリ１０１２へとステータス情報を書き込む（Ｓ１０１７）。また処理が完了した旨をサーバブレード１００２のＭＰＵ１０２１及びストレージコントローラモジュール１００１のプロセッサコア１０１１１へと通知し、リード処理が完了する。【０１０４】
（Ｉｎｄｅｘ番号の検索が失敗した場合の処理）
続いて、Ｉｎｄｅｘ番号の検索が失敗した場合の処理（たとえばサーバブレード１００２（またはサーバブレード１００２上で稼働する仮想計算機）が最初にコントローラ１００２にＩ／Ｏ要求を発行した時など）について、図１７を用いて説明する。この処理は、実施例１における図８の処理と同様である。【０１０５】
代表ＭＰがＩ／Ｏコマンドを受信すると（図１５：Ｓ１００８に相当する）、Ｉ／Ｏコマンドに含まれているＳ＿ＩＤとＬＵＮ、及びＬＤＥＶ管理テーブル２００を参照して、自身がアクセス対象のＬＵのオーナ権を持っているか判定する（Ｓ１１）。オーナ権がある場合は、次のＳ１２の処理を自身で実施し、オーナ権がない場合には、代表ＭＰはオーナ権を有するプロセッサコアにＩ／Ｏコマンドを転送し、オーナ権を有するプロセッサコアは、代表ＭＰからＩ／Ｏコマンドを受信する（Ｓ１１’）。また、代表ＭＰがＩ／Ｏコマンドを送信する時、あわせて当該Ｉ／Ｏコマンドの発行元のサーバブレード１００２の情報（サーバブレード１００２−１〜１００２−８のうち、どのサーバブレードであるか、を示す情報）を送信する。【０１０６】
Ｓ１２では、プロセッサコアは受信したＩ／Ｏ要求を処理し、処理結果をサーバ３に返送する。Ｓ１２では、Ｉ／Ｏコマンドを受信したプロセッサコアがオーナ権を持っている場合は、図１５、１６に記載のＳ１００９〜Ｓ１０１７の処理が行われる。Ｉ／Ｏコマンドを受信したプロセッサコアがオーナ権を持っていなかった場合、Ｉ／Ｏコマンドを転送されたプロセッサコア（オーナ権を持っているプロセッサコア）がＳ１００９の処理を実施するとともに、代表ＭＰの存在するコントローラ１００１にデータを転送し、Ｓ１０１０以降の処理は代表ＭＰが実施する。【０１０７】
Ｓ１３’以降の処理は、実施例１のＳ１３（図８）以降の処理と同様の処理が行われる。なお実施例２のコントローラ１００１では、Ｓ１００８で受信したＩ／Ｏコマンドで指定されたボリュームのオーナ権を持つプロセッサコアが、Ｉ／Ｏコマンドを受信したプロセッサコアとは異なっていた場合、オーナ権を持つプロセッサコアがＳ１３’以降の処理を行う。図１７には、その場合の処理の流れについて記載されている。ただし別の実施形態として、Ｉ／Ｏコマンドを受信したプロセッサコアがＳ１３’以降の処理を行う形態もあり得る。【０１０８】
Ｓ１２までで処理していたＩ／Ｏコマンドに含まれていたＳ＿ＩＤを、Ｉｎｄｅｘ番号に対応付ける際、プロセッサコアは、コマンド発行元のサーバブレード１００２用のインデックステーブル６００を参照し、まだどのＳ＿ＩＤにも対応付けられていないＩｎｄｅｘ番号を検索し、いずれか１つのＩｎｄｅｘ番号を選択する。コマンド発行元のサーバブレード１００２用のインデックステーブル６００を特定できるようにするため、Ｓ１３’の処理を実施するプロセッサコアは、Ｓ１１’で、Ｉ／Ｏコマンドを受信したプロセッサコア（代表ＭＰ）から、コマンド発行元のサーバブレード１００２を特定する情報を受信している。そして選択されたインデックス番号（Ｉｎｄｅｘ＃６０２）に対応する行のＳ＿ＩＤ６０１欄に、Ｉ／Ｏコマンドに含まれていたＳ＿ＩＤを登録する。【０１０９】
Ｓ１４’の処理は、実施例１のＳ１４（図８）と同様であるが、振分けテーブル２４１がサーバブレード１００２毎に存在するため、コマンド発行元のサーバブレード１００２用の振分けテーブル２４１の更新を行う点が、実施例１と異なる点である。【０１１０】
最後にＳ１５で、プロセッサコアはＳ１３でＳ＿ＩＤに対して対応付けられたＩｎｄｅｘ番号の情報を、コマンド発行元のサーバブレード１００２のＡＳＩＣ１０２４内の検索データテーブル３０１０に書き込む。なお、先に述べたとおり、コントローラ１００１のＭＰＵ１０１１（及びプロセッサコア１０１１１）は内部ＲＡＭ１０２４６上の検索データテーブル３０１０に直接データ書き込みを行えないので、プロセッサコアはＣＴＬ１用ＭＭＩＯ空間１０２４８（またはＣＴＬ２用ＭＭＩＯ空間１０２４９）の所定アドレスに書き込みを行うことで、検索データテーブル３０１０にＳ＿ＩＤの情報が反映されるようになっている。【０１１１】
（コマンドの多重処理）
実施例１において、振分モジュール３３がサーバ３のＭＰＵ３１から第１のコマンドを受信し、第１のコマンドの送信先の決定処理を行っている間に、ＭＰＵ３１から第２のコマンドを受信して処理することが可能であることを説明した。実施例２のＡＳＩＣ１０２４も同様に、複数のコマンドを同時期に処理することが可能で、この処理は実施例１の図９の処理と同じである。【０１１２】
（ＬＵ生成時の処理、障害発生時の処理）
また実施例２の計算機システムでも、実施例１で説明したＬＵ生成時の処理や障害発生時の処理は、同様に実施される。処理の流れは実施例１で説明したものと同じであるため詳細な説明は省略する。なお、これらの処理の過程でオーナ権情報を決定する処理が行われるが、実施例２の計算機システムではＬＵのオーナ権をプロセッサコアが持つため、オーナ権の決定の際には、コントローラ１００１はＭＰＵ１０１１ではなく、コントローラ１００１内のいずれかのプロセッサコア１０１１１を選択する点が、実施例１における処理と異なる。【０１１３】
特に障害発生時の場合、実施例１における処理では、たとえばコントローラ２１ａが障害により停止した場合、ストレージ装置２内では、処理を担当できるコントローラは、コントローラ２１ｂ以外存在しないため、コントローラ２１ａ（のＭＰＵ２３ａ）がオーナ権を持っていた各ボリュームのオーナ権情報を、全てコントローラ２１ｂに変更した。一方実施例２における計算機システム１０００では、一方のコントローラ（たとえばコントローラ１００１−１）が停止した場合、各ボリュームの処理を担当可能なプロセッサコアは複数存在する（コントローラ１００１−２にある８つのプロセッサコア１０１１１が処理を担当可能である）。そのため、実施例２における障害発生時の処理では、一方のコントローラ（たとえばコントローラ１００１−１）が停止した場合、残りのコントローラ（コントローラ１００１−２）は、各ボリュームのオーナ権情報を、自身の持つ８つのプロセッサコア１０１１１のいずれかに変更する。それ以外の処理は、実施例１において説明した処理と同じである。【０１１４】
以上、本発明の実施例を説明してきたが、これは本発明の説明のための例示であって、本発明を上で説明した実施例に限定する趣旨ではない。本発明は、他の種々の形態でも実施可能である。たとえば実施例１に記載のストレージ装置２において、ストレージ装置２内のコントローラ２１、ポート２６、ディスクＩ／Ｆ２１５の数は、図１に記載された個数に限定されるものではなく、２つ以上のコントローラ２１、ディスクＩ／Ｆ２１５を有する構成、３つ以上のホストＩ／Ｆを有する構成であっても良い。またＨＤＤ２２を、ＳＳＤなどの記憶媒体に置換した構成でも本発明は有効である。【０１１５】
また、本発明の実施例では、振分けテーブル２４１をストレージ装置２のメモリ内に格納した構成をとるが、振分けテーブルを振分モジュール３３（あるいはＡＳＩＣ１０２４）内に設ける構成をとっても良い。その場合、振分けテーブルの更新が発生する場合（上の実施例で説明したように、サーバからストレージ装置に初回のＩ／Ｏアクセスが発行された場合、ストレージ装置にＬＵが定義された場合、コントローラの障害が発生した場合等）には、ストレージ装置において更新された振分けテーブルを作成し、ストレージ装置から振分モジュール３３（あるいはＡＳＩＣ１０２４）内に更新結果を反映させるようにすれば良い。【０１１６】
また実施例１における振分モジュール３３は、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ  (Field  Programmable  Gate  Array)として実装する構成であってもよいし、あるいは振分モジュール３３内に汎用プロセッサを搭載し、振分モジュール３３で行われる多くの処理を、汎用プロセッサが実行するプログラムによりで実現する形態をとっても良い。
【符号の説明】
【０１１７】
１:  計算機システム
２:  ストレージ装置
３:  サーバ
４:  管理端末
６:  ＬＡＮ
７:  Ｉ／Ｏバス
２１:  ストレージコントローラ
２２:  ＨＤＤ
２３:  ＭＰＵ
２４:  メモリ
２５:  ディスクインタフェース
２６:  ポート
２７:  コントローラ間接続パス
３１:  ＭＰＵ
３２:  メモリ
３３:  振分モジュール
３４:  相互接続スイッチ
３５:  振分部
３６，３７:  ポート
【図１】
2015079528.tif 000003
【図２】
2015079528.tif 000004
【図３】
2015079528.tif 000005
【図４】
2015079528.tif 000006
【図５】
2015079528.tif 000007
【図６】
2015079528.tif 000008
【図７】
2015079528.tif 000009
【図８】
2015079528.tif 000010
【図９】
2015079528.tif 000011
【図１０】
2015079528.tif 000012
【図１１】
2015079528.tif 000013
【図１２】
2015079528.tif 000014
【図１３】
2015079528.tif 000015
【図１４】
2015079528.tif 000016
【図１５】
2015079528.tif 000017
【図１６】
2015079528.tif 000018
【図１７】
2015079528.tif 000019
【図１８】
2015079528.tif 000020
【図１９】
2015079528.tif 000021
【図２０】
2015079528.tif 000022
【国際調査報告】
2015079528.tif 000023
2015079528.tif 000024
2015079528.tif 000025
2015079528.tif 000026