(57)【特許請求の範囲】
【請求項１】
ホスト計算機とネットワークを介して接続されるストレージサブシステムであって、
前記ホスト計算機と複数のポートを介して情報の授受を行うともに、前記各ポートから入力されたコマンドに従ってデータのアクセス制御処理を行う第一インターフェース部と、
データを記憶する記憶装置と、
前記記憶装置に接続され、前記記憶装置との間でデータの入出力処理を行う第二インターフェース部と、
前記第一インターフェース部および前記第二インターフェース部と接続され、前記記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部と、
前記第一インターフェース部と前記第二インターフェース部および前記複数の制御部の処理に伴うデータを一時的に記憶するキャッシュメモリと、
前記複数の制御部が共有する制御情報を格納する共有メモリと、を備え、
前記各制御部は、
前記共有メモリに格納された前記制御情報を前記各制御部共通の制御情報として格納する主メモリと、前記主メモリに格納された前記制御情報に従って前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、
前記第一インターフェース部は、
前記ホスト計算機から、前記各ポートを介して、前記複数の仮想デバイスのうちの一の仮想デバイスに対するデータの入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求に従って前記一の仮想デバイスに対するデータの入出力処理を担当する制御部を特定し、特定した前記制御部に対して前記入出力要求を転送し、
前記入出力要求を受信した制御部は、
前記各ポートに関する負荷情報として、低負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を占有する占有モードを選択し、前記選択した占有モードに従った処理を実行し、前記各ポートに関する負荷情報として、高負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、２つ以上のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を共有する共有モードを選択し、前記選択した共有モードに従った処理を実行してなる、ストレージサブシステム。
【請求項２】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、前記検索対象のキューに対するポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行し、前記検索対象のキューのうち前記ポートスキャンの実行によって前記入出力要求が存在しないキューを前記検索対象のキューから除外して前記検索対象のキューを更新し、その後のポートスキャンでは、前記更新した前記検索対象のキューに対して前記ポートスキャンを実行してなる、請求項１に記載のストレージサブシステム。
【請求項３】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項１に記載のストレージサブシステム。
【請求項４】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち前記仮想デバイスが予め割り付けられたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項１に記載のストレージサブシステム。
【請求項５】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち、前記入出力要求を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項１に記載のストレージサブシステム。
【請求項６】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に要する処理時間を設定時間毎に計測し、前記各計測値を順次更新し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記更新した前記各計測値と閾値とを比較し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を下回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を上回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項１に記載のストレージサブシステム。
【請求項７】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記算出した各前記ポート稼働率の高低を判定し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が低い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が高い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項１に記載のストレージサブシステム。
【請求項８】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出し、前記各ポートについて算出された合計を、前記ポート稼働率の閾値に対応して設定されたマイクロプロセッサ数で除算し、前記除算して得られた前記ポート稼働率を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各ポートに関する前記ポート稼働率を複数のマイクロプロセッサに分散し、前記分散された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項１に記載のストレージサブシステム。
【請求項９】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出するとともに、前記各ポートについて算出された合計の平均値を算出し、前記算出された平均値を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各マイクロプロセッサに対する前記ポート稼働率を平均化し、前記平均化された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項１に記載のストレージサブシステム。
【請求項１０】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記共有モードを選択したときには、前記共有モードで使用するマイクロプロセッサを選択するための情報として、前記算出した前記マイクロプロセッサ稼働率と前記マイクロプロセッサ稼働率に関する複数の閾値を用い、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち上限閾値を上回ったときに、前記共有モードで使用するマイクロプロセッサを１つ増やし、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち下限閾値を下回ったときに、前記共有モードで使用するマイクロプロセッサを１つ減らしてなる、請求項１に記載のストレージサブシステム。
【請求項１１】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記判定結果を基に、前記各閾値を変更し、その後、前記入出力要求を受信したときには、前記変更した前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項１に記載のストレージサブシステム。
【請求項１２】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあると判定したときには、前記各閾値を小さくし、前記各計測した前記キュー滞留数が過去数回に亘って減少傾向にあると判定したときには、前記各閾値を大きく、その後、前記入出力要求を受信したときには、前記小さくした前記各閾値または前記大きくした前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項１に記載のストレージサブシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の記憶装置の記憶領域に割り当てられる複数の論理記憶装置に対する入出力処理を行うストレージサブシステムに関する。
【背景技術】
【０００２】
ストレージサブシステムにおいては、複数の記憶装置の記憶領域に割り当てられた複数の論理記憶装置をホスト計算機に対して認識可能に提供し、ホスト計算機による当該論理記憶装置へのデータへの入出力処理ができるようになっている。
【０００３】
ストレージサブシステムでは、ホスト計算機から入出力要求を受けたときには、ストレージサブシステム内に設けられたマイクロプロセッサが、入出力要求にしたがって、記憶装置へのデータ書き込み処理や、記憶装置からのデータの読み出し処理などの入出力処理を制御するようになっている。
【０００４】
この種のストレージサブシステムの中には、記憶装置との入出力処理を実行するために、複数のマイクロプロセッサとローカルメモリを有する複数の制御部を設けるとともに、記憶装置の論理的記憶領域に対する入出力処理を担当する制御部を管理する管理テーブルを設けたものが提案されている（特許文献１参照）。
【０００５】
特許文献１に記載されたシステムでは、例えば、ホスト計算機から、ポートを介して、記憶装置の論理的記憶領域に対する入出力要求があった場合、ホストインタフェース部が管理テーブルに基づいて、記憶装置の論理的記憶領域の入出力処理を担当する制御部を特定し、特定した制御部へ入出力要求を転送し、入出力要求を受けた制御部の中のいずれかのマイクロプロセッサが記憶装置の論理的記憶領域に対する入出力処理を実行するようになっている。
【０００６】
特許文献１に記載されたシステムによれば、記憶装置の論理的記憶領域と各制御部との対応関係が管理テーブルで管理されているので、記憶装置の論理的記憶領域と各制御部との対応関係を任意に設定することができるとともに、ポートとマイクロプロセッサとの対応関係を固定することなく、制御部の中の複数のマイクロプロセッサに対して、入出力要求の処理を担当すべきマイクロプロセッサを任意に設定することができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−２６９４２４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかし、従来技術では、ホスト計算機からの入出力要求が増加するに伴って、ホストインタフェース部のポート数を増やすと、制御部内の各マイクロプロセッサが処理を担当すべきポート数が増加するので、各ポートに入力された入出力要求を処理すべきマイクロプロセッサを決定するのに時間を要することになる。
【０００９】
一方、１つのポートに入力された入出力要求に対して、複数のマイクロプロセッサで処理を共有する構成を採用した場合、入出力要求を処理すべきマイクロプロセッサを決定する時間を短くすることはできるが、同一の入出力要求に対する処理が複数のマイクロプロセッサで競合した場合、競合した各マイクロプロセッサにおいてオーバーヘッドが発生し、レスポンスタイムが悪化する恐れがある。
【００１０】
本発明は、前記従来技術の課題に鑑みて為されたものであり、その目的は、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができるストレージサブシステムを提供することにある。
【課題を解決するための手段】
【００１１】
前記目的を達成するために、本発明は、ホスト計算機と複数のポートを介して情報の授受を行う第一インターフェース部と、記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部を備え、前記各制御部は、前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、前記第一インターフェース部は、前記ホスト計算機から、前記各ポートを介して入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求の処理を担当する制御部を特定し、前記特定した制御部に対して入出力要求を転送し、前記入出力要求を受信した制御部は、前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記入出力要求の処理を占有する占有モードまたは２つ以上のマイクロプロセッサが前記入出力要求の処理を共有する共有モードのいずれか一方を選択し、前記選択した占有モードまたは共有モードに従った処理を実行することを特徴とするものである。
【発明の効果】
【００１２】
本発明によれば、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明に係るストレージシステムのブロック構成図である。
【図２】本発明に係るストレージサブシステムのモジュール結合構成図である。
【図３】ポートMPからMPPKへコマンドを転送する処理を説明するための図である。
【図４】ホストコマンド用MP検索テーブルの構成図である。
【図５】ベンダ固有コマンド用MP検索テーブルの構成図である。
【図６】MPPKの内部構成を説明するための構成図である。
【図７】ポートスキャンの基本的な内容を説明するためのフローチャートである。
【図８】ポートスキャンの基本的内容を説明するためのシーケンス図である。
【図９】リード処理の前半時の処理を説明するためのシーケンス図である。
【図１０】リード処理の後半時の処理を説明するためのシーケンス図である。
【図１１】ライト処理の前半時の処理を説明するためのシーケンス図である。
【図１２】ライト処理の後半時の処理を説明するためのシーケンス図である。
【図１３】マスタビットマップテーブルの基本構成図である。
【図１４】ポートスキャンに用いるマスタビットマップテーブルの構成図である。
【図１５】ポートスキャンに用いるポートスキャンビットマップテーブルの構成図である。
【図１６】ポートスキャンに用いるイベントビットマップテーブルの構成図である。
【図１７】LDEV‐ポート対応テーブルの構成図である。
【図１８】LDEV‐ポート対応テーブルを生成する方法を説明するための図である。
【図１９】３種類のビットマップテーブルを初期設定するときの処理を説明するためのフローチャートである。
【図２０】初期設定に用いられるLDEV‐ポート対応テーブルの構成図である。
【図２１】初期設定に用いられるマスタビットマップテーブルであって、絞り込み前の状態を示すマスタビットマップテーブルの構成図である。
【図２２】初期設定に用いられるマスタビットマップテーブルであって、絞り込み後の状態を示すマスタビットマップテーブルの構成図である。
【図２３】ポート稼働率テーブルの構成図である。
【図２４】ポート稼働率‐MP数対応テーブルの構成図である。
【図２５】LDEV‐MPPK対応テーブルの作成方法を説明するためのフローチャートである。
【図２６】共有メモリにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図２７】PMにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図２８】テーブルの初期設定処理を説明するためのシーケンス図である。
【図２９】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのフローチャートである。
【図３０】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのシーケンス図である。
【図３１】MPPKにおける周期処理を説明するためのシーケンス図である。
【図３２】ポートスキャンビットマップテーブルの更新処理を説明するためのフローチャートである。
【図３３】ポートスキャンビットマップテーブルの更新処理に用いるイベントマップテーブルの構成図である。
【図３４】イベントビットマップテーブルの内容を反映する前の状態を示すポートスキャンビットマップテーブルの構成図である。
【図３５】イベントビットマップテーブルの内容を反映した後の状態を示すポートスキャンビットマップテーブルの構成図である。
【図３６】ポート−MP対応付け方法１を説明するためのフローチャートである。
【図３７】ポート−MP対応付け方法１を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図３８】ポート‐MP対応付け方法２を説明するためのフローチャートである。
【図３９】ポート−MP対応付け方法２を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図４０】ポート‐MP対応付け方法３を説明するためのフローチャートである。
【図４１】MP稼働率と時間との関係を説明するための図である。
【図４２】MP障害時におけるポート−MP対応付け方法を説明するためのフローチャートである。
【図４３】MP障害発生時の状態を説明するためのマスタビットマップテーブルの構成図である。
【図４４】MP障害時に健全なMPが処理を担当したときの状態を説明するためのマスタビットマップテーブルの構成図である。
【図４５】ポート稼働率‐MP数対応テーブルの動的変更処理を説明するためのフローチャートである。
【図４６】夜間のバッチ処理におけるキュー滞留個数と時間との関係を説明するための図である。
【図４７】ポート稼働率‐MP数対応テーブルの閾値を１/２に変更する方法を説明するための図である。
【図４８】バッチ処理終了時におけるキュー滞留個数と時間との関係を説明するための図である。
【図４９】ポート稼働率‐MP数対応テーブルの閾値を２倍に変更した状態を説明するための図である。
【発明を実施するための形態】
【実施例】
【００１４】
本実施例は、ホスト計算機から、各ポートを介して入出力要求があったときに、複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部の中から、入出要求の処理を担当する制御部を決定し、決定した制御部は、単一のマイクロプロセッサが入出力要求の処理を占有する占有モードまたは２つ以上のマイクロプロセッサが入出力要求の処理を共有する共有モードのいずれか一方を選択し、選択した占有モードまたは共有モードに従った処理を実行するものである。
【００１５】
以下、本発明の一実施例を図面に基づいて説明する。図１は、本発明の一実施例を示すストレージシステムの構成図である。
【００１６】
図１において、ストレージシステムは、複数のホスト計算機１０、１２と、ストレージサブシステム１４を備えており、各ホスト計算機１０、１２とストレージサブシステム１４は、ネットワーク１６、１８を介して互いに接続されている。
【００１７】
ホスト計算機１０は、オープン系計算機として、例えば、マイクロプロセッサ（CPU）、オペレーティングシステム（OS）、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク１６としては、例えば、ファイバチャネルが用いられる。
【００１８】
ホスト計算機１２は、メインフレーム（Main  Frame）用計算機として、例えば、マイクロプロセッサ（CPU）、オペレーティングシステム（OS）、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク１８としては、例えば、FICON（FIbre  CONnection；商標）、ファイバチャネルが用いられる。
【００１９】
この際、各ホスト計算機１０、１２から送信されるコマンドには、リード要求やライト要求などの入出力要求が含まれている。入出力要求には、例えば、リード対象のデータが管理されているLUN（Logical Unit Number）およびLBA（Logical Block Address）が含まれる。また、各ホスト計算機１０、１２から送信されるライト要求には、例えば、ライト対象のデータを書き込むLUNおよびLBAと、ライト対象のデータが含まれる。
【００２０】
ストレージサブシステム１４は、複数のオープンポートパッケージ２０と、複数のメインフレームポートパッケージ２２と、ドライブポートパッケージ２４と、キャッシュメモリ２６と、共有メモリ２８と、スイッチパッケージ３０と、管理用端末３２と、記憶装置３４と、＃０〜＃３のマイクロプロセッサパッケージ（Micro Processor Package、以下、MPPKと称する。）３６を備え、記憶装置３４が複数のHDD（Hard Disk Drive）３８から構成されている。
【００２１】
ストレージサブシステム１４は、図２に示すように、＃０のモジュール４０または＃１のモジュール４２として構成され、各モジュール４０、４２内のスイッチパッケージ３０がネットワーク４４を介して互いに接続されている。
【００２２】
各スイッチパッケージ３０は、内部ネットワーク４６を介して、各オープンポートパッケージ２０と、各メインフレームポートパッケージ２２およびドライブポートパッケージ２４に接続されているとともに、内部ネットワーク４８を介して、＃０〜＃３のMPPK３６に接続され、さらにキャッシュメモリ２６と、共有メモリ２８および管理用端末３２に接続されている。またドライブポートパッケージ２４は、内部ネットワーク５０を介して、各HDD３８に接続されている。
【００２３】
各オープンポートパッケージ２０は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク１６に接続された複数のポート（図示せず）と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うオープンポートマイクロプロセッサ（以下、オープンポートMPと称する。）５２を備えている。
【００２４】
オープンポートMP５２は、各ポートとネットワーク１６を介してホスト計算機１０と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK３６の中から、コマンドの転送先となるMPPK３６を特定し、特定したMPPK３６に対して、スイッチパッケージ３０を介してコマンドを転送する。
【００２５】
この際、オープンポートMP５２は、キャッシュメモリ２６をリードアクセスまたはライトアクセスし、キャッシュメモリ２６上に存在するリードデータまたはライトデータをホスト計算機１０に送信するための処理を実行する。
【００２６】
各メインフレームポートパッケージ２２は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク１８に接続された複数のポート（図示せず）と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うメインフレームポートマイクロプロセッサ（以下、MFポートMPと称する。）５４を備えている。
【００２７】
MFポートMP５４は、各ポートとネットワーク１８を介してホスト計算機１２と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK３６の中から、コマンドの転送先となるMPPK３６を特定し、特定したMPPK３６に対して、スイッチパッケージ３０を介してコマンドを転送する。
【００２８】
この際、MFポートMP５４は、キャッシュメモリ２６をリードアクセスまたはライトアクセスし、キャッシュメモリ２６上に存在するリードデータまたはライトデータをホスト計算機１２に送信するための処理を実行する。
【００２９】
ドライブポートパッケージ２４は、ディスクアダプタあるいは第二のインターフェース部として、内部ネットワーク５０に接続された複数のポート（図示せず）と、記憶装置３４との間でデータの入出力処理を行うドライブポートマイクロプロセッサ（以下、ドライブポートMPと称する。）５６を備えている。
【００３０】
ドライブポートMP５６は、例えば、オープンポートMP５２またはMFポートMP５４からのリードアクセスまたはライトアクセスに応答して、記憶装置３４内の指定のHDD３８をアクセス対象として、アクセス対象のHDD３８からデータを読み出し、読み出したデータをオープンポートMP５２またはMFポートMP５４に転送し、あるいはアクセス対象のHDD３８に対してデータを書き込むようになっている。
【００３１】
この際、各HDD３８の記憶領域には、ホスト計算機１０、１２から参照できる論理的な記憶装置である複数の仮想デバイスとして、複数の論理デバイス（LDEV;Logical DEVice）または複数の論理ボリューム（LV；Logical  Volume）、あるいは複数の論理ユニット（LU；Logical  Unit）が割り当てられている。また、複数のHDD３８でRAID（Redundant
Array of Inexpensive Disks）グループを構成した場合、RAIDグループの記憶領域を複数の論理デバイス、あるいは複数の論理ユニットの記憶領域として用いることもできる。
【００３２】
キャッシュメモリ２６は、各ポートMP５２、５４、５６の処理に伴うデータなどを一時的に記憶する記憶部として構成されている。
【００３３】
共有メモリ２８は、＃０〜＃３のMPPK３６で共通となる制御情報や各種テーブルに関する情報などを記憶する記憶部として構成されている。
【００３４】
管理用端末３２は、＃０〜＃３のMPPK３６などに対して、各種設定をオペレータが自動または手動で行うための情報を入力する端末装置として構成されている。
【００３５】
＃０〜＃３のMPPK３６は、記憶部６２と、複数のマイクロプロセッサ、例えば、＃０〜＃３のマイクロプロセッサ（Micro Processor、以下、MPと称する。）６４を備え、コマンドで指定されたデータの入出力処理を担当する制御部６０として機能し、記憶部６２および各MP６４が、バス６６を介して互いに接続されている。
【００３６】
記憶部６２は、パッケージメモリ（Package Memory、以下、PMと称する。）６８と、各MP６４に対応して設けられたローカルメモリ（Local Memory、以下、LMと称する。）７０から構成されている。
【００３７】
PM６８は、共有メモリ２８に格納された制御情報と、各ポートMP５２、５４からのコマンドに関する情報および各種テーブルに関する情報などを格納する主メモリとして構成されている。
【００３８】
LM７０は、各MP６４の処理に伴うデータなどを格納する記憶領域として構成されている。
【００３９】
この際、各MP６４は、PM６８をアクセスし、PM６８に格納された情報にしたがって各仮想デバイスに対するデータの入出力処理（IO：INPUT  OUTPUT  処理）などを行うとともに、コマンドやデータなどをLM７０に格納する。
【００４０】
一方、図３に示すように、オープンポートパッケージ２０のローカルメモリ７２には、オープンINキュー７４と、MP検索テーブル７６に関する情報を格納するための領域が設けられている。オープンINキュー７４は、オープンポートパッケージ２０に設けられた複数のポート７８に対応した記憶領域として構成されており、オープンINキュー７４には、各ポート７８が受信したコマンドやコマンドに関する情報が順次格納される。
【００４１】
この際、オープンポートMP５２は、オープンINキュー７４に格納された情報を基にMP検索テーブル７６を検索して、コマンドなどの転送先となるMPPK３６を特定し、特定したMPPK３６にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK３６は、PM６８のオープンINキュー８０にコマンドなどを格納する。
【００４２】
PM６８のオープンINキュー８０は、複数のポート７８に対応した記憶領域として構成されており、オープンINキュー８０には、各ポート７８が受信したコマンドやコマンドに関する情報が、オープンポートMP５２の処理に従って順次格納される。
【００４３】
同様にして、メインフレームポートパッケージ２２のローカルメモリ８２は、メインフレームINキュー８４とMP検索テーブル８６を備えている。メインフレームINキュー８４は、メインフレームポートパッケージ２２に設けられた複数のポート８８に対応した記憶領域として構成されており、メインフレームINキュー８４には、各ポート８８が受信したコマンドやコマンドに関する情報が順次格納される。
【００４４】
この際、MFポートMP５４は、メインフレームINキュー８４に格納された情報を基にMP検索テーブル８６を検索して、コマンドなどの転送先となるMPPK３６を特定し、特定したMPPK３６にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK３６は、PM６８のメインフレームINキュー９０にコマンドなどを格納する。
【００４５】
PM６８のメインフレームINキュー９０は、複数のポート８８に対応した記憶領域として構成されており、メインフレームINキュー９０には、各ポート８８が受信したコマンドやコマンドに関する情報が、MFポートMP５４の処理に従って順次格納される。
【００４６】
図４に、オープン系ホスト計算機に適用されるホストコマンド（標準化されたコマンド）用MP検索テーブル７６の例を示す。
【００４７】
ホストコマンド用MP検索テーブル７６は、ポート番号１００と、ソースID１０２と、LUN番号１０４と、宛先MPPK番号１０６から構成されている。ポート番号１００には、各ポート７８の番号が格納され、ソースID１０２には、ホスト計算機１０を識別するための番号が格納される。LUN番号１０４には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号１０６には、コマンドに関する情報の宛先（転送先）となるMPPK３６の番号が格納される。
【００４８】
図５に、オープン系ホスト計算機に適用されるベンダ固有コマンド（各ベンダが独自に規定するコマンド）用検索テーブル７７の例を示す。
【００４９】
MP検索テーブル７７は、LUN番号１０８と、宛先MPPK番号１１０から構成されている。LUN番号１０８には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号１１０には、コマンドやコマンドに関する情報の宛先（転送先）となるMPPK３６の番号が格納される。なお、MP検索テーブル８６もMP検索テーブル７６と同様に構成することができる。
【００５０】
一方、各PM６８におけるオープンINキュー８０と、メインフレームINキュー９０は、図６に示すように、各ポート７８、８８に対応した数のキュー８１、９１を備えている。例えば、オープンINキュー８０は、＃０〜＃Mのポート７８に対応して、＃０〜＃Mのキュー８１を備えている。メインフレームINキュー９０は、＃０〜＃Nのポート８８に対応して、＃０〜＃Nのキュー９１を備えている。
【００５１】
この際、各MPPK３６に属する各MP６４は、それぞれPM６８内のオープンINキュー８０内の任意のキュー８１や、メインフレームINキュー９０内の任意のキュー９１をアクセスし、各キュー８１またはキュー９１に格納されたコマンドなどの処理を実行することができる。例えば、各MP６４は、各キュー８１または各キュー９１をアクセスするためのポートスキャンを実行し、ポートスキャンで得られたコマンドなどの処理を実行する。
【００５２】
次に、各MP６４のポートスキャンの処理を図７のフローチャートと図８のシーケンス図にしたがって説明する。
【００５３】
各MP６４は、例えば、ホスト計算機１０からのコマンドに関する処理を実行する場合、各ポート７８に対応したキュー８１をアクセスするために、チェック対象ポートに関する情報を取得する（S１）。
【００５４】
例えば、＃０のMP６４は、チェック対象ポートに関する情報を取得するために、タイミングT１でチェック対象ポートに対応するキュー８１をアクセスし、＃１のMP６４は、チェック対象ポートに関する情報を取得するために、タイミングT２でチェック対象ポートに対応したキュー８１をアクセスし、＃２のMP６４は、チェック対象ポートに関する情報を取得するために、タイミングT３でチェック対象ポートに対応するキュー８１をアクセスする。
【００５５】
次に、＃０のMP６４は、例えば、＃０のキュー８１をアクセスした場合、タイミングT４で＃０のキュー８１に対するロック（アクセス権）を取得する（S２）。このとき、＃１のMP６４は、タイミングT５で＃０のキュー８１をアクセスし、＃０のキュー８１に対して、ロックを取得しようとしても、＃０のMP６４との間でロック競合が生じることになる。
【００５６】
この後、＃０のMP６４は、ロックが取れたか否かを判定し（S３）、ロックが取れないときには、ステップS６の処理に移行し、ロックが取れたときにはタイミングT６で＃０のキュー８１にIO（INPUT  OUTPUT）情報（入出力処理に関する情報）が存在するか否かをチェックする（S４）。
【００５７】
このとき、＃０のMP６４は、＃０のキュー８１にIO情報が存在しないときには、ステップS６の処理に移行し、＃０のキュー８１にIO情報が存在するときには、タイミングT７において、＃０のキュー８１に存在するIO情報をローカルメモリ７０にコピーし（S５）、タイミングT８で、PM６８に対して、＃０のキュー８１に対する処理が終了したとして、アンロックを行い（S６）、このルーチンでの処理を終了する。
【００５８】
この後、＃０のMP６４は、ローカルメモリ７０に格納されたIO情報を基にIO処理を開始する。なお、＃２のMP６４がタイミングT９でPM６８に対してロック取得を行い、その後、タイミングT１０において、チェック対象ポートに対応したキュー８１をアクセスしたときに、アクセス先のキュー８１にIO情報が存在しないときには、ポートイベントの空振りとなり、タイミングT１１で、PM６８に対してアンロックを行うことになる。
【００５９】
ここで、ポートイベントとは、コマンド、新規IO、転送完了通知などの情報がポート７８、８８を介してオープンINキュー８０またはメインフレームINキュー９０に入力されることを意味し、ポートイベントの空振りとは、オープンINキュー８０のキュー８１またはメインフレームINキュー９０のキュー９１に、コマンド、新規IO、転送完了通知などの情報が存在しない状態を意味する。
【００６０】
次に、リード処理のシーケンスを図９と図１０にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機１０としているが、コマンドの発行元をホスト計算機１２としても同様に行うことができる。
【００６１】
まず、タイミングT２１でホスト計算機１０からのリードコマンドをオープンポートMP５２が受信すると、オープンポートMP５２は、受信したリードコマンドを基にMP検索テーブル７６を検索し、リードコマンドにしたがって転送先のMPPK３６を特定し、特定したMPPK３６のPM６８に対して、タイミングT２２でリードコマンドを転送する。
【００６２】
例えば、オープンポートMP５２は、ホスト計算機１０から、複数の仮想デバイスのうちの一の仮想デバイス（例えば、一の論理ユニット）に対するデータの入出力要求として、リードコマンドを受けたときには、このリードコマンドに基づいて、複数の制御部６０の中から、一の仮想デバイスに対するリード処理を担当する制御部６０を特定し、特定した制御部６０が属するMPPK３６を転送先として、転送先のMPPK３６にリードコマンドを転送する。
【００６３】
このときリードコマンドを受信したMPPK３６内においては、各MP６４が非同期でPM６８に対してポートスキャンを実施している。例えば、＃１のMP６４がタイミングT２３でPM６８に対してポートスキャンを開始し、例えば、＃１のキュー８１を検索する。このとき、タイミングT２４で、＃２のMP６４がPM６８に対してポートスキャンを開始し、PM６８の＃１のキュー８１をアクセスすると、＃２のMP６４は、＃１のMP６４との間にロック競合が発生する。
【００６４】
一方、＃１のMP６４が＃１のキュー８１に対してポートスキャンを実施し、＃１のキュー８１に対してロックを取得した後、＃１のキュー８１にリードコマンドが存在しているときには、タイミングT２５で＃１のLM７０にリードコマンドを格納する。
【００６５】
次に、＃１のMP６４は、タイミングT２６で＃１のLM７０に格納されたリードコマンドを読み出してコマンドを解析する。この後、＃１のMP６４は、タイミングT２７で、リードコマンドにしたがって、PM６８に格納された制御情報をアクセスしてコマンド処理を開始する。
【００６６】
例えば、＃１のMP６４は、PM６８に格納された制御情報を基にリードコマンドで指定されたリードデータがキャッシュメモリ２６に存在するか否かの判定を行い、リードデータがキャッシュメモリ２６に存在するときには、ヒットとして、オープンポートMP５２に対して、キャッシュメモリ２６に存在するリードデータをアクセス先とする処理を行う。この場合、オープンポートMP５２は、キャッシュメモリ２６に存在するリードデータを読み出して、ホスト計算機１０へ転送する。
【００６７】
一方、キャッシュメモリ２６にリードデータが存在しないときには、＃１のMP６４は、ミスヒットとして、ドライブポートMP５６に対して、一の仮想デバイスに対するリードアクセスを指示する。この場合、ドライブポートMP５６は、一の仮想デバイスに対するリードアクセスで得られたリードデータをキャッシュメモリ２６に転送する。この後、オープンポートMP５２は、キャッシュメモリ２６からリードデータを読み出して、ホスト計算機１０へ転送するか、またはドライブポートMP５６から転送されたリードデータをホスト計算機１０へ転送する。
【００６８】
次に、タイミングT２８において、＃１のMP６４は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP５２へ転送するとともに、オープンポートMP５２に対して、転送パラメータをホスト計算機１０へ転送するための転送を起動し、その後、処理待ち状態となる。
【００６９】
次に、図１０に示すように、＃１のMP６４が処理待ち状態となっているときに、タイミングT２９で、転送完了通知がオープンポートMP５２に入力されると、オープンポートMP５２は、転送完了通知を基に、タイミングT２８で転送パラメータを作成したMP６４が属するMPPK３６を特定し、特定したMPPK３６に対して、タイミングT３０で転送完了通知を送る。この転送完了通知は、オープンポートMP５２で特定されたMPPK３６のオープンINキュー８０うち、＃１のキュー８１に格納される。
【００７０】
次に、タイミングT３１で、＃２のMP６４がPM６８に対してポートスキャンを行い、オープンINキュー８０のうち＃１のキュー８１をアクセスすると、＃２のMP６４は、＃１のキュー８１に格納されていた情報として、転送完了通知を、タイミングT３２で＃２のLM７０に格納する。
【００７１】
タイミングT３３で、＃２のMP６４が＃２のLM７０をアクセスし、＃２のLM７０に存在する転送完了通知は、＃１のMP６４に対する転送完了通知であることをチェックしたときには、＃２のMP６４は、タイミングT３４で、転送完了通知の再送信として、＃１のMP６４に対する転送完了通知を＃１のLM７０に返送する。
【００７２】
一方、タイミングT３５で、＃１のMP６４がPM６８に対してポートスキャンを行い、＃１のキュー８１をアクセスしたときに、＃１のキュー８１に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT３６で処理を再開する。
【００７３】
処理を再開した、＃１のMP６４は、タイミングT３７で＃１のLM７０をアクセスし、転送完了通知を受領した場合、タイミングT３８で転送完了通知をチェックする。このとき、転送完了通知が、＃１のMP６４に対する転送完了通知である判定したときには、＃１のMP６４は、タイミングT３９で、１つのIO処理（ジョブ）が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT３９でオープンポートMP５２に対して送信し、リード処理を終了する。
【００７４】
次に、ライト処理のシーケンスを図１１と図１２にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機１０としているが、コマンドの発行元をホスト計算機１２としても同様に行うことができる。
【００７５】
まず、タイミングT４１でホスト計算機１０からのライトコマンドをオープンポートMP５２が受信すると、オープンポートMP５２は、受信したライトコマンドを基にMP検索テーブル７６を検索し、ライトコマンドにしたがって転送先のMPPK３６を特定し、特定したMPPK３６のPM６８に対して、タイミングT４２でライトコマンドを転送する。
【００７６】
例えば、オープンポートMP５２は、ホスト計算機１０から、複数の仮想デバイスのうちの一の仮想デバイス（例えば、一の論理ユニット）に対するデータの入出力要求として、ライトコマンドを受けたときには、このライトコマンドに基づいて、複数の制御部６０の中から、一の仮想デバイスに対するライト処理を担当する制御部６０を特定し、特定した制御部６０が属するMPPK３６を転送先として、転送先のMPPK３６にライトコマンドを転送する。
【００７７】
このときライトコマンドを受信したMPPK３６内においては、各MP６４が非同期でPM６８に対してポートスキャンを実施している。例えば、＃１のMP６４がタイミングT４３でPM６８に対してポートスキャンを開始し、例えば、＃１のキュー８１を検索する。このとき、タイミングT４４で、＃２のMP６４がPM６８に対してポートスキャンを開始し、PM６８の＃１のキュー８１をアクセスすると、＃２のMP６４は、＃１のMP６４との間にロック競合が発生する。
【００７８】
一方、＃１のMP６４が＃１のキュー８１に対してポートスキャンを実施し、＃１のキュー８１に対してロックを取得したあと、＃１のキュー８１にライトコマンドが存在しているときには、タイミングT４５で＃１のLM７０にライトコマンドを格納する。
【００７９】
次に、＃１のMP６４は、タイミングT４６で＃１のLM７０に格納されたライトコマンドを読み出してコマンドを解析する。この後、＃１のMP６４は、タイミングT４７で、ライトコマンドにしたがって、PM６８に格納された制御情報をアクセスしてコマンド処理を開始する。
【００８０】
例えば、＃１のMP６４は、PM６８に格納された制御情報を基にライトコマンドで指定されたライトデータを格納すべき領域がキャッシュメモリ２６に存在するか否かの判定を行い、ライトデータを格納すべき領域がキャッシュメモリ２６に存在するときには、オープンポートMP５２に対して、キャッシュメモリ２６をライトデータのアクセス先とする処理を行う。この場合、オープンポートMP５２は、ホスト計算機１０から転送されたライトデータをキャッシュメモリ２６に格納する。キャッシュメモリ２６に格納されたライトデータは、その後、ドライブポートMP５６によって、一の仮想デバイスに格納される。
【００８１】
一方、キャッシュメモリ２６にライトデータを格納すべき領域が存在しないときには、＃１のMP６４は、ドライブポートMP５６に対して、キャッシュメモリ２６上のデータを一の仮想デバイスに出力させる指示を行い、キャッシュメモリ２６上に空き領域を形成させる。その後、オープンポートMP５２は、ホスト計算機１０から転送されたライトデータをキャッシュメモリ２６の空き領域に格納する。
【００８２】
次に、タイミングT４８において、＃１のMP６４は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP５２へ転送するとともに、オープンポートMP５２に対して、転送パラメータをホスト計算機１０へ転送するための転送を起動し、その後、処理待ち状態となる。
【００８３】
次に、図１２に示すように、＃１のMP６４が処理待ち状態となっているときに、タイミングT４９で、転送完了通知がオープンポートMP５２に入力されると、オープンポートMP５２は、転送完了通知を基に、タイミングT４８で転送パラメータを作成したMP６４が属するMPPK３６を特定し、特定したMPPK３６に対して、タイミングT５０で転送完了通知を送る。この転送完了通知は、オープンポートMP５２で特定されたMPPK３６のオープンINキュー８０うち、＃１のキュー８１に格納される。
【００８４】
次に、タイミングT５１で、＃２のMP６４がPM６８に対してポートスキャンを行い、オープンINキュー８０のうち＃１のキュー８１をアクセスすると、＃２のMP６４は、＃１のキュー８１に格納されていた情報として、転送完了通知を、タイミングT５２で＃２のLM７０に格納する。
【００８５】
タイミングT５３で、＃２のMP６４が＃２のLM７０をアクセスし、＃２のLM７０に存在する転送完了通知は、＃１のMP６４に対する転送完了通知であることをチェックしたときには、＃２のMP６４は、タイミングT５４で、転送完了通知の再送信として、＃１のMP６４に対する転送完了通知を＃１のLM７０に返送する。
【００８６】
一方、タイミングT５５で、＃１のMP６４がPM６８に対してポートスキャンを行い、＃１のキュー８１をアクセスしたときに、＃１のキュー８１に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT５６で処理を再開する。
【００８７】
処理を再開した、＃１のMP６４は、タイミングT５７で＃１のLM７０をアクセスし、転送完了通知を受領した場合、タイミングT５８で転送完了通知をチェックする。このとき、転送完了通知が、＃１のMP６４に対する転送完了通知である判定したときには、＃１のMP６４は、タイミングT５９で、１つのIO処理（ジョブ）が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT５９でオープンポートMP５２に対して送信し、ライト処理を終了する。
【００８８】
各MP６４がリード処理またはライト処理を行うに際して、複数のMP６４から同一のキュー８１またはキュー９１に対してポートスキャンを実施すると、ロック競合が発生することがある。このロック競合は、各MPPK３６に属するMP６４の数が増える程頻発することになり、ロック競合により、IO処理時間が増大することになる。
【００８９】
また、複数のMP６４から同一のキュー８１またはキュー９１に対してポートスキャンを実施すると、転送完了通知など、ポートイベントに伴う情報が他のMP６４に取得され、ポートイベントの空振りが発生することがある。このポートイベントの空振りは、各MPPK３６に属するMP６４の数が増える程増加し、IO処理時間が増大することになる。
【００９０】
そこで、本実施例では、以下に示すように、複数のポート７８、８８のうちポートイベントのないポート（コマンドや転送完了通知などの情報が入力されないポート）を各ポートMP５２、５４のチェック対象ポートから除外することとしている。
【００９１】
例えば、各MPPK３６に属するMP６４のチェック対象キュー（検索対象）として、ポートイベントのないポートに対応したキュー８１またはキュー９１をチェック対象キューから除外することとしている。
【００９２】
この際、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド（入出力要求）を得たときには、このコマンド（入出力要求）が格納されたキューに対応するポートに入力されたコマンド（入出力要求）の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【００９３】
また、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうち仮想デバイスが予め割り付けられた（LU定義された）ポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド（入出力要求）を得たときには、このコマンド（入出力要求）が格納されたキューに対応するポートに入力されたコマンド（入出力要求）の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【００９４】
さらに、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうち、コマンド（入出力要求）を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド（入出力要求）を得たときには、このコマンド（入出力要求）が格納されたキューに対応するポートに入力されたコマンド（入出力要求）の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【００９５】
また、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、検索対象のキューに対するポートスキャンを実行し、このポートスキャンの実行によって、コマンド（入出力要求）を得たときには、このコマンド（入出力要求）が格納されたキューに対応するポートに入力されたコマンド（入出力要求）の処理を実行し、検索対象のキューのうち、ポートスキャンの実行によって、コマンド（入出力要求）が存在しないキューを検索対象のキューから除外して、検索対象のキューを更新し、その後のポートスキャンでは、更新した検索対象のキューに対して、ポートスキャンを実行することができる。
【００９６】
このように、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、各MP６４の検索対象なるキュー８１、９１の数が減少するので、各キュー８１、９１に格納されたコマンド（入出力要求）などの情報の検出を高速に行うことができる。
【００９７】
また、以下の実施例においては、各MPPK３６に属するMP６４とポート７８またはポート８８との対応関係、具体的には、各MPPK３６に属する各MP６４と各キュー８１または各キュー９１との対応関係を各MP６４の負荷情報を基に動的に切り替えるために、各ポート７８、８８に入力された情報に関する処理モードとして、占有モードまたは共有モードを採用し、占有モードまたは共有モードにしたがってIO処理を実行することとしている。
【００９８】
例えば、各MPPK３６に属する各MP６４は、各キュー８１または各キュー９１をアクセスして、各ポート７８またはポート８８に関する負荷情報として、低負荷状態を示す負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、占有モードを選択し、高負荷状態を示す負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、共有モードを選択することができる。
【００９９】
また、各MPPK３６に属する各MP６４は、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理に要する処理時間を設定時間毎に計測するとともに、各計測値を順次更新し、コマンド（入出力要求）を受信したときに、更新した各計測値と閾値とを比較し、比較結果から、各ポート７８またはポート８８に関する負荷情報として、コマンド（入出力要求）の処理に要する処理時間が閾値を下回る負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、占有モードを選択し、前記比較結果から、各ポート７８またはポート８８に関する負荷情報として、コマンド（入出力要求）の処理に要する処理時間が閾値を上回る負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、共有モードを選択することができる。
【０１００】
さらに、各MPPK３６に属する各MP６４は、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理に伴うMP稼働率（マイクロプロセッサ稼働率）を算出するとともに、算出したMP稼働率から各ポート７８またはポート８８に関するポート稼働率をそれぞれ算出し、コマンド（入出力要求）を受信したときに、算出した各ポート稼働率の高低を判定し、この判定結果から、各ポート７８またはポート８８に関する負荷情報として、算出したポート稼働率が低い値を示す負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、占有モードを選択し、前記判定結果から、各ポート７８またはポート８８に関する負荷情報として、算出したポート稼働率が高い値を示す負荷情報を得たときには、各ポート７８またはポート８８に入力されたコマンド（入出力要求）の処理として、共有モードを選択することができる。
【０１０１】
ここで、占有モードとは、１つのポート７８または８８に入力された情報に関する処理、例えば、IO処理を１つのMP６４で占有するモード、すなわち、１つのキュー８１またはキュー９１に格納された情報に関する処理、例えば、IO処理を１つのMP６４で占有するモードである。
【０１０２】
一方、共有モードとは、１つのポート７８または８８に入力された情報に関する処理、例えば、IO処理を複数のMP６４で共有するモード、すなわち、１つのキュー８１または９１に格納された情報に関する処理、例えば、IO処理を複数のMP６４で共有するモードである。
【０１０３】
また、MP稼働率（マイクロプロセッサ稼働率）とは、単位時間当たりのMP６４の利用率を示し、ポート稼働率とは、MP稼働率をポート７８または８８ごとの粒度に分解した値を示す。
【０１０４】
占有モードを用いた場合、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、チェックすべきキュー数（ポート数）を削減することができるとともに、ロック競合が発生するのを防止することができる。また、各MP６４は、自MP６４で処理するのに必要なポートイベントに関する情報を他のMP６４に取得されるのを防止することができる。
【０１０５】
ただし、占有モードを用いた場合、１つのポートについてのIO処理性能（１つのキューについてのIO処理性能）が１つのMP６４の処理能力で限界になることがある。この場合、スループットが低下することになる。また、MP６４が故障したときには、そのままでは、故障したMP６４が担当していた処理が実行されなくなることを考慮する必要がある。
【０１０６】
一方、共有モードを用いてIO処理を行うと、各制御部６０に属する各MP６４は、１つのキュー（１つのポート）に関するIO処理を複数のMP６４で共有するため、占有モードでIO処理するときよりも、IO処理性能が高くなる。
【０１０７】
ただし、各制御部６０に属する各MP６４は、共有モードを用いると、ロック競合に伴ってオーバーヘッドが増加することがある。また他のMP６４に、自MP６４のIO処理に必要なポートイベントに関する情報を取得され、オーバーヘッドの増加に伴ってレスポンスタイムが遅延することを考慮する必要がある。
【０１０８】
ポート７８、８８のうちポートイベントのないポートをチェック対象ポートから除外するに際しては、後述するように、マスタビットマップテーブル１２０、１２４（図１３、図１４参照）、ポートスキャンビットマップテーブル１２６（図１５参照）、イベントビットマップテーブル１２８（図１６参照）、LDEV‐ポート対応テーブル１３０（図１７参照）を用い、各MP６４とポート７８、８８との対応関係を動的に切り替えるに際しては、ポート稼働率テーブル１４０（図２３参照）とポート稼働率‐MP数対応テーブル１４６（図２４参照）を用いることとしている。
【０１０９】
この際、各MPPK（制御部）３６の管理対象となる仮想デバイス（LDEV）と各MPPK（制御部）３６との関係を定義したLDEV−MPPK（仮想デバイス・制御部対応テーブル）１３６を基に各仮想デバイス（LDEV）と各ポートとの関係を規定したLDEV‐ポート対応テーブル（仮想デバイス・ポート対応テーブル）１３０を作成し、LDEV‐ポート対応テーブル１３０を基に、複数のポートのうちポートスキャンの対象となるポートを各MP６４に対して割り付けたマスタビットマップテーブル１２４を生成し、マスタビットマップテーブル１２４を基に、複数のポートのうちポートスキャンの対象となるポートを各MP６４に対して割り付けたポートスキャンビットマップテーブル１２６を生成することとしている。
【０１１０】
この場合、各MP６４は、ポートスキャンビットマップテーブル１２６に従ってポートスキャンの対象となるポートに対するポートスキャンを行ってポートイベントの有無を検出し、ポートスキャンによってポートイベントが検出されたポートを各MP６４に対して割り付けたイベントビットマップテーブル１２８を生成し、イベントビットマップテーブル１２８の内容をポートスキャンビットマップテーブル１２６に反映し、イベントビットマップテーブル１２８の内容が反映されたポートスキャンビットマップテーブル１２６に従ってポートスキャンの対象となるポートに対するポートスキャンを行って、IO処理を実行することとしている。以下、具体的な内容について説明する。
【０１１１】
図１３に、マスタビットマップテーブル１２０の例を示す。マスタビットマップテーブル１２０は、各MP６４のチェック対象ポートを示したビットマップテーブルであって、MP番号１２２と、＃０〜＃N−１のポート番号１２３から構成されている。
【０１１２】
MP番号１２２のエントリには、＃０〜＃３のMP６４の番号が格納され、各ポート番号１２３のエントリには、＃０〜＃３のMP６４に関するビットマップとして“１”または“０”の情報が格納される。なお、最下段のエントリには、処理MP数が各ポート番号１２３に対応して格納される。
【０１１３】
この際、＃０〜＃３のMP６４に関するビットマップとして、各ポート番号１２３には、各MP６４のチェック対象ポートに対しては、“１”が格納され、各MP６４のチェック対象ポートから外れたポートに対しては、“０”が格納される。
【０１１４】
図１３の例では、＃０のMP６４は、＃０のポート番号１２３のポートをチェック対象ポートとし、＃１のMP６４は、＃１のポート番号１２３のポートをチェック対象ポートとし、＃２のMP６４は、＃２のポート番号１２３のポートをチェック対象ポートとしている。また＃０〜＃２のMP６４は、＃３のポート番号１２３に対応したポートをそれぞれチェック対象ポートとしている。＃０、＃１のMP６４は、＃N−１のポート番号１２３に対応したポートをチェック対象ポートとしている。
【０１１５】
すなわち、＃０〜＃２のポート番号１２３に対応したポートは、１つのMP６４のみが処理を行う占有ポートとなり、＃３と＃N−１のポート番号１２３に対応したポートは、２以上のMP６４が処理を担当する共有ポートとなる。
【０１１６】
ここで、マスタビットマップテーブル１２０は、その一部を省略すると、例えば、図１４に示すように、マスタビットマップテーブル１２４として表すことができる。このマスタビットマップテーブル１２４から、図１５に示すポートスキャンビットマップテーブル１２６を生成することができる。
【０１１７】
ポートスキャンビットマップテーブル１２６は、マスタビットマップテーブル１２４の内容をコピーして作成したものであって、各MP６４が、＃０〜＃N−１のポートに対応したキュー８１またはキュー９１をポートスキャンし、新規IOや転送完了通知などのポートイベントを検出するために用いられる。
【０１１８】
すなわち、ポートスキャンビットマップテーブル１２６は、各MP６４がポートスキャンを行う際に用いるビットマップテーブルとして構成されている。各MP６４が、ポートスキャンビットマップテーブル１２６に従ってポートスキャンを実施し、ポートイベントを検出したときには、この検出結果が、図１６に示すイベントビットマップテーブル１２８に反映されるようになっている。
【０１１９】
イベントビットマップテーブル１２８は、ポートイベントの検出の有無を記録するテーブルであって、各MP６４によってポートイベントが検出されたときに、各ポートイベントの検出されたポートを記録するためのビットマップテーブルである。
【０１２０】
この際、各MP６４によってポートイベントが開始される前は、イベントビットマップテーブル１２８の全てのビットは“０”になっている。各MP６４が、ポートスキャンビットマップテーブル１２６に従ってポートスキャンを行って、キュー８１またはキュー９１に対応したポートでポートイベントが検出されないときには、イベントビットマップテーブル１２８のビットは、“０”のままであるが、キュー８１またはキュー９１に対応したポートでポートイベントが検出されたときには、イベントビットマップテーブル１２８のうち、ポートイベントが検出されたポートのビットが“０”から“１”に反転する。
【０１２１】
例えば、＃１のMP６４がポートスキャンビットマップテーブル１２６にしたがって＃１のポートをポートスキャンし、＃２のMP６４がポートスキャンビットマップテーブル１２６にしたがって＃２のポートをポートスキャンしたときに、＃１のポートと＃２のポートでポートイベントが検出されなかったときには、イベントビットマップテーブル１２８のうち、＃１のMP６４に対応した＃１のポートのビットと＃２のMP６４に対応した＃１のポートのビットは、それぞれ“０”である。
【０１２２】
一方、＃０のMP６４がポートスキャンビットマップテーブル１２６にしたがって＃０のポートをポートスキャンし、＃０〜＃２のMP６４がポートスキャンビットマップテーブル１２６にしたがって＃３のポートをポートスキャンし、＃０〜＃１のMP６４がポートスキャンビットマップテーブル１２６にしたがって＃N−１のポートをポートスキャンし、各ポートでポートイベントが検出されたときには、イベントビットマップテーブル１２８のうち、＃０のMP６４に対応した＃０のポートのビットと、＃０〜＃２のMP６４に対応した＃３のポートのビットと、＃０〜＃１のMP６４に対応した＃N−１のポートのビットは、それぞれ“０”から“１”に反転する。
【０１２３】
このように、ポートイベントが検出されたポートに対して、イベントマップテーブル１２８に“１”のビット情報を格納し、ポートイベントが検出されないポートに対して、イベントマップテーブル１２８に“０”のビット情報を格納することで、ポートイベントのないポートをチェック対象ポートから除外することができる。
【０１２４】
すなわち、ポートスキャンビットマップテーブル１２６を用いてポートスキャンを行って、ポートイベントの検出の有無をイベントビットマップテーブル１２８に反映した後、次回のポートスキャンのときには、ポートイベントの検出の有無が反映されたイベントビットマップテーブル１２８を用いてポートスキャンを行うことで、各MP６４は、各ポートについて“０”のビット情報が格納されているポートに対しては、ポートスキャンを省略することができる。
【０１２５】
次に、LDEV‐ポート対応テーブル１３０の例を図１７に示す。LDEV‐ポート対応テーブル１３０は、各LDEVがLU定義されたポートの一覧を示すテーブルであって、各LDEVがLU定義されていないポートをチェック対象ポートから除外するために用いられる。
【０１２６】
このLDEV‐ポート対応テーブル１３０は、LDEV番号１３２と、＃０から＃Xのポート番号１３４から構成されている。LDEV番号１３２には、LDEV番号が格納され、ポート番号１３４には、LDEVがLU定義されたポートに対しては、“１”のデータが格納され、LDEVがLU定義されていないポートに対しては、“０”のデータが格納される。
【０１２７】
LDEV‐ポート対応テーブル１３０は、図１８に示すように、共有メモリ２８に格納されたLDEV‐MPPK対応テーブル１３６を基に生成され、共有メモリ２８に格納された後、各MPPK３６のPM６８にコピーされるようになっている。各PM６８にコピーされたLDEV‐ポート対応テーブル１３０は、マスタビットマップテーブル１２０、１２４の生成に用いられる。このため、LDEVがLU定義されたポートに関する情報をマスタビットマップテーブル１２０、１２４に反映し、このマスタビットマップテーブル１２０、１２４に従ってポートスキャンビットマップテーブル１２６を生成することで、各LDEVがLU定義されたポートをチェック対象ポートから除外するができる。
【０１２８】
例えば、図１７に示すLDEV‐ポート対応テーブル１３０の場合、＃０のLDEVは、＃０のポートに対してLU定義され、＃１０のLDEVは、＃１のポートに対してLU定義されている。これに対して、＃０のLDEVと＃１０のLDEVは、＃２〜＃Xのポートに対しては、LU定義されていない。このため、＃０のLDEVと＃１０のLDEVに関するポートとして、＃０のポートと＃１のポートをチェック対象ポートとし、＃２〜＃Xのポートをチェック対象ポートから除外することができる。
【０１２９】
次に、３種類のビットマップテーブルの初期設定処理を図１９のフローチャートにしたがって説明する。
【０１３０】
まず、３種類のビットマップテーブルを初期化するに際して、全ポートに対して以下の処理を実施する。まず、各MPPK３６に属するMP６４のうちいずれか１つのMP６４は、図２０に示すLDEV‐ポート対応テーブル１３０を参照し、各ポートについてビットが“１”（ON）か否かを判定し（S１１）、ビットが“１”でないと判定したときには、図２１に示すマスタビットマップテーブル１２４のビットを“０”（OFF）とし（S１２）、ステップS１４の処理に移行する。
【０１３１】
一方、ステップS１１において、ビットが“１”であると判定したときには、MP６４は、＃０〜＃３のMP６４のうち＃０のMP６４から＃１、＃２、＃３のMP６４の順に、各ポートについて、LDEV‐ポート対応テーブル１３０にしたがってポート割り付けを行う（S１３）。すなわち、図２１に示すマスタビットマップテーブル１２４の各ポートに対して、ビットオンとするための処理として、“１”のデータを格納する。例えば、LDEV‐ポート対応テーブル１３０を基に、＃０、＃１のポートについては、＃０〜＃３のMP６４に対して“１”のデータを格納する。
【０１３２】
この後、MP６４は、全てのポートについての処理を終えたか否かを判定し、全てのポートに対する処理を終えていないときには、ステップS１１に戻り、ステップS１１からステップS１４の処理を繰り返し、全てのポートに対する処理を終了したときには、マスタビットマップテーブル１２４のデータをポートスキャンビットマップテーブル１２６にコピーする処理を行う（S１５）。この後、MP６４は、イベントビットマップテーブル１２８の各ビットマップを全て０クリアとし（S１６）、このルーチンでの処理を終了する。
【０１３３】
なお、図２１に示すマスタビットマップテーブル１２４は、LU定義のないポートを抑止した状態、すなわち絞り込み前の状態を示しており、１ポートについて、１つのMP６４に絞り込んだときには、図２２に示すような構成となる。
【０１３４】
図２２に示す場合、＃０のMP６４は、＃０のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。また＃１のMP６４は、＃１のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。
【０１３５】
このように、LU定義のないポートは、IO情報を受領することがないため、各MP６４のポートスキャンのチェック対象ポートから除外することで、各MP６４のポートスキャンを高速化することができる。
【０１３６】
次に、図２３に、ポート稼働率テーブル１４０の構成を示す。ポート稼働率テーブル１４０は、各MP６４のポート稼働率を集計して記録するためのテーブルであって、MP番号１４２と＃０〜＃N−１のポート番号１４４から構成されている。
【０１３７】
図２３に示すポート稼働率テーブル１４０の例では、＃０のMP６４について、＃０のポートのポート稼働率が４０であることを示し、＃１のMP６４については、＃１のポートについてのポート稼働率が６０であることを示し、＃２のMP６４については、＃２のポートについてのポート稼働率が３０であることを示している。ポート稼働率テーブル１４０の最下欄は、各ポートに対するポート稼働率の合計を示している。
【０１３８】
次に、図２４に、ポート稼働率‐MP数対応テーブル１４６の構成を示す。ポート稼働率‐MP数対応テーブル１４６は、ポート稼働率によって各ポートの共有MP数（各ポートに関する処理を共有するMP６４の数）を決定するためのテーブルであって、ポート稼働率１４８とMP数１５０で構成されている。
【０１３９】
ポート稼働率１４８の各エントリには、例えば、「０〜４９」、「５０〜９９」、「１００〜１４９」、「１５０〜」がチューニングパラメータあるいは閾値として格納されている。各チューニングパラメータあるいは閾値に対して、MP数１５０の各エントリには、「１」、「２」、「３」、「４」が格納されている。
【０１４０】
この場合、ポート稼働率１４８のチューニングパラメータあるいは閾値が「０〜４９」のときには、各ポートに対して、１つのMP６４が割り付けられ、ポート稼働率１４８のチューニングパラメータあるいは閾値が「５０〜９９」のときには、各ポートに対して、２つのMP６４が割り付けられ、ポート稼働率１４８のチューニングパラメータあるいは閾値が「１００〜１４９」のときには、各ポートに対して、３つのMP６４が割り付けられ、ポート稼働率１４８のチューニングパラメータあるいは閾値が「１５０〜」のときには、各ポートに対して、４つのMP６４が割り付けられる。
【０１４１】
すなわち、図２４に示すポート稼働率‐MP数対応テーブル１４６を用いた場合、ポート稼働率１４８として「０〜４９」を用いるときには、１個のMP６４を用い、ポート稼働率１４８として「５０〜９９」を用いるときには、２個のMP６４を用い、ポート稼働率１４８として「１００〜１４９」を用いるときには、３個のMP６４を用い、ポート稼働率１４８として「１５０〜」を用いるときには、４個のMP６４を用いることになる。なお、これらの数値は、管理用端末３２から自動または手動で設定することができる。
【０１４２】
次に、LDEV‐ポート対応テーブル１３０の初期設定処理を図２５〜図２７のフローチャートおよび図２８のシーケンス図にしたがって説明する。
【０１４３】
まず、図２５に示すように、全てのMPPK３６に属する任意のMP６４、例えば、オーナー権を有するMP６４は、共有メモリ２８に格納されたLDEV−MPPK対応テーブル１３６を更新し（S２１）、共有メモリ２８に格納されたLDEV−ポート対応テーブル１３０を作成し（S２２）、このルーチンでの処理を終了する。
【０１４４】
次に、共有メモリ２８に格納されたLDEV‐ポート対応テーブル１３０を作成するに際しては、図２６に示すように、MP６４は、全てのLDEVに対して、以下の処理を実施する。
【０１４５】
まず、MP６４は、当該LDEVがLU定義されているポート一覧を共有メモリ２８から取得し（S３１）、各LDEVがLU定義されているか否かを判定し（S３２）、LDEVがLU定義されていないときにはステップS３１の処理に戻り、LDEVがLU定義されているときには、LDEV‐ポート対応テーブル１３０に“１”を設定し（S３３）、全てのLDEVをチェックしたか否かを判定し（S３４）、チェックしていないときにはステップS３１に戻り、チェックが全て完了したときには各MPPK３６に共有メモリ２８のLDEV‐ポート対応テーブル１３０に変更がある旨、すなわち、LDEV‐ポート対応テーブル１３０が新規に作成された旨を通知し（S３５）、このルーチンでの処理を終了する。
【０１４６】
次に、PM６８のLDEV‐ポート対応テーブル１３０を作成するに際しては、図２７に示すように、各MPPK３６に属するMP６４のうち１つのMP６４は、共有メモリ２８に格納されたLDEV‐ポート対応テーブル１３０に変更があるか否かを判定し（S４１）、変更がないときにはこのルーチンでの処理を終了し、変更があるときには、自MPPK３６がオーナーを有する全LDEVに対して以下の処理を実施する。
【０１４７】
すなわち、MP６４は、共有メモリ２８に格納されたLDEV‐ポート対応テーブル１３０の値を、PM６８に格納されたLDEV‐ポート対応テーブル１３０にコピーし（S４２）、次に、全LDEVについてチェックが終了したか否かを判定し（S４３）、全てのLDEVに対してチェックが終了していないときにはステップS４２に戻り、全てのLDEVに対するチェックが終了したときには、このルーチンでの処理を終了する。
【０１４８】
次に、各種テーブルの初期設定処理を図２８のシーケンスチャートにしたがって説明する。まず、全てのMPPK３６に属するMP６４のうち任意のMP６４、例えば、＃１のMPPKに属するMP６４は、タイミングT７１で共有メモリ２８に格納されたLDEV‐MPPK対応テーブル１３６を更新し、タイミングT３２で共有メモリ２８に格納されたLDEV‐ポート対応テーブル１３０を作成する。
【０１４９】
一方、各MPPK３６に属するMP６４のうち１つのMP６４は、タイミングT８１、T８２で、PM６８に格納されているポート稼働率テーブル１４０を初期化し、タイミングT８３、T８４で、PM６８に格納されたポート稼働率‐MP数対応テーブル１４６を初期化する。
【０１５０】
次に、各MPPK３６に属する任意の１つのMP６４は、タイミングT８５、T８６で、マスタビットマップテーブル１２４、ポートスキャンビットマップテーブル１２６、イベントビットマップテーブル１２８を作成し、作成した各テーブルをPM６８に格納する。
【０１５１】
次に、ポートスキャンビットマップ１２６とイベントビットマップ１２８を利用したときのポートスキャンの処理を図２９のフローチャートと図３０のシーケンス図にしたがって説明する。
【０１５２】
各MPPK３６に属するMP６４は、自MP６４のポートスキャンビットマップテーブル１２６を参照し、チェック対象ポートナンバーを取得する（S５１）。例えば、図３０に示すように、＃０のMP６４は、タイミングT９１でポートスキャンビットマップテーブル１２６を参照し、＃１のMP６４は、タイミングT９２でポートスキャンビットマップテーブル１２６を参照し、＃２のMP６４は、タイミングT９３でポートスキャンビットマップテーブル１２６を参照する。この際、各MP６４は、チェック対象ポート番号を取得するに際しては、ポートスキャンビットマップ１２６のうち“１”のポートのチェック対象ポートナンバーを取得する。
【０１５３】
次に、＃０のMP６４は、タイミングT９４でPM６８に対してロックを取得する。例えば、図１５に示すポートスキャンビットマップテーブル１２６にしたがって＃０のポートに対するロックを取得する（S５２）。この場合、タイミングT９５で＃１〜＃３のMP６４が＃０のポートに対してロックを取得するための処理を行っても、ロックの取得が阻止されることになる。
【０１５４】
この後、＃０のMP６４は、ロックが取れたか否かを判定し（S５３）、ロックが取れないときにはステップS５７の処理に移行し、ロックが取れたときには、タイミングT９６でポートINキュー８０または９０内のIO情報をチェックし、キュー８１または９１にIO情報が存在するか否かを判定し（S５４）、キュー８１または９１にIO情報が存在しないときにはステップS５７の処理に移行し、キュー８１または９１にIO情報が存在するときには、キュー８１またはキュー９１に存在するIO情報をタイミングT９７でLM７０にコピーし（S５５）、タイミングT９８で自MP６４のイベントビットマップテーブル１２８に“１”をタイミングT９８で設定する（S５６）。
【０１５５】
この後、＃０のMP６４は、タイミングT９９で、PM６８に対してアンロックを行い（S５７）、このルーチンでの処理を終了する。
【０１５６】
なお、＃２のMP６４は、タイミングT１００でPM６８に対してロック取得の処理を行い、その後、タイミングT１０１でポートINキュー８０または９０を参照し、キュー８１または９１にIO情報が存在しないときには空振りとなり、タイミングT１０２でPM６８に対してアンロックを行うことになる。
【０１５７】
次に、各テーブルを更新するための周期処理を図３１のシーケンス図にしたがって説明する。
【０１５８】
まず、ポートスキャンビットマップテーブル更新周期処理を行うに際して、各MPPK３６に属する各MP６４は、タイミングT１１１〜T１１４で、イベントビットマップテーブル１２８の内容をポートスキャンビットマップテーブル１２６にコピーし、ポートスキャンビットマップテーブル１２６を更新する。これにより、各MP６４は、ポートスキャンを行うときには、更新されたポートスキャンビットマップテーブル１２６にしたがって処理を行うことになる。
【０１５９】
次に、ポート稼働率採取周期処理を行うに際して、各MPPK３６に属する各MP６４は、タイミングT１１５〜T１１８で、ポート稼働率テーブル１４０の内容を集計する。すなわち、IO処理に伴ってポート稼働率が変化することを考慮し、各MPPK３６に属する各MP６４は、ポート稼働率採取周期毎にポート稼働率テーブル１４０の内容を集計することとしている。
【０１６０】
次に、ポート稼働率・MP数対応テーブル更新周期処理を行うに際して、各MPPK３６に属するMP６４のうち任意の１つのMP６４は、タイミングT１１９、T１２０で、ポート稼働率‐MP数対応テーブル１４６の内容を更新する。例えばポート稼働率１４８の各エントリの値を更新したり、あるいはMP数１５０の各エントリの数値を変更したりする処理を行う。
【０１６１】
次に、マスタビットマップテーブル更新周期処理を行うに際して、各MPPK３６に属するMP６４のうち任意の１つのMP６４は、タイミングT１２１、T１２２で、マスタビットマップテーブル１２４の内容を更新する。
【０１６２】
次に、ポートスキャンビットマップテーブルの更新方法を図３２のフローチャートにしたがって説明する。
【０１６３】
この処理は、一定周期で各MPPK３６に属する各MP６４によって実施される。まず、各MP６４は、ポートスキャンビットマップテーブル１２６を更新するに際して、自MP６４のマスタビットマップテーブル１２４の全ビットに対して以下の処理を実施する。
【０１６４】
まず、各MP６４は、ポートINキュー８０または９０をチェックし（S６１）、キュー８１または９１に、ポートイベントがあるか否かを判定し（S６２）、ポートイベントがないときにはステップS６１の処理に戻り、ポートイベントがあると判定したときには、図３３に示すように、イベントビットマップテーブル１２８に“１”のビットを立てる（S６３）。すなわち、イベントビットマップテーブル１２８のうち、ポートイベントが検出されないポートに対応したビットは“０”であるが、ポートイベントが検出されたポートに対応したビットは“１”となる。
【０１６５】
次に、各MP６４は、マスタビットマップテーブル１２４を参照し、マスタビットマップテーブル１２４を基に、イベントマップテーブル１２８で“１”のビットの立っていないビットを落とすための処理を行う（S６４）。
【０１６６】
この際、図３３に示すイベントビットマップテーブル１２８の内容を、図３４に示すポートスキャンビットマップテーブル１２６に反映すると、ポートスキャンビットマップテーブル１２６は、図３５に示すように、その内容が更新された状態となる。
【０１６７】
例えば、＃１のMP６４の場合、図３４に示すポートスキャンビットマップテーブル１２６に従ってポートスキャンを行っても、＃１のポートについては、ポートイベントがないため、図３５に示すように、ポートスキャンビットマップテーブル１２６のうち、＃１のポートに対応したビットが“１”から“０”に更新される。
【０１６８】
同様に、＃２のMP６４の場合、図３４に示すポートスキャンビットマップテーブル１２６に従ってポートスキャンを行っても、＃２のポートについてポートイベントが発生していないため、図３５に示すように、ポートスキャンビットマップテーブル１２６のうち、＃２のポートに対応した“１”のビットが“０”に更新される。
【０１６９】
次に、各MP６４を、図３３に示すイベントビットマップテーブル１２８のビットを全て０クリアし（S６５）、このルーチンでの処理を終了する。なおイベントビットマップテーブル１２８は、各MP６４によってポートスキャンが実施されたときに、ポートイベントの有無によってその内容が更新されることになる。
【０１７０】
このように、ポートイベントの発生の有無に従ってイベントビットマップテーブル１２８を更新するとともに、更新されたイベントビットマップテーブル１２８の内容をポートスキャンビットマップテーブル１２６に反映し、各MP６４がポートスキャンするときに、イベントビットマップテーブル１２８の内容が反映されたポートスキャンビットマップテーブル１２６を用いることで、ポートイベントが発生しないポートに対するポートINキューチェックを省略することができる。
【０１７１】
次に、ポート−MP対応付け方法について説明する。本実施例では、以下に示すように、３種類の方法を用いることとしている。
【０１７２】
ポート−MP対応付け方法１
【０１７３】
ポート−MP対応付け方法１では、ポート稼働率に基づいて、１ポートずつ共有MP数を決定し、最もMP稼働率の低いMP６４から順にポートを割り当てることとている。
【０１７４】
このポート−MP対応付け方法１を採用すると、ポート毎にきめ細かくMP６４を割り当てることが可能となり、MP６４のMP稼働率を均一にしやすくなる。また、各MP６４で処理すべきポート数を均一にできる。
【０１７５】
ポート−MP対応付け方法２
【０１７６】
このポート−MP対応付け方法２では、ポート稼働率に基づいて、１ポートずつ担当MP６４を決定し、各MP６４のMP稼働率が平均となるように、各ポートを各MP６４に割り当てることとしている。
【０１７７】
ポート−MP対応付け方法２によれば、各MP６４のMP稼働率を均一にすることができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【０１７８】
ポート−MP対応付け方法３
【０１７９】
このポート−MP対応付け方法３では、MP稼働率に２段の閾値（上限閾値と下限閾値）を設けてヒステリシス制御を行い、MP稼働率が上限閾値を超える毎に、当該MP６４の全ての担当ポートに共有MPを１MPずつ増やし、MP稼働率が下限閾値を下回る毎に、当該MP６４の全ての担当ポートから、共有MPを１MP減らすこととしている。
【０１８０】
ポート−MP対応付け方法３によれば、閾値が２つあるため、一方の閾値近傍でMP稼働率が振動するのを抑制することができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【０１８１】
以下、３種類のポート−MP対応付け方法の具体的内容について説明する。
【０１８２】
まず、ポート−MP対応付け方法１を図３６のフローチャートにしたがって説明する。この処理は、各MPPK３６に属するMP６４のうち任意の１つのMP６４が一定周期で実施する。
【０１８３】
まず、MP６４は、全MP６４について、全ポートに関するポート稼働率をPM６８から取り込んで集計し（S７１）、その後、MP間で共有するポート数の均衡を取るために、ポート稼働率を降順に並べ替える処理を行う（S７２）。
【０１８４】
例えば、図３７に示すように、MP６４は、見直し前のポート稼働率テーブル１４０について、ポート稼働率の降順にポートの並び替えを行い、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル１４０Aを作成する。
【０１８５】
次に、MP６４は、最高負荷ポートから最低負荷ポートに向けて以下の処理を実施する。
【０１８６】
まず、MP６４は、ポート稼働率テーブル１４０Aとポート稼働率‐MP数対応テーブル１４６を参照してMP数を決定し（S７３）、その後、MP間の負荷を均衡にするために、MP稼働率の最も低いMP６４から順に当該ポートを割り当てる（S７４）。
【０１８７】
続いて、MP６４は、ポートが割り当てられた当該MP６４について、当該ポートの負荷に対応したデータを基にマスタビットマップテーブルを作成し（S７５）、全ポートに対する処理を終了したか否かを判定し（S７６）、全てのポートについて処理を終了していないときには、ステップS７３の処理に戻り、ステップS７３〜S７６の処理を繰り返し、全てのポートに対する処理を終了したときには、このルーチンでの処理を終了する（S７６）。
【０１８８】
ステップS７３、S７４においては、図３７に示すように、ポート稼働率テーブル１４０Aとポート稼働率‐MP数対応テーブル１４６を参照すると、＃N−１のポートについては、ポート稼働率の合計が「７５」であって、MP数１５０として、「２」に対応するため、ポート稼働率＝「７５」を「２」で割った値である「３７．５」を、それぞれ＃０、＃１のMP６４に割り付ける。
【０１８９】
同様に、＃１のポートについては、ポート稼働率の合計が「６０」であるため、このポート稼働率＝「６０」を共有MP数＝「２」で割った値である「３０」をそれぞれ＃２、＃３のMP６４に割り付ける。＃０、＃２のポートについては、ポート稼働率の合計が「４０」または「３０」であって、共有MP数１５０が「１」であるため、＃０、＃１のMP６４よりも、割り付けられたポート稼働率の低い＃２のMP６４に、ポート稼働率＝「４０」を割り付ける。また、＃２のポートについては、＃２のMP６４に、ポート稼働率＝「４０」を割り付けたので、＃３のMP６４には、ポート稼働率＝「３０」割り付ける。これらの割り付けを基に、ポート稼働率テーブル１４０Aからポート稼働率テーブル１４０Bを作成する。
【０１９０】
この後、MP６４は、ポート稼働率テーブル１４０Bをマスタビットマップテーブル１２４に反映し、図３７に示すマスタビットマップテーブル１２４Aを作成する。このマスタビットマップテーブル１２４Aがポートスキャンビットマップテーブル１２６に反映される。
【０１９１】
このため、各MP６４は、次のポートスキャン時に、マスタビットマップテーブル１２４Aの内容が反映されたポートスキャンビットマップテーブル１２６を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【０１９２】
また、各MP６４のうち一部のMP６４は、他のMP６４に処理を移行することができるので、負荷を分散することが可能になる。例えば、＃０のMP６４は、＃０のポートに関する処理を＃２のMP６４に移行することで、負荷を分散することが可能になり、＃１のMP６４は、＃１のポートに関する処理を＃２、＃３のMP６４に移行することで、負荷を分散することが可能になる。
【０１９３】
なお、マスタビットマップテーブル１２４Aにおいて、ポート稼働率テーブル１４０Bのうち、ポート稼働率が０よりも大きい数値が格納されているところのビットは“１”となり、ポート稼働率が０のところは“０”となっている。
【０１９４】
このように、ポート−MP対応付け方法１を用いることで、ポート稼働率に応じて各ポートを処理するためのMP６４を変更することができる。これにより、一部のMP６４の負荷を分散することができる。
【０１９５】
次に、ポート−MP対応付け方法２を図３８のフローチャートにしたがって説明する。この処理は、各MPPK３６内の任意の１MP６４が一定周期で実施する。
【０１９６】
まず、MP６４は、全MP６４について、全ポートのポート稼働率をPM６８から取り込んで集計し（S８１）、その後、ポート稼働率を降順に並び替える（S８２）。例えば、図３９に示すように、見直し前のポート稼働率テーブル１４０のポートについて、ポート稼働率を降順に並び替えて、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル１４０Cを作成する。
【０１９７】
この後、MP６４は、ポート稼働率の合計から平均MP稼働率を算出する（S８３）。例えば、ポート稼働率テーブル１４０Cを参照し、各ポートのポート稼働率の合計が２０５である場合、この合計２０５を、MP数４で割り算して、平均値＝５１％を算出する。
【０１９８】
次に、MP６４は、MPPK３６内の全てのMP６４に対して、以下の処理を実施するとともに、高負荷ポートから低負荷ポートに向けて以下の処理を実施する。
【０１９９】
例えば、MP６４は、各ポートについて、ポート処理権限を取得し（S８４）、その後、権限を取得したポートのポート稼働率の合計が平均MP稼働率以下か否かを判定し（S８５）、ポート稼働率の合計が平均稼働率以下のときには、ステップS８４の処理に戻り、ステップS８４とS８５の処理を繰り返す。
【０２００】
一方、ポート稼働率の合計が平均MP稼働率以下でないときには、MP６４は、マスタビットマップテーブル１２４の当該MP６４について、当該ポートの箇所に対応したデータを基にビットを設定し（S８６）、全てのMP分の処理を行ったか否かを判定し（S８７）、全てのMP６４に対する処理を終了していないときには、ステップS８４に戻り、ステップS８４、S８５、S８６の処理を繰り返し、全てのMP６４に対する処理を終了したときには、このルーチンでの処理を終了する。
【０２０１】
ステップS８４、S８５においては、図３９に示すポート稼働率テーブル１４０Cを参照し、各ポートを担当する各MPのポート稼働率が平均値となるように、見直し後のポート稼働率テーブルとして、ポート稼働率テーブル１４０Dを作成する。
【０２０２】
例えば、＃N−１のポートについては、ポート稼働率の合計が７５であるため、＃０のMP６４に対して、ポート稼働率を５１に設定し、＃１のMP６４については２４（２４＝７５−５１）を設定する。＃１のポートに対しては、ポート稼働率の合計が６０であって、＃１のMP６４については、既にポート稼働率として２４が設定されているため、２７（２７＝５１−２４）を設定する。また＃１のポートについては、＃２のMP６４に、ポート稼働率３３（３３＝６０−２７）を設定する。同様に、＃０のポートについては、＃２のMP６４にポート稼働率１８を設定し、＃３のMP６４にポート稼働率２２を設定し、＃２のポートに対しては、＃３のMP６４にポート稼働率３０を設定する。
【０２０３】
また、ステップS８６、S８７においては、ポート稼働率テーブル１４０の内容をマスタビットマップテーブル１２４に反映し、マスタビットマップテーブル１２４Bを生成する。
【０２０４】
このように、ポート−MP対応付け方法２を用いることで、各MP６４が担当するポートのポート稼働率が平均となるように、各MP６４に対して担当ポートを決定することができる。これにより、一部のMP６４の負荷を分散することができる。
【０２０５】
また、マスタビットマップテーブル１２４Bを用いてポートスキャンビットマップテーブル１２６を生成した場合、次のポートスキャン時に、各MP６４は、マスタビットマップテーブル１２４Bの内容が反映されたポートスキャンビットマップテーブル１２６を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【０２０６】
次に、ポート−MP対応付け方法３を図４０のフローチャートにしたがって説明する。この処理は、各MPPK３６内の任意の１つのMP６４が一定周期で実施する。
【０２０７】
まず、MP６４は、PM６８を検索して、自MP６４のMP稼働率を集計し、図４１に示すように、MP稼働率が上限閾値L１以上か否かを判定し（S９２）、MP稼働率が上限閾値L１以上でないときには、MP稼働率が下限閾値L２未満か否かを判定し（S９３）、MP稼働率が下限閾値L２未満であるときには、MP６４が担当するポートを共有するMP６４の数を１個減らすために、マスタビットマップ１２４を作成し（S９４）、ステップS９７の処理に移行する。なお、ステップS９３で、MP稼働率が下限閾値L２未満でないと判定したときには、MP６４は、ステップS９７の処理に移行する。
【０２０８】
一方、MP６４は、ステップS９２において、MP稼働率が上限閾値L１以上と判定したときには、自MP６４が担当する全てのポートに対して、以下の処理を実施する。
【０２０９】
具体的には、MP６４は、共有MP数＜MPPK内MP数か否かを判定し（S９５）、このステップで否定の判定結果を得たときには、再度この処理を行い、このステップで肯定の判定結果を得た時には、MP稼働率にしたがって、MP６４が担当するポートを共有するMP６４を１個追加するために、マスタビットマップテーブル１２４を作成する（S９６）。
【０２１０】
この後、MP６４は、全てのポートに対して、見直すための処理を実施したか否かを判定し（S９７）、全てのポートに対して、見直し処理を実施していないときには、ステップS９５に戻り、ステップS９５からS９７の処理を繰り返し、全てのポートに対して、見直し処理を実施したときには、このルーチンでの処理を終了する。
【０２１１】
このように、MP稼働率にしたがって、当該MP６４が担当するポートを共有するMP６０の数を変更することができる。この際、MP６４の数を増やすと負荷が分散されるため、稼働率が下がるが、上限閾値L１に対して、十分低い下限閾値L２を設定することで、MP稼働率が変動しても、MP稼働率が振動するのを防止することができる。
【０２１２】
次に、ポート−MP対応付け方法の他の例として、MP障害時における処理を図４２のフローチャートにしたがって説明する。この処理は、各MPPK３６内の任意の１つのMP６４が一定周期で実施する。
【０２１３】
まず、MPPK３６に属するMP６４のうちいずれか１つに障害が発生した場合、健全なMP６４がPM６８内のマスタビットマップ１２４を参照し、IO処理可能なMP一覧を取得し（S１０１）、障害が発生したMP６４が保持しているポートに対して、以下の処理を実施する。
【０２１４】
例えば、＃３のMP６４で障害が発生した場合、＃０〜＃２のMP６４のうちいずれか１つのMP６４は、＃３のMP６４が保持しているポートは占有ポートか否かを判定し（S１０２）、占有ポートでないときには、ステップS１０２の処理を繰り返し、占有ポートであるときには、IO処理可能なMP６４によって、当該ポートを共有するように、マスタビットマップ１２４に対してビットを設定する（S１０３）。
【０２１５】
次に、MP６４は、全てのポートに対するチェックが終了したか否かを判定し（S１０４）、全てのポートに対するチェックを終了していないときには、ステップS１０２の処理に戻り、ステップS１０２〜S１０４の処理を繰り返し、全てのポートに対するチェックが終了したときには、このルーチンでの処理を終了する。
【０２１６】
この場合、マスタビットマップテーブル１２４として、図４３に示すように、マスタビットマップテーブル１２４を用いているときに、＃３のMP６４で障害が発生したときには、＃３のMP６４が保持しているポート、例えば、＃０、＃２のポートに対して、＃０〜＃２のMP６４に担当させるための処理を行い、マスタビットマップテーブル１２４Cを、図４４に示すように、マスタビットマップテーブル１２４Dとして作成する。
【０２１７】
この際、＃０のポートについては、＃３のMP６４の他に、既に、＃２のMP６４が処理を担当しているので、そのまま、＃２のMP６４が処理を担当することになる。これに対して、＃２のポートについては、＃３のMP６４のみが担当していたので、＃０〜＃２のMP６４がそれぞれ処理を担当することになる。
【０２１８】
このように、＃３のMP６４で障害が発生した場合、＃３のMP６４が占有する、＃２のポートの処理を、＃０〜＃２のMP６４が共有することで、＃３のMP６４が占有していた占有ポート（＃２のポート）に対するIO処理を、他のMP６４によって継続することができる。
【０２１９】
次に、ポート稼働率‐MP数対応テーブル１４６の内容を動的に変更するときの処理内容を図４５のフローチャートにしたがって説明する。この処理は、MPPK３６内の任意の１つのMP６４が一定周期で実施する。
【０２２０】
まず、MP６４は、ポートINキュー８０または９０を参照し、INキュー８１または９１のキュー滞留数を取得し（S１１１）、次に、一時的な変動の影響を受けて性能が不安定になるのを防止するために、キュー滞留数が過去N回ともに増えているか否かを判定する（S１１２）。
【０２２１】
ステップS１１２において、キュー滞留数が過去N回とも増えていると判定したときには、MP６４は、MP障害・MP交換などによってIO処理不可能なMP６４の影響を除外するために、マスタビットマップテーブル１２４を参照し、IO処理可能なMP６４の一覧を取得する（S１１３）。
【０２２２】
次に、MP６４は、PM６８を参照して、各MP６４のMP稼働率を基に、余剰能力のあるMP６４であって、IO処理可能なMP６４が存在するか否かを判定し（S１１４）、このステップS１１４で否定の判定結果を得たときには、このルーチンでの処理を終了し、このステップS１１４で肯定の判定結果を得たときには、共有MP６４の数が増えるように、切替時（変更時）のポート稼働率を下げるための処理を行い（S１１５）、このルーチンでの処理を終了する。
【０２２３】
なお、ステップS１１４において、MP６４の過負荷時に、ポート共有を行っても意味がないため、またMP障害・MP交換などによって、IO処理可能なMP６４が減る場合は、見直すための処理は行わないこととしている。
【０２２４】
ステップS１１１〜ステップS１１５の処理を行うことで、キュー８１、９１のキュー滞留個数が増加したとき、例えば、図４６に示すように、夜間のバッチ処理で、前回見直し時のキュー滞留個数を示す基準値STよりも、キュー滞留個数が連続して増加する場合には、図４７に示すように、ポート稼働率‐MP対応テーブル１４６のうちポート稼働率１４８の閾値＝チューニングパラメータを１/２に変更し、閾値＝チューニングパラメータが１/２に変更されたポート稼働率‐MP数対応テーブル１４６Aを生成する。
【０２２５】
この場合、ポート稼働率１４８の閾値＝チューニングパラメータは、「０〜４９」が「０〜２４」に、「５０〜９９」が「２５〜４９」に、「１００〜１４９」が「５０〜７４」に、「１５０〜」が「７５〜」にそれぞれ変更されている。
【０２２６】
一方、ステップS１１２において、キュー滞留数が過去N回とも増えていないと判定したときには、キュー滞留数が過去N回ともに減っているか否かを判定し（S１１６）、キュー滞留数が過去N回とも減っていないときには、このルーチンでの処理を終了し、キュー滞留数が過去N回とも減っていると判定したときには、占有MP６４が増えるように、切替時のポート稼働率を上げるための処理を行い（S１１７）、このルーチンでの処理を終了する。
【０２２７】
すなわち、ステップS１１１、S１１２、S１１６、S１１７の処理を行った場合、例えば、図４８に示すように、バッチ処理の終了に伴って、キュー滞留個数が連続して基準値STよりも減少しているときには、図４９に示すように、ポート稼働率‐MP対応テーブル１４６のポート稼働率４８の閾値＝パラメータを２倍に変更し、ポート稼働率‐MP数対応テーブル１４６Bを生成する。
【０２２８】
この場合、ポート稼働率１４８の閾値＝チューニングパラメータは、「０〜４９」が「０〜９９」に、「５０〜９９」が「１００〜１９９」に、「１００〜１４９」が「２００〜２９９」に、「１５０〜」が「３００〜」にそれぞれ変更されている。
【０２２９】
このように、INキュー８１、９１のキュー滞留数（IO滞留数）とMP稼働率を基にポート稼働率‐MP数対応テーブル１４６の値を動的に見直すことで、キュー滞留数（IO滞留数）に応じて最適なMP数とすることができる。
【０２３０】
例えば、キュー滞留数が増加した場合には、ポート稼働率１４８の閾値を１/２に変更することで、各MP６４のポート稼働率が増加しても、各MP６４のポート稼働率の増加に応じて、ポート稼働率‐MP数対応テーブル１４６おけるMP数１５０の値として、大きな数値が用いられるので、多くのMP６４で処理を行うことができる。
【０２３１】
逆に、キュー滞留数が減少しているときには、ポート稼働率１４８の閾値を２倍に変更することで、各MP６４のポート稼働率が変化しても、各MP６４のポート稼働率が閾値の範囲内で変化している間は、少ないMP６４で処理を行うことができる。
【０２３２】
本実施例によれば、各制御部６０に属する各MP６４は、PM（主メモリ）６８に属する各キュー８１、９１のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行するようにしたので、各MP６４の検索対象となるキュー８１、９１の数を減少させることができ、各キュー８１、９１に格納されたコマンド（入出力要求）などの情報の検出を高速に行うことができる。
【０２３３】
また、本実施例によれば、各制御部６０に属する各MP６４が占有モードまたは共有モードを選択するに際して、スループットよりもレスポンスタイムを重視する場合、占有モードを選択することで、ロック競合が発生したり、ポートイベントによる情報を他のMP６４に取得されたりするのを防止することができるとともに、レスポンスタイムの遅延を防止できる。
【０２３４】
一方、各制御部６０に属する各MP６４が占有モードまたは共有モードを選択するに際して、レスポンスタイムよりもスループットを重視する場合、共有モードを選択することで、１つのポートに関する処理を複数のMP６４で共有することができ、スループットの向上に寄与することができる。
【符号の説明】
【０２３５】
１０  オープン系ホスト計算機、１２  メインフレーム用ホスト計算機、１４  ストレージサブシステム、１６、１８  ネットワーク、２０  オープンポートパッケージ、２２  メインフレームポートパッケージ、２４  ドライブポートパッケージ、２６  キャッシュメモリ、２８  共有メモリ、３０  スイッチパッケージ、３４  記憶装置、３８  HDD、５２  オープンポートMP、５４  MFポートMP、５６  ドライブポートMP、３６  MPPK、６０  制御部、６２  記憶部、６４  MP、６８  PM、７０  LM、７６  MP検索テーブル８０  オープンポートINキュー、８６  MP検索テーブル、９０  MFポートINキュー、１２０、１２４  マスタビットマップテーブル、１２６  ポートスキャンビットマップテーブル、１２８  イベントビットマップテーブル、１３０  LDEV−ポート対応テーブル、１３６  LDEV−MPPK対応テーブル、１４０  ポート稼働率テーブル、１４６  ポート稼働率−MP数対応テーブル。
【図１】
0005318280.tif 000002
【図２】
0005318280.tif 000003
【図３】
0005318280.tif 000004
【図４】
0005318280.tif 000005
【図５】
0005318280.tif 000006
【図６】
0005318280.tif 000007
【図７】
0005318280.tif 000008
【図８】
0005318280.tif 000009
【図９】
0005318280.tif 000010
【図１０】
0005318280.tif 000011
【図１１】
0005318280.tif 000012
【図１２】
0005318280.tif 000013
【図１３】
0005318280.tif 000014
【図１４】
0005318280.tif 000015
【図１５】
0005318280.tif 000016
【図１６】
0005318280.tif 000017
【図１７】
0005318280.tif 000018
【図１８】
0005318280.tif 000019
【図１９】
0005318280.tif 000020
【図２０】
0005318280.tif 000021
【図２１】
0005318280.tif 000022
【図２２】
0005318280.tif 000023
【図２３】
0005318280.tif 000024
【図２４】
0005318280.tif 000025
【図２５】
0005318280.tif 000026
【図２６】
0005318280.tif 000027
【図２７】
0005318280.tif 000028
【図２８】
0005318280.tif 000029
【図２９】
0005318280.tif 000030
【図３０】
0005318280.tif 000031
【図３１】
0005318280.tif 000032
【図３２】
0005318280.tif 000033
【図３３】
0005318280.tif 000034
【図３４】
0005318280.tif 000035
【図３５】
0005318280.tif 000036
【図３６】
0005318280.tif 000037
【図３７】
0005318280.tif 000038
【図３８】
0005318280.tif 000039
【図３９】
0005318280.tif 000040
【図４０】
0005318280.tif 000041
【図４１】
0005318280.tif 000042
【図４２】
0005318280.tif 000043
【図４３】
0005318280.tif 000044
【図４４】
0005318280.tif 000045
【図４５】
0005318280.tif 000046
【図４６】
0005318280.tif 000047
【図４７】
0005318280.tif 000048
【図４８】
0005318280.tif 000049
【図４９】
0005318280.tif 000050