ストレージサブシステム
【課題】
各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更すること。
【解決手段】
ホスト計算機10に接続された複数のポートを有するオープンポートMP52は、ホスト計算機10からポートを介して入出力要求を受けたときに、入出力要求に基づいて、入出力要求の転送先となるMPPK36を特定し、特定したMPPK36対して入出力要求を転送する。入出力要求を受けたMPPK36に属する各MP64は、単一のMP64が入出力要求の処理を占有する占有モードまたは2つ以上のMP64が入出力要求の処理を共有する共有モードのうち、ポートに関する負荷情報が低負荷状態を示すときには、占有モードを選択し、高負荷状態を示すときには、共有モードを選択し、選択したモードに従ってIO処理を実行する。
各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更すること。
【解決手段】
ホスト計算機10に接続された複数のポートを有するオープンポートMP52は、ホスト計算機10からポートを介して入出力要求を受けたときに、入出力要求に基づいて、入出力要求の転送先となるMPPK36を特定し、特定したMPPK36対して入出力要求を転送する。入出力要求を受けたMPPK36に属する各MP64は、単一のMP64が入出力要求の処理を占有する占有モードまたは2つ以上のMP64が入出力要求の処理を共有する共有モードのうち、ポートに関する負荷情報が低負荷状態を示すときには、占有モードを選択し、高負荷状態を示すときには、共有モードを選択し、選択したモードに従ってIO処理を実行する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、複数の記憶装置の記憶領域に割り当てられる複数の論理記憶装置に対する入出力処理を行うストレージサブシステムに関する。
【背景技術】
【0002】
ストレージサブシステムにおいては、複数の記憶装置の記憶領域に割り当てられた複数の論理記憶装置をホスト計算機に対して認識可能に提供し、ホスト計算機による当該論理記憶装置へのデータへの入出力処理ができるようになっている。
【0003】
ストレージサブシステムでは、ホスト計算機から入出力要求を受けたときには、ストレージサブシステム内に設けられたマイクロプロセッサが、入出力要求にしたがって、記憶装置へのデータ書き込み処理や、記憶装置からのデータの読み出し処理などの入出力処理を制御するようになっている。
【0004】
この種のストレージサブシステムの中には、記憶装置との入出力処理を実行するために、複数のマイクロプロセッサとローカルメモリを有する複数の制御部を設けるとともに、記憶装置の論理的記憶領域に対する入出力処理を担当する制御部を管理する管理テーブルを設けたものが提案されている(特許文献1参照)。
【0005】
特許文献1に記載されたシステムでは、例えば、ホスト計算機から、ポートを介して、記憶装置の論理的記憶領域に対する入出力要求があった場合、ホストインタフェース部が管理テーブルに基づいて、記憶装置の論理的記憶領域の入出力処理を担当する制御部を特定し、特定した制御部へ入出力要求を転送し、入出力要求を受けた制御部の中のいずれかのマイクロプロセッサが記憶装置の論理的記憶領域に対する入出力処理を実行するようになっている。
【0006】
特許文献1に記載されたシステムによれば、記憶装置の論理的記憶領域と各制御部との対応関係が管理テーブルで管理されているので、記憶装置の論理的記憶領域と各制御部との対応関係を任意に設定することができるとともに、ポートとマイクロプロセッサとの対応関係を固定することなく、制御部の中の複数のマイクロプロセッサに対して、入出力要求の処理を担当すべきマイクロプロセッサを任意に設定することができる。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2008−269424号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
しかし、従来技術では、ホスト計算機からの入出力要求が増加するに伴って、ホストインタフェース部のポート数を増やすと、制御部内の各マイクロプロセッサが処理を担当すべきポート数が増加するので、各ポートに入力された入出力要求を処理すべきマイクロプロセッサを決定するのに時間を要することになる。
【0009】
一方、1つのポートに入力された入出力要求に対して、複数のマイクロプロセッサで処理を共有する構成を採用した場合、入出力要求を処理すべきマイクロプロセッサを決定する時間を短くすることはできるが、同一の入出力要求に対する処理が複数のマイクロプロセッサで競合した場合、競合した各マイクロプロセッサにおいてオーバーヘッドが発生し、レスポンスタイムが悪化する恐れがある。
【0010】
本発明は、前記従来技術の課題に鑑みて為されたものであり、その目的は、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができるストレージサブシステムを提供することにある。
【課題を解決するための手段】
【0011】
前記目的を達成するために、本発明は、ホスト計算機と複数のポートを介して情報の授受を行う第一インターフェース部と、記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部を備え、前記各制御部は、前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、前記第一インターフェース部は、前記ホスト計算機から、前記各ポートを介して入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求の処理を担当する制御部を特定し、前記特定した制御部に対して入出力要求を転送し、前記入出力要求を受信した制御部は、前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記入出力要求の処理を占有する占有モードまたは2つ以上のマイクロプロセッサが前記入出力要求の処理を共有する共有モードのいずれか一方を選択し、前記選択した占有モードまたは共有モードに従った処理を実行することを特徴とするものである。
【発明の効果】
【0012】
本発明によれば、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができる。
【図面の簡単な説明】
【0013】
【図1】本発明に係るストレージシステムのブロック構成図である。
【図2】本発明に係るストレージサブシステムのモジュール結合構成図である。
【図3】ポートMPからMPPKへコマンドを転送する処理を説明するための図である。
【図4】ホストコマンド用MP検索テーブルの構成図である。
【図5】ベンダ固有コマンド用MP検索テーブルの構成図である。
【図6】MPPKの内部構成を説明するための構成図である。
【図7】ポートスキャンの基本的な内容を説明するためのフローチャートである。
【図8】ポートスキャンの基本的内容を説明するためのシーケンス図である。
【図9】リード処理の前半時の処理を説明するためのシーケンス図である。
【図10】リード処理の後半時の処理を説明するためのシーケンス図である。
【図11】ライト処理の前半時の処理を説明するためのシーケンス図である。
【図12】ライト処理の後半時の処理を説明するためのシーケンス図である。
【図13】マスタビットマップテーブルの基本構成図である。
【図14】ポートスキャンに用いるマスタビットマップテーブルの構成図である。
【図15】ポートスキャンに用いるポートスキャンビットマップテーブルの構成図である。
【図16】ポートスキャンに用いるイベントビットマップテーブルの構成図である。
【図17】LDEV‐ポート対応テーブルの構成図である。
【図18】LDEV‐ポート対応テーブルを生成する方法を説明するための図である。
【図19】3種類のビットマップテーブルを初期設定するときの処理を説明するためのフローチャートである。
【図20】初期設定に用いられるLDEV‐ポート対応テーブルの構成図である。
【図21】初期設定に用いられるマスタビットマップテーブルであって、絞り込み前の状態を示すマスタビットマップテーブルの構成図である。
【図22】初期設定に用いられるマスタビットマップテーブルであって、絞り込み後の状態を示すマスタビットマップテーブルの構成図である。
【図23】ポート稼働率テーブルの構成図である。
【図24】ポート稼働率‐MP数対応テーブルの構成図である。
【図25】LDEV‐MPPK対応テーブルの作成方法を説明するためのフローチャートである。
【図26】共有メモリにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図27】PMにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図28】テーブルの初期設定処理を説明するためのシーケンス図である。
【図29】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのフローチャートである。
【図30】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのシーケンス図である。
【図31】MPPKにおける周期処理を説明するためのシーケンス図である。
【図32】ポートスキャンビットマップテーブルの更新処理を説明するためのフローチャートである。
【図33】ポートスキャンビットマップテーブルの更新処理に用いるイベントマップテーブルの構成図である。
【図34】イベントビットマップテーブルの内容を反映する前の状態を示すポートスキャンビットマップテーブルの構成図である。
【図35】イベントビットマップテーブルの内容を反映した後の状態を示すポートスキャンビットマップテーブルの構成図である。
【図36】ポート−MP対応付け方法1を説明するためのフローチャートである。
【図37】ポート−MP対応付け方法1を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図38】ポート‐MP対応付け方法2を説明するためのフローチャートである。
【図39】ポート−MP対応付け方法2を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図40】ポート‐MP対応付け方法3を説明するためのフローチャートである。
【図41】MP稼働率と時間との関係を説明するための図である。
【図42】MP障害時におけるポート−MP対応付け方法を説明するためのフローチャートである。
【図43】MP障害発生時の状態を説明するためのマスタビットマップテーブルの構成図である。
【図44】MP障害時に健全なMPが処理を担当したときの状態を説明するためのマスタビットマップテーブルの構成図である。
【図45】ポート稼働率‐MP数対応テーブルの動的変更処理を説明するためのフローチャートである。
【図46】夜間のバッチ処理におけるキュー滞留個数と時間との関係を説明するための図である。
【図47】ポート稼働率‐MP数対応テーブルの閾値を1/2に変更する方法を説明するための図である。
【図48】バッチ処理終了時におけるキュー滞留個数と時間との関係を説明するための図である。
【図49】ポート稼働率‐MP数対応テーブルの閾値を2倍に変更した状態を説明するための図である。
【発明を実施するための形態】
【実施例】
【0014】
本実施例は、ホスト計算機から、各ポートを介して入出力要求があったときに、複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部の中から、入出要求の処理を担当する制御部を決定し、決定した制御部は、単一のマイクロプロセッサが入出力要求の処理を占有する占有モードまたは2つ以上のマイクロプロセッサが入出力要求の処理を共有する共有モードのいずれか一方を選択し、選択した占有モードまたは共有モードに従った処理を実行するものである。
【0015】
以下、本発明の一実施例を図面に基づいて説明する。図1は、本発明の一実施例を示すストレージシステムの構成図である。
【0016】
図1において、ストレージシステムは、複数のホスト計算機10、12と、ストレージサブシステム14を備えており、各ホスト計算機10、12とストレージサブシステム14は、ネットワーク16、18を介して互いに接続されている。
【0017】
ホスト計算機10は、オープン系計算機として、例えば、マイクロプロセッサ(CPU)、オペレーティングシステム(OS)、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク16としては、例えば、ファイバチャネルが用いられる。
【0018】
ホスト計算機12は、メインフレーム(Main Frame)用計算機として、例えば、マイクロプロセッサ(CPU)、オペレーティングシステム(OS)、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク18としては、例えば、FICON(FIbre CONnection;商標)、ファイバチャネルが用いられる。
【0019】
この際、各ホスト計算機10、12から送信されるコマンドには、リード要求やライト要求などの入出力要求が含まれている。入出力要求には、例えば、リード対象のデータが管理されているLUN(Logical Unit Number)およびLBA(Logical Block Address)が含まれる。また、各ホスト計算機10、12から送信されるライト要求には、例えば、ライト対象のデータを書き込むLUNおよびLBAと、ライト対象のデータが含まれる。
【0020】
ストレージサブシステム14は、複数のオープンポートパッケージ20と、複数のメインフレームポートパッケージ22と、ドライブポートパッケージ24と、キャッシュメモリ26と、共有メモリ28と、スイッチパッケージ30と、管理用端末32と、記憶装置34と、#0〜#3のマイクロプロセッサパッケージ(Micro Processor Package、以下、MPPKと称する。)36を備え、記憶装置34が複数のHDD(Hard Disk Drive)38から構成されている。
【0021】
ストレージサブシステム14は、図2に示すように、#0のモジュール40または#1のモジュール42として構成され、各モジュール40、42内のスイッチパッケージ30がネットワーク44を介して互いに接続されている。
【0022】
各スイッチパッケージ30は、内部ネットワーク46を介して、各オープンポートパッケージ20と、各メインフレームポートパッケージ22およびドライブポートパッケージ24に接続されているとともに、内部ネットワーク48を介して、#0〜#3のMPPK36に接続され、さらにキャッシュメモリ26と、共有メモリ28および管理用端末32に接続されている。またドライブポートパッケージ24は、内部ネットワーク50を介して、各HDD38に接続されている。
【0023】
各オープンポートパッケージ20は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク16に接続された複数のポート(図示せず)と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うオープンポートマイクロプロセッサ(以下、オープンポートMPと称する。)52を備えている。
【0024】
オープンポートMP52は、各ポートとネットワーク16を介してホスト計算機10と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK36の中から、コマンドの転送先となるMPPK36を特定し、特定したMPPK36に対して、スイッチパッケージ30を介してコマンドを転送する。
【0025】
この際、オープンポートMP52は、キャッシュメモリ26をリードアクセスまたはライトアクセスし、キャッシュメモリ26上に存在するリードデータまたはライトデータをホスト計算機10に送信するための処理を実行する。
【0026】
各メインフレームポートパッケージ22は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク18に接続された複数のポート(図示せず)と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うメインフレームポートマイクロプロセッサ(以下、MFポートMPと称する。)54を備えている。
【0027】
MFポートMP54は、各ポートとネットワーク18を介してホスト計算機12と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK36の中から、コマンドの転送先となるMPPK36を特定し、特定したMPPK36に対して、スイッチパッケージ30を介してコマンドを転送する。
【0028】
この際、MFポートMP54は、キャッシュメモリ26をリードアクセスまたはライトアクセスし、キャッシュメモリ26上に存在するリードデータまたはライトデータをホスト計算機12に送信するための処理を実行する。
【0029】
ドライブポートパッケージ24は、ディスクアダプタあるいは第二のインターフェース部として、内部ネットワーク50に接続された複数のポート(図示せず)と、記憶装置34との間でデータの入出力処理を行うドライブポートマイクロプロセッサ(以下、ドライブポートMPと称する。)56を備えている。
【0030】
ドライブポートMP56は、例えば、オープンポートMP52またはMFポートMP54からのリードアクセスまたはライトアクセスに応答して、記憶装置34内の指定のHDD38をアクセス対象として、アクセス対象のHDD38からデータを読み出し、読み出したデータをオープンポートMP52またはMFポートMP54に転送し、あるいはアクセス対象のHDD38に対してデータを書き込むようになっている。
【0031】
この際、各HDD38の記憶領域には、ホスト計算機10、12から参照できる論理的な記憶装置である複数の仮想デバイスとして、複数の論理デバイス(LDEV;Logical DEVice)または複数の論理ボリューム(LV;Logical Volume)、あるいは複数の論理ユニット(LU;Logical Unit)が割り当てられている。また、複数のHDD38でRAID(Redundant
Array of Inexpensive Disks)グループを構成した場合、RAIDグループの記憶領域を複数の論理デバイス、あるいは複数の論理ユニットの記憶領域として用いることもできる。
【0032】
キャッシュメモリ26は、各ポートMP52、54、56の処理に伴うデータなどを一時的に記憶する記憶部として構成されている。
【0033】
共有メモリ28は、#0〜#3のMPPK36で共通となる制御情報や各種テーブルに関する情報などを記憶する記憶部として構成されている。
【0034】
管理用端末32は、#0〜#3のMPPK36などに対して、各種設定をオペレータが自動または手動で行うための情報を入力する端末装置として構成されている。
【0035】
#0〜#3のMPPK36は、記憶部62と、複数のマイクロプロセッサ、例えば、#0〜#3のマイクロプロセッサ(Micro Processor、以下、MPと称する。)64を備え、コマンドで指定されたデータの入出力処理を担当する制御部60として機能し、記憶部62および各MP64が、バス66を介して互いに接続されている。
【0036】
記憶部62は、パッケージメモリ(Package Memory、以下、PMと称する。)68と、各MP64に対応して設けられたローカルメモリ(Local Memory、以下、LMと称する。)70から構成されている。
【0037】
PM68は、共有メモリ28に格納された制御情報と、各ポートMP52、54からのコマンドに関する情報および各種テーブルに関する情報などを格納する主メモリとして構成されている。
【0038】
LM70は、各MP64の処理に伴うデータなどを格納する記憶領域として構成されている。
【0039】
この際、各MP64は、PM68をアクセスし、PM68に格納された情報にしたがって各仮想デバイスに対するデータの入出力処理(IO:INPUT OUTPUT 処理)などを行うとともに、コマンドやデータなどをLM70に格納する。
【0040】
一方、図3に示すように、オープンポートパッケージ20のローカルメモリ72には、オープンINキュー74と、MP検索テーブル76に関する情報を格納するための領域が設けられている。オープンINキュー74は、オープンポートパッケージ20に設けられた複数のポート78に対応した記憶領域として構成されており、オープンINキュー74には、各ポート78が受信したコマンドやコマンドに関する情報が順次格納される。
【0041】
この際、オープンポートMP52は、オープンINキュー74に格納された情報を基にMP検索テーブル76を検索して、コマンドなどの転送先となるMPPK36を特定し、特定したMPPK36にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK36は、PM68のオープンINキュー80にコマンドなどを格納する。
【0042】
PM68のオープンINキュー80は、複数のポート78に対応した記憶領域として構成されており、オープンINキュー80には、各ポート78が受信したコマンドやコマンドに関する情報が、オープンポートMP52の処理に従って順次格納される。
【0043】
同様にして、メインフレームポートパッケージ22のローカルメモリ82は、メインフレームINキュー84とMP検索テーブル86を備えている。メインフレームINキュー84は、メインフレームポートパッケージ22に設けられた複数のポート88に対応した記憶領域として構成されており、メインフレームINキュー84には、各ポート88が受信したコマンドやコマンドに関する情報が順次格納される。
【0044】
この際、MFポートMP54は、メインフレームINキュー84に格納された情報を基にMP検索テーブル86を検索して、コマンドなどの転送先となるMPPK36を特定し、特定したMPPK36にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK36は、PM68のメインフレームINキュー90にコマンドなどを格納する。
【0045】
PM68のメインフレームINキュー90は、複数のポート88に対応した記憶領域として構成されており、メインフレームINキュー90には、各ポート88が受信したコマンドやコマンドに関する情報が、MFポートMP54の処理に従って順次格納される。
【0046】
図4に、オープン系ホスト計算機に適用されるホストコマンド(標準化されたコマンド)用MP検索テーブル76の例を示す。
【0047】
ホストコマンド用MP検索テーブル76は、ポート番号100と、ソースID102と、LUN番号104と、宛先MPPK番号106から構成されている。ポート番号100には、各ポート78の番号が格納され、ソースID102には、ホスト計算機10を識別するための番号が格納される。LUN番号104には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号106には、コマンドに関する情報の宛先(転送先)となるMPPK36の番号が格納される。
【0048】
図5に、オープン系ホスト計算機に適用されるベンダ固有コマンド(各ベンダが独自に規定するコマンド)用検索テーブル77の例を示す。
【0049】
MP検索テーブル77は、LUN番号108と、宛先MPPK番号110から構成されている。LUN番号108には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号110には、コマンドやコマンドに関する情報の宛先(転送先)となるMPPK36の番号が格納される。なお、MP検索テーブル86もMP検索テーブル76と同様に構成することができる。
【0050】
一方、各PM68におけるオープンINキュー80と、メインフレームINキュー90は、図6に示すように、各ポート78、88に対応した数のキュー81、91を備えている。例えば、オープンINキュー80は、#0〜#Mのポート78に対応して、#0〜#Mのキュー81を備えている。メインフレームINキュー90は、#0〜#Nのポート88に対応して、#0〜#Nのキュー91を備えている。
【0051】
この際、各MPPK36に属する各MP64は、それぞれPM68内のオープンINキュー80内の任意のキュー81や、メインフレームINキュー90内の任意のキュー91をアクセスし、各キュー81またはキュー91に格納されたコマンドなどの処理を実行することができる。例えば、各MP64は、各キュー81または各キュー91をアクセスするためのポートスキャンを実行し、ポートスキャンで得られたコマンドなどの処理を実行する。
【0052】
次に、各MP64のポートスキャンの処理を図7のフローチャートと図8のシーケンス図にしたがって説明する。
【0053】
各MP64は、例えば、ホスト計算機10からのコマンドに関する処理を実行する場合、各ポート78に対応したキュー81をアクセスするために、チェック対象ポートに関する情報を取得する(S1)。
【0054】
例えば、#0のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT1でチェック対象ポートに対応するキュー81をアクセスし、#1のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT2でチェック対象ポートに対応したキュー81をアクセスし、#2のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT3でチェック対象ポートに対応するキュー81をアクセスする。
【0055】
次に、#0のMP64は、例えば、#0のキュー81をアクセスした場合、タイミングT4で#0のキュー81に対するロック(アクセス権)を取得する(S2)。このとき、#1のMP64は、タイミングT5で#0のキュー81をアクセスし、#0のキュー81に対して、ロックを取得しようとしても、#0のMP64との間でロック競合が生じることになる。
【0056】
この後、#0のMP64は、ロックが取れたか否かを判定し(S3)、ロックが取れないときには、ステップS6の処理に移行し、ロックが取れたときにはタイミングT6で#0のキュー81にIO(INPUT OUTPUT)情報(入出力処理に関する情報)が存在するか否かをチェックする(S4)。
【0057】
このとき、#0のMP64は、#0のキュー81にIO情報が存在しないときには、ステップS6の処理に移行し、#0のキュー81にIO情報が存在するときには、タイミングT7において、#0のキュー81に存在するIO情報をローカルメモリ70にコピーし(S5)、タイミングT8で、PM68に対して、#0のキュー81に対する処理が終了したとして、アンロックを行い(S6)、このルーチンでの処理を終了する。
【0058】
この後、#0のMP64は、ローカルメモリ70に格納されたIO情報を基にIO処理を開始する。なお、#2のMP64がタイミングT9でPM68に対してロック取得を行い、その後、タイミングT10において、チェック対象ポートに対応したキュー81をアクセスしたときに、アクセス先のキュー81にIO情報が存在しないときには、ポートイベントの空振りとなり、タイミングT11で、PM68に対してアンロックを行うことになる。
【0059】
ここで、ポートイベントとは、コマンド、新規IO、転送完了通知などの情報がポート78、88を介してオープンINキュー80またはメインフレームINキュー90に入力されることを意味し、ポートイベントの空振りとは、オープンINキュー80のキュー81またはメインフレームINキュー90のキュー91に、コマンド、新規IO、転送完了通知などの情報が存在しない状態を意味する。
【0060】
次に、リード処理のシーケンスを図9と図10にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機10としているが、コマンドの発行元をホスト計算機12としても同様に行うことができる。
【0061】
まず、タイミングT21でホスト計算機10からのリードコマンドをオープンポートMP52が受信すると、オープンポートMP52は、受信したリードコマンドを基にMP検索テーブル76を検索し、リードコマンドにしたがって転送先のMPPK36を特定し、特定したMPPK36のPM68に対して、タイミングT22でリードコマンドを転送する。
【0062】
例えば、オープンポートMP52は、ホスト計算機10から、複数の仮想デバイスのうちの一の仮想デバイス(例えば、一の論理ユニット)に対するデータの入出力要求として、リードコマンドを受けたときには、このリードコマンドに基づいて、複数の制御部60の中から、一の仮想デバイスに対するリード処理を担当する制御部60を特定し、特定した制御部60が属するMPPK36を転送先として、転送先のMPPK36にリードコマンドを転送する。
【0063】
このときリードコマンドを受信したMPPK36内においては、各MP64が非同期でPM68に対してポートスキャンを実施している。例えば、#1のMP64がタイミングT23でPM68に対してポートスキャンを開始し、例えば、#1のキュー81を検索する。このとき、タイミングT24で、#2のMP64がPM68に対してポートスキャンを開始し、PM68の#1のキュー81をアクセスすると、#2のMP64は、#1のMP64との間にロック競合が発生する。
【0064】
一方、#1のMP64が#1のキュー81に対してポートスキャンを実施し、#1のキュー81に対してロックを取得した後、#1のキュー81にリードコマンドが存在しているときには、タイミングT25で#1のLM70にリードコマンドを格納する。
【0065】
次に、#1のMP64は、タイミングT26で#1のLM70に格納されたリードコマンドを読み出してコマンドを解析する。この後、#1のMP64は、タイミングT27で、リードコマンドにしたがって、PM68に格納された制御情報をアクセスしてコマンド処理を開始する。
【0066】
例えば、#1のMP64は、PM68に格納された制御情報を基にリードコマンドで指定されたリードデータがキャッシュメモリ26に存在するか否かの判定を行い、リードデータがキャッシュメモリ26に存在するときには、ヒットとして、オープンポートMP52に対して、キャッシュメモリ26に存在するリードデータをアクセス先とする処理を行う。この場合、オープンポートMP52は、キャッシュメモリ26に存在するリードデータを読み出して、ホスト計算機10へ転送する。
【0067】
一方、キャッシュメモリ26にリードデータが存在しないときには、#1のMP64は、ミスヒットとして、ドライブポートMP56に対して、一の仮想デバイスに対するリードアクセスを指示する。この場合、ドライブポートMP56は、一の仮想デバイスに対するリードアクセスで得られたリードデータをキャッシュメモリ26に転送する。この後、オープンポートMP52は、キャッシュメモリ26からリードデータを読み出して、ホスト計算機10へ転送するか、またはドライブポートMP56から転送されたリードデータをホスト計算機10へ転送する。
【0068】
次に、タイミングT28において、#1のMP64は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP52へ転送するとともに、オープンポートMP52に対して、転送パラメータをホスト計算機10へ転送するための転送を起動し、その後、処理待ち状態となる。
【0069】
次に、図10に示すように、#1のMP64が処理待ち状態となっているときに、タイミングT29で、転送完了通知がオープンポートMP52に入力されると、オープンポートMP52は、転送完了通知を基に、タイミングT28で転送パラメータを作成したMP64が属するMPPK36を特定し、特定したMPPK36に対して、タイミングT30で転送完了通知を送る。この転送完了通知は、オープンポートMP52で特定されたMPPK36のオープンINキュー80うち、#1のキュー81に格納される。
【0070】
次に、タイミングT31で、#2のMP64がPM68に対してポートスキャンを行い、オープンINキュー80のうち#1のキュー81をアクセスすると、#2のMP64は、#1のキュー81に格納されていた情報として、転送完了通知を、タイミングT32で#2のLM70に格納する。
【0071】
タイミングT33で、#2のMP64が#2のLM70をアクセスし、#2のLM70に存在する転送完了通知は、#1のMP64に対する転送完了通知であることをチェックしたときには、#2のMP64は、タイミングT34で、転送完了通知の再送信として、#1のMP64に対する転送完了通知を#1のLM70に返送する。
【0072】
一方、タイミングT35で、#1のMP64がPM68に対してポートスキャンを行い、#1のキュー81をアクセスしたときに、#1のキュー81に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT36で処理を再開する。
【0073】
処理を再開した、#1のMP64は、タイミングT37で#1のLM70をアクセスし、転送完了通知を受領した場合、タイミングT38で転送完了通知をチェックする。このとき、転送完了通知が、#1のMP64に対する転送完了通知である判定したときには、#1のMP64は、タイミングT39で、1つのIO処理(ジョブ)が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT39でオープンポートMP52に対して送信し、リード処理を終了する。
【0074】
次に、ライト処理のシーケンスを図11と図12にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機10としているが、コマンドの発行元をホスト計算機12としても同様に行うことができる。
【0075】
まず、タイミングT41でホスト計算機10からのライトコマンドをオープンポートMP52が受信すると、オープンポートMP52は、受信したライトコマンドを基にMP検索テーブル76を検索し、ライトコマンドにしたがって転送先のMPPK36を特定し、特定したMPPK36のPM68に対して、タイミングT42でライトコマンドを転送する。
【0076】
例えば、オープンポートMP52は、ホスト計算機10から、複数の仮想デバイスのうちの一の仮想デバイス(例えば、一の論理ユニット)に対するデータの入出力要求として、ライトコマンドを受けたときには、このライトコマンドに基づいて、複数の制御部60の中から、一の仮想デバイスに対するライト処理を担当する制御部60を特定し、特定した制御部60が属するMPPK36を転送先として、転送先のMPPK36にライトコマンドを転送する。
【0077】
このときライトコマンドを受信したMPPK36内においては、各MP64が非同期でPM68に対してポートスキャンを実施している。例えば、#1のMP64がタイミングT43でPM68に対してポートスキャンを開始し、例えば、#1のキュー81を検索する。このとき、タイミングT44で、#2のMP64がPM68に対してポートスキャンを開始し、PM68の#1のキュー81をアクセスすると、#2のMP64は、#1のMP64との間にロック競合が発生する。
【0078】
一方、#1のMP64が#1のキュー81に対してポートスキャンを実施し、#1のキュー81に対してロックを取得したあと、#1のキュー81にライトコマンドが存在しているときには、タイミングT45で#1のLM70にライトコマンドを格納する。
【0079】
次に、#1のMP64は、タイミングT46で#1のLM70に格納されたライトコマンドを読み出してコマンドを解析する。この後、#1のMP64は、タイミングT47で、ライトコマンドにしたがって、PM68に格納された制御情報をアクセスしてコマンド処理を開始する。
【0080】
例えば、#1のMP64は、PM68に格納された制御情報を基にライトコマンドで指定されたライトデータを格納すべき領域がキャッシュメモリ26に存在するか否かの判定を行い、ライトデータを格納すべき領域がキャッシュメモリ26に存在するときには、オープンポートMP52に対して、キャッシュメモリ26をライトデータのアクセス先とする処理を行う。この場合、オープンポートMP52は、ホスト計算機10から転送されたライトデータをキャッシュメモリ26に格納する。キャッシュメモリ26に格納されたライトデータは、その後、ドライブポートMP56によって、一の仮想デバイスに格納される。
【0081】
一方、キャッシュメモリ26にライトデータを格納すべき領域が存在しないときには、#1のMP64は、ドライブポートMP56に対して、キャッシュメモリ26上のデータを一の仮想デバイスに出力させる指示を行い、キャッシュメモリ26上に空き領域を形成させる。その後、オープンポートMP52は、ホスト計算機10から転送されたライトデータをキャッシュメモリ26の空き領域に格納する。
【0082】
次に、タイミングT48において、#1のMP64は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP52へ転送するとともに、オープンポートMP52に対して、転送パラメータをホスト計算機10へ転送するための転送を起動し、その後、処理待ち状態となる。
【0083】
次に、図12に示すように、#1のMP64が処理待ち状態となっているときに、タイミングT49で、転送完了通知がオープンポートMP52に入力されると、オープンポートMP52は、転送完了通知を基に、タイミングT48で転送パラメータを作成したMP64が属するMPPK36を特定し、特定したMPPK36に対して、タイミングT50で転送完了通知を送る。この転送完了通知は、オープンポートMP52で特定されたMPPK36のオープンINキュー80うち、#1のキュー81に格納される。
【0084】
次に、タイミングT51で、#2のMP64がPM68に対してポートスキャンを行い、オープンINキュー80のうち#1のキュー81をアクセスすると、#2のMP64は、#1のキュー81に格納されていた情報として、転送完了通知を、タイミングT52で#2のLM70に格納する。
【0085】
タイミングT53で、#2のMP64が#2のLM70をアクセスし、#2のLM70に存在する転送完了通知は、#1のMP64に対する転送完了通知であることをチェックしたときには、#2のMP64は、タイミングT54で、転送完了通知の再送信として、#1のMP64に対する転送完了通知を#1のLM70に返送する。
【0086】
一方、タイミングT55で、#1のMP64がPM68に対してポートスキャンを行い、#1のキュー81をアクセスしたときに、#1のキュー81に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT56で処理を再開する。
【0087】
処理を再開した、#1のMP64は、タイミングT57で#1のLM70をアクセスし、転送完了通知を受領した場合、タイミングT58で転送完了通知をチェックする。このとき、転送完了通知が、#1のMP64に対する転送完了通知である判定したときには、#1のMP64は、タイミングT59で、1つのIO処理(ジョブ)が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT59でオープンポートMP52に対して送信し、ライト処理を終了する。
【0088】
各MP64がリード処理またはライト処理を行うに際して、複数のMP64から同一のキュー81またはキュー91に対してポートスキャンを実施すると、ロック競合が発生することがある。このロック競合は、各MPPK36に属するMP64の数が増える程頻発することになり、ロック競合により、IO処理時間が増大することになる。
【0089】
また、複数のMP64から同一のキュー81またはキュー91に対してポートスキャンを実施すると、転送完了通知など、ポートイベントに伴う情報が他のMP64に取得され、ポートイベントの空振りが発生することがある。このポートイベントの空振りは、各MPPK36に属するMP64の数が増える程増加し、IO処理時間が増大することになる。
【0090】
そこで、本実施例では、以下に示すように、複数のポート78、88のうちポートイベントのないポート(コマンドや転送完了通知などの情報が入力されないポート)を各ポートMP52、54のチェック対象ポートから除外することとしている。
【0091】
例えば、各MPPK36に属するMP64のチェック対象キュー(検索対象)として、ポートイベントのないポートに対応したキュー81またはキュー91をチェック対象キューから除外することとしている。
【0092】
この際、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0093】
また、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち仮想デバイスが予め割り付けられた(LU定義された)ポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0094】
さらに、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち、コマンド(入出力要求)を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0095】
また、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、検索対象のキューに対するポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理を実行し、検索対象のキューのうち、ポートスキャンの実行によって、コマンド(入出力要求)が存在しないキューを検索対象のキューから除外して、検索対象のキューを更新し、その後のポートスキャンでは、更新した検索対象のキューに対して、ポートスキャンを実行することができる。
【0096】
このように、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、各MP64の検索対象なるキュー81、91の数が減少するので、各キュー81、91に格納されたコマンド(入出力要求)などの情報の検出を高速に行うことができる。
【0097】
また、以下の実施例においては、各MPPK36に属するMP64とポート78またはポート88との対応関係、具体的には、各MPPK36に属する各MP64と各キュー81または各キュー91との対応関係を各MP64の負荷情報を基に動的に切り替えるために、各ポート78、88に入力された情報に関する処理モードとして、占有モードまたは共有モードを採用し、占有モードまたは共有モードにしたがってIO処理を実行することとしている。
【0098】
例えば、各MPPK36に属する各MP64は、各キュー81または各キュー91をアクセスして、各ポート78またはポート88に関する負荷情報として、低負荷状態を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、高負荷状態を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0099】
また、各MPPK36に属する各MP64は、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理に要する処理時間を設定時間毎に計測するとともに、各計測値を順次更新し、コマンド(入出力要求)を受信したときに、更新した各計測値と閾値とを比較し、比較結果から、各ポート78またはポート88に関する負荷情報として、コマンド(入出力要求)の処理に要する処理時間が閾値を下回る負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、前記比較結果から、各ポート78またはポート88に関する負荷情報として、コマンド(入出力要求)の処理に要する処理時間が閾値を上回る負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0100】
さらに、各MPPK36に属する各MP64は、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理に伴うMP稼働率(マイクロプロセッサ稼働率)を算出するとともに、算出したMP稼働率から各ポート78またはポート88に関するポート稼働率をそれぞれ算出し、コマンド(入出力要求)を受信したときに、算出した各ポート稼働率の高低を判定し、この判定結果から、各ポート78またはポート88に関する負荷情報として、算出したポート稼働率が低い値を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、前記判定結果から、各ポート78またはポート88に関する負荷情報として、算出したポート稼働率が高い値を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0101】
ここで、占有モードとは、1つのポート78または88に入力された情報に関する処理、例えば、IO処理を1つのMP64で占有するモード、すなわち、1つのキュー81またはキュー91に格納された情報に関する処理、例えば、IO処理を1つのMP64で占有するモードである。
【0102】
一方、共有モードとは、1つのポート78または88に入力された情報に関する処理、例えば、IO処理を複数のMP64で共有するモード、すなわち、1つのキュー81または91に格納された情報に関する処理、例えば、IO処理を複数のMP64で共有するモードである。
【0103】
また、MP稼働率(マイクロプロセッサ稼働率)とは、単位時間当たりのMP64の利用率を示し、ポート稼働率とは、MP稼働率をポート78または88ごとの粒度に分解した値を示す。
【0104】
占有モードを用いた場合、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、チェックすべきキュー数(ポート数)を削減することができるとともに、ロック競合が発生するのを防止することができる。また、各MP64は、自MP64で処理するのに必要なポートイベントに関する情報を他のMP64に取得されるのを防止することができる。
【0105】
ただし、占有モードを用いた場合、1つのポートについてのIO処理性能(1つのキューについてのIO処理性能)が1つのMP64の処理能力で限界になることがある。この場合、スループットが低下することになる。また、MP64が故障したときには、そのままでは、故障したMP64が担当していた処理が実行されなくなることを考慮する必要がある。
【0106】
一方、共有モードを用いてIO処理を行うと、各制御部60に属する各MP64は、1つのキュー(1つのポート)に関するIO処理を複数のMP64で共有するため、占有モードでIO処理するときよりも、IO処理性能が高くなる。
【0107】
ただし、各制御部60に属する各MP64は、共有モードを用いると、ロック競合に伴ってオーバーヘッドが増加することがある。また他のMP64に、自MP64のIO処理に必要なポートイベントに関する情報を取得され、オーバーヘッドの増加に伴ってレスポンスタイムが遅延することを考慮する必要がある。
【0108】
ポート78、88のうちポートイベントのないポートをチェック対象ポートから除外するに際しては、後述するように、マスタビットマップテーブル120、124(図13、図14参照)、ポートスキャンビットマップテーブル126(図15参照)、イベントビットマップテーブル128(図16参照)、LDEV‐ポート対応テーブル130(図17参照)を用い、各MP64とポート78、88との対応関係を動的に切り替えるに際しては、ポート稼働率テーブル140(図23参照)とポート稼働率‐MP数対応テーブル146(図24参照)を用いることとしている。
【0109】
この際、各MPPK(制御部)36の管理対象となる仮想デバイス(LDEV)と各MPPK(制御部)36との関係を定義したLDEV−MPPK(仮想デバイス・制御部対応テーブル)136を基に各仮想デバイス(LDEV)と各ポートとの関係を規定したLDEV‐ポート対応テーブル(仮想デバイス・ポート対応テーブル)130を作成し、LDEV‐ポート対応テーブル130を基に、複数のポートのうちポートスキャンの対象となるポートを各MP64に対して割り付けたマスタビットマップテーブル124を生成し、マスタビットマップテーブル124を基に、複数のポートのうちポートスキャンの対象となるポートを各MP64に対して割り付けたポートスキャンビットマップテーブル126を生成することとしている。
【0110】
この場合、各MP64は、ポートスキャンビットマップテーブル126に従ってポートスキャンの対象となるポートに対するポートスキャンを行ってポートイベントの有無を検出し、ポートスキャンによってポートイベントが検出されたポートを各MP64に対して割り付けたイベントビットマップテーブル128を生成し、イベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126に反映し、イベントビットマップテーブル128の内容が反映されたポートスキャンビットマップテーブル126に従ってポートスキャンの対象となるポートに対するポートスキャンを行って、IO処理を実行することとしている。以下、具体的な内容について説明する。
【0111】
図13に、マスタビットマップテーブル120の例を示す。マスタビットマップテーブル120は、各MP64のチェック対象ポートを示したビットマップテーブルであって、MP番号122と、#0〜#N−1のポート番号123から構成されている。
【0112】
MP番号122のエントリには、#0〜#3のMP64の番号が格納され、各ポート番号123のエントリには、#0〜#3のMP64に関するビットマップとして“1”または“0”の情報が格納される。なお、最下段のエントリには、処理MP数が各ポート番号123に対応して格納される。
【0113】
この際、#0〜#3のMP64に関するビットマップとして、各ポート番号123には、各MP64のチェック対象ポートに対しては、“1”が格納され、各MP64のチェック対象ポートから外れたポートに対しては、“0”が格納される。
【0114】
図13の例では、#0のMP64は、#0のポート番号123のポートをチェック対象ポートとし、#1のMP64は、#1のポート番号123のポートをチェック対象ポートとし、#2のMP64は、#2のポート番号123のポートをチェック対象ポートとしている。また#0〜#2のMP64は、#3のポート番号123に対応したポートをそれぞれチェック対象ポートとしている。#0、#1のMP64は、#N−1のポート番号123に対応したポートをチェック対象ポートとしている。
【0115】
すなわち、#0〜#2のポート番号123に対応したポートは、1つのMP64のみが処理を行う占有ポートとなり、#3と#N−1のポート番号123に対応したポートは、2以上のMP64が処理を担当する共有ポートとなる。
【0116】
ここで、マスタビットマップテーブル120は、その一部を省略すると、例えば、図14に示すように、マスタビットマップテーブル124として表すことができる。このマスタビットマップテーブル124から、図15に示すポートスキャンビットマップテーブル126を生成することができる。
【0117】
ポートスキャンビットマップテーブル126は、マスタビットマップテーブル124の内容をコピーして作成したものであって、各MP64が、#0〜#N−1のポートに対応したキュー81またはキュー91をポートスキャンし、新規IOや転送完了通知などのポートイベントを検出するために用いられる。
【0118】
すなわち、ポートスキャンビットマップテーブル126は、各MP64がポートスキャンを行う際に用いるビットマップテーブルとして構成されている。各MP64が、ポートスキャンビットマップテーブル126に従ってポートスキャンを実施し、ポートイベントを検出したときには、この検出結果が、図16に示すイベントビットマップテーブル128に反映されるようになっている。
【0119】
イベントビットマップテーブル128は、ポートイベントの検出の有無を記録するテーブルであって、各MP64によってポートイベントが検出されたときに、各ポートイベントの検出されたポートを記録するためのビットマップテーブルである。
【0120】
この際、各MP64によってポートイベントが開始される前は、イベントビットマップテーブル128の全てのビットは“0”になっている。各MP64が、ポートスキャンビットマップテーブル126に従ってポートスキャンを行って、キュー81またはキュー91に対応したポートでポートイベントが検出されないときには、イベントビットマップテーブル128のビットは、“0”のままであるが、キュー81またはキュー91に対応したポートでポートイベントが検出されたときには、イベントビットマップテーブル128のうち、ポートイベントが検出されたポートのビットが“0”から“1”に反転する。
【0121】
例えば、#1のMP64がポートスキャンビットマップテーブル126にしたがって#1のポートをポートスキャンし、#2のMP64がポートスキャンビットマップテーブル126にしたがって#2のポートをポートスキャンしたときに、#1のポートと#2のポートでポートイベントが検出されなかったときには、イベントビットマップテーブル128のうち、#1のMP64に対応した#1のポートのビットと#2のMP64に対応した#1のポートのビットは、それぞれ“0”である。
【0122】
一方、#0のMP64がポートスキャンビットマップテーブル126にしたがって#0のポートをポートスキャンし、#0〜#2のMP64がポートスキャンビットマップテーブル126にしたがって#3のポートをポートスキャンし、#0〜#1のMP64がポートスキャンビットマップテーブル126にしたがって#N−1のポートをポートスキャンし、各ポートでポートイベントが検出されたときには、イベントビットマップテーブル128のうち、#0のMP64に対応した#0のポートのビットと、#0〜#2のMP64に対応した#3のポートのビットと、#0〜#1のMP64に対応した#N−1のポートのビットは、それぞれ“0”から“1”に反転する。
【0123】
このように、ポートイベントが検出されたポートに対して、イベントマップテーブル128に“1”のビット情報を格納し、ポートイベントが検出されないポートに対して、イベントマップテーブル128に“0”のビット情報を格納することで、ポートイベントのないポートをチェック対象ポートから除外することができる。
【0124】
すなわち、ポートスキャンビットマップテーブル126を用いてポートスキャンを行って、ポートイベントの検出の有無をイベントビットマップテーブル128に反映した後、次回のポートスキャンのときには、ポートイベントの検出の有無が反映されたイベントビットマップテーブル128を用いてポートスキャンを行うことで、各MP64は、各ポートについて“0”のビット情報が格納されているポートに対しては、ポートスキャンを省略することができる。
【0125】
次に、LDEV‐ポート対応テーブル130の例を図17に示す。LDEV‐ポート対応テーブル130は、各LDEVがLU定義されたポートの一覧を示すテーブルであって、各LDEVがLU定義されていないポートをチェック対象ポートから除外するために用いられる。
【0126】
このLDEV‐ポート対応テーブル130は、LDEV番号132と、#0から#Xのポート番号134から構成されている。LDEV番号132には、LDEV番号が格納され、ポート番号134には、LDEVがLU定義されたポートに対しては、“1”のデータが格納され、LDEVがLU定義されていないポートに対しては、“0”のデータが格納される。
【0127】
LDEV‐ポート対応テーブル130は、図18に示すように、共有メモリ28に格納されたLDEV‐MPPK対応テーブル136を基に生成され、共有メモリ28に格納された後、各MPPK36のPM68にコピーされるようになっている。各PM68にコピーされたLDEV‐ポート対応テーブル130は、マスタビットマップテーブル120、124の生成に用いられる。このため、LDEVがLU定義されたポートに関する情報をマスタビットマップテーブル120、124に反映し、このマスタビットマップテーブル120、124に従ってポートスキャンビットマップテーブル126を生成することで、各LDEVがLU定義されたポートをチェック対象ポートから除外するができる。
【0128】
例えば、図17に示すLDEV‐ポート対応テーブル130の場合、#0のLDEVは、#0のポートに対してLU定義され、#10のLDEVは、#1のポートに対してLU定義されている。これに対して、#0のLDEVと#10のLDEVは、#2〜#Xのポートに対しては、LU定義されていない。このため、#0のLDEVと#10のLDEVに関するポートとして、#0のポートと#1のポートをチェック対象ポートとし、#2〜#Xのポートをチェック対象ポートから除外することができる。
【0129】
次に、3種類のビットマップテーブルの初期設定処理を図19のフローチャートにしたがって説明する。
【0130】
まず、3種類のビットマップテーブルを初期化するに際して、全ポートに対して以下の処理を実施する。まず、各MPPK36に属するMP64のうちいずれか1つのMP64は、図20に示すLDEV‐ポート対応テーブル130を参照し、各ポートについてビットが“1”(ON)か否かを判定し(S11)、ビットが“1”でないと判定したときには、図21に示すマスタビットマップテーブル124のビットを“0”(OFF)とし(S12)、ステップS14の処理に移行する。
【0131】
一方、ステップS11において、ビットが“1”であると判定したときには、MP64は、#0〜#3のMP64のうち#0のMP64から#1、#2、#3のMP64の順に、各ポートについて、LDEV‐ポート対応テーブル130にしたがってポート割り付けを行う(S13)。すなわち、図21に示すマスタビットマップテーブル124の各ポートに対して、ビットオンとするための処理として、“1”のデータを格納する。例えば、LDEV‐ポート対応テーブル130を基に、#0、#1のポートについては、#0〜#3のMP64に対して“1”のデータを格納する。
【0132】
この後、MP64は、全てのポートについての処理を終えたか否かを判定し、全てのポートに対する処理を終えていないときには、ステップS11に戻り、ステップS11からステップS14の処理を繰り返し、全てのポートに対する処理を終了したときには、マスタビットマップテーブル124のデータをポートスキャンビットマップテーブル126にコピーする処理を行う(S15)。この後、MP64は、イベントビットマップテーブル128の各ビットマップを全て0クリアとし(S16)、このルーチンでの処理を終了する。
【0133】
なお、図21に示すマスタビットマップテーブル124は、LU定義のないポートを抑止した状態、すなわち絞り込み前の状態を示しており、1ポートについて、1つのMP64に絞り込んだときには、図22に示すような構成となる。
【0134】
図22に示す場合、#0のMP64は、#0のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。また#1のMP64は、#1のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。
【0135】
このように、LU定義のないポートは、IO情報を受領することがないため、各MP64のポートスキャンのチェック対象ポートから除外することで、各MP64のポートスキャンを高速化することができる。
【0136】
次に、図23に、ポート稼働率テーブル140の構成を示す。ポート稼働率テーブル140は、各MP64のポート稼働率を集計して記録するためのテーブルであって、MP番号142と#0〜#N−1のポート番号144から構成されている。
【0137】
図23に示すポート稼働率テーブル140の例では、#0のMP64について、#0のポートのポート稼働率が40であることを示し、#1のMP64については、#1のポートについてのポート稼働率が60であることを示し、#2のMP64については、#2のポートについてのポート稼働率が30であることを示している。ポート稼働率テーブル140の最下欄は、各ポートに対するポート稼働率の合計を示している。
【0138】
次に、図24に、ポート稼働率‐MP数対応テーブル146の構成を示す。ポート稼働率‐MP数対応テーブル146は、ポート稼働率によって各ポートの共有MP数(各ポートに関する処理を共有するMP64の数)を決定するためのテーブルであって、ポート稼働率148とMP数150で構成されている。
【0139】
ポート稼働率148の各エントリには、例えば、「0〜49」、「50〜99」、「100〜149」、「150〜」がチューニングパラメータあるいは閾値として格納されている。各チューニングパラメータあるいは閾値に対して、MP数150の各エントリには、「1」、「2」、「3」、「4」が格納されている。
【0140】
この場合、ポート稼働率148のチューニングパラメータあるいは閾値が「0〜49」のときには、各ポートに対して、1つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「50〜99」のときには、各ポートに対して、2つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「100〜149」のときには、各ポートに対して、3つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「150〜」のときには、各ポートに対して、4つのMP64が割り付けられる。
【0141】
すなわち、図24に示すポート稼働率‐MP数対応テーブル146を用いた場合、ポート稼働率148として「0〜49」を用いるときには、1個のMP64を用い、ポート稼働率148として「50〜99」を用いるときには、2個のMP64を用い、ポート稼働率148として「100〜149」を用いるときには、3個のMP64を用い、ポート稼働率148として「150〜」を用いるときには、4個のMP64を用いることになる。なお、これらの数値は、管理用端末32から自動または手動で設定することができる。
【0142】
次に、LDEV‐ポート対応テーブル130の初期設定処理を図25〜図27のフローチャートおよび図28のシーケンス図にしたがって説明する。
【0143】
まず、図25に示すように、全てのMPPK36に属する任意のMP64、例えば、オーナー権を有するMP64は、共有メモリ28に格納されたLDEV−MPPK対応テーブル136を更新し(S21)、共有メモリ28に格納されたLDEV−ポート対応テーブル130を作成し(S22)、このルーチンでの処理を終了する。
【0144】
次に、共有メモリ28に格納されたLDEV‐ポート対応テーブル130を作成するに際しては、図26に示すように、MP64は、全てのLDEVに対して、以下の処理を実施する。
【0145】
まず、MP64は、当該LDEVがLU定義されているポート一覧を共有メモリ28から取得し(S31)、各LDEVがLU定義されているか否かを判定し(S32)、LDEVがLU定義されていないときにはステップS31の処理に戻り、LDEVがLU定義されているときには、LDEV‐ポート対応テーブル130に“1”を設定し(S33)、全てのLDEVをチェックしたか否かを判定し(S34)、チェックしていないときにはステップS31に戻り、チェックが全て完了したときには各MPPK36に共有メモリ28のLDEV‐ポート対応テーブル130に変更がある旨、すなわち、LDEV‐ポート対応テーブル130が新規に作成された旨を通知し(S35)、このルーチンでの処理を終了する。
【0146】
次に、PM68のLDEV‐ポート対応テーブル130を作成するに際しては、図27に示すように、各MPPK36に属するMP64のうち1つのMP64は、共有メモリ28に格納されたLDEV‐ポート対応テーブル130に変更があるか否かを判定し(S41)、変更がないときにはこのルーチンでの処理を終了し、変更があるときには、自MPPK36がオーナーを有する全LDEVに対して以下の処理を実施する。
【0147】
すなわち、MP64は、共有メモリ28に格納されたLDEV‐ポート対応テーブル130の値を、PM68に格納されたLDEV‐ポート対応テーブル130にコピーし(S42)、次に、全LDEVについてチェックが終了したか否かを判定し(S43)、全てのLDEVに対してチェックが終了していないときにはステップS42に戻り、全てのLDEVに対するチェックが終了したときには、このルーチンでの処理を終了する。
【0148】
次に、各種テーブルの初期設定処理を図28のシーケンスチャートにしたがって説明する。まず、全てのMPPK36に属するMP64のうち任意のMP64、例えば、#1のMPPKに属するMP64は、タイミングT71で共有メモリ28に格納されたLDEV‐MPPK対応テーブル136を更新し、タイミングT32で共有メモリ28に格納されたLDEV‐ポート対応テーブル130を作成する。
【0149】
一方、各MPPK36に属するMP64のうち1つのMP64は、タイミングT81、T82で、PM68に格納されているポート稼働率テーブル140を初期化し、タイミングT83、T84で、PM68に格納されたポート稼働率‐MP数対応テーブル146を初期化する。
【0150】
次に、各MPPK36に属する任意の1つのMP64は、タイミングT85、T86で、マスタビットマップテーブル124、ポートスキャンビットマップテーブル126、イベントビットマップテーブル128を作成し、作成した各テーブルをPM68に格納する。
【0151】
次に、ポートスキャンビットマップ126とイベントビットマップ128を利用したときのポートスキャンの処理を図29のフローチャートと図30のシーケンス図にしたがって説明する。
【0152】
各MPPK36に属するMP64は、自MP64のポートスキャンビットマップテーブル126を参照し、チェック対象ポートナンバーを取得する(S51)。例えば、図30に示すように、#0のMP64は、タイミングT91でポートスキャンビットマップテーブル126を参照し、#1のMP64は、タイミングT92でポートスキャンビットマップテーブル126を参照し、#2のMP64は、タイミングT93でポートスキャンビットマップテーブル126を参照する。この際、各MP64は、チェック対象ポート番号を取得するに際しては、ポートスキャンビットマップ126のうち“1”のポートのチェック対象ポートナンバーを取得する。
【0153】
次に、#0のMP64は、タイミングT94でPM68に対してロックを取得する。例えば、図15に示すポートスキャンビットマップテーブル126にしたがって#0のポートに対するロックを取得する(S52)。この場合、タイミングT95で#1〜#3のMP64が#0のポートに対してロックを取得するための処理を行っても、ロックの取得が阻止されることになる。
【0154】
この後、#0のMP64は、ロックが取れたか否かを判定し(S53)、ロックが取れないときにはステップS57の処理に移行し、ロックが取れたときには、タイミングT96でポートINキュー80または90内のIO情報をチェックし、キュー81または91にIO情報が存在するか否かを判定し(S54)、キュー81または91にIO情報が存在しないときにはステップS57の処理に移行し、キュー81または91にIO情報が存在するときには、キュー81またはキュー91に存在するIO情報をタイミングT97でLM70にコピーし(S55)、タイミングT98で自MP64のイベントビットマップテーブル128に“1”をタイミングT98で設定する(S56)。
【0155】
この後、#0のMP64は、タイミングT99で、PM68に対してアンロックを行い(S57)、このルーチンでの処理を終了する。
【0156】
なお、#2のMP64は、タイミングT100でPM68に対してロック取得の処理を行い、その後、タイミングT101でポートINキュー80または90を参照し、キュー81または91にIO情報が存在しないときには空振りとなり、タイミングT102でPM68に対してアンロックを行うことになる。
【0157】
次に、各テーブルを更新するための周期処理を図31のシーケンス図にしたがって説明する。
【0158】
まず、ポートスキャンビットマップテーブル更新周期処理を行うに際して、各MPPK36に属する各MP64は、タイミングT111〜T114で、イベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126にコピーし、ポートスキャンビットマップテーブル126を更新する。これにより、各MP64は、ポートスキャンを行うときには、更新されたポートスキャンビットマップテーブル126にしたがって処理を行うことになる。
【0159】
次に、ポート稼働率採取周期処理を行うに際して、各MPPK36に属する各MP64は、タイミングT115〜T118で、ポート稼働率テーブル140の内容を集計する。すなわち、IO処理に伴ってポート稼働率が変化することを考慮し、各MPPK36に属する各MP64は、ポート稼働率採取周期毎にポート稼働率テーブル140の内容を集計することとしている。
【0160】
次に、ポート稼働率・MP数対応テーブル更新周期処理を行うに際して、各MPPK36に属するMP64のうち任意の1つのMP64は、タイミングT119、T120で、ポート稼働率‐MP数対応テーブル146の内容を更新する。例えばポート稼働率148の各エントリの値を更新したり、あるいはMP数150の各エントリの数値を変更したりする処理を行う。
【0161】
次に、マスタビットマップテーブル更新周期処理を行うに際して、各MPPK36に属するMP64のうち任意の1つのMP64は、タイミングT121、T122で、マスタビットマップテーブル124の内容を更新する。
【0162】
次に、ポートスキャンビットマップテーブルの更新方法を図32のフローチャートにしたがって説明する。
【0163】
この処理は、一定周期で各MPPK36に属する各MP64によって実施される。まず、各MP64は、ポートスキャンビットマップテーブル126を更新するに際して、自MP64のマスタビットマップテーブル124の全ビットに対して以下の処理を実施する。
【0164】
まず、各MP64は、ポートINキュー80または90をチェックし(S61)、キュー81または91に、ポートイベントがあるか否かを判定し(S62)、ポートイベントがないときにはステップS61の処理に戻り、ポートイベントがあると判定したときには、図33に示すように、イベントビットマップテーブル128に“1”のビットを立てる(S63)。すなわち、イベントビットマップテーブル128のうち、ポートイベントが検出されないポートに対応したビットは“0”であるが、ポートイベントが検出されたポートに対応したビットは“1”となる。
【0165】
次に、各MP64は、マスタビットマップテーブル124を参照し、マスタビットマップテーブル124を基に、イベントマップテーブル128で“1”のビットの立っていないビットを落とすための処理を行う(S64)。
【0166】
この際、図33に示すイベントビットマップテーブル128の内容を、図34に示すポートスキャンビットマップテーブル126に反映すると、ポートスキャンビットマップテーブル126は、図35に示すように、その内容が更新された状態となる。
【0167】
例えば、#1のMP64の場合、図34に示すポートスキャンビットマップテーブル126に従ってポートスキャンを行っても、#1のポートについては、ポートイベントがないため、図35に示すように、ポートスキャンビットマップテーブル126のうち、#1のポートに対応したビットが“1”から“0”に更新される。
【0168】
同様に、#2のMP64の場合、図34に示すポートスキャンビットマップテーブル126に従ってポートスキャンを行っても、#2のポートについてポートイベントが発生していないため、図35に示すように、ポートスキャンビットマップテーブル126のうち、#2のポートに対応した“1”のビットが“0”に更新される。
【0169】
次に、各MP64を、図33に示すイベントビットマップテーブル128のビットを全て0クリアし(S65)、このルーチンでの処理を終了する。なおイベントビットマップテーブル128は、各MP64によってポートスキャンが実施されたときに、ポートイベントの有無によってその内容が更新されることになる。
【0170】
このように、ポートイベントの発生の有無に従ってイベントビットマップテーブル128を更新するとともに、更新されたイベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126に反映し、各MP64がポートスキャンするときに、イベントビットマップテーブル128の内容が反映されたポートスキャンビットマップテーブル126を用いることで、ポートイベントが発生しないポートに対するポートINキューチェックを省略することができる。
【0171】
次に、ポート−MP対応付け方法について説明する。本実施例では、以下に示すように、3種類の方法を用いることとしている。
【0172】
ポート−MP対応付け方法1
【0173】
ポート−MP対応付け方法1では、ポート稼働率に基づいて、1ポートずつ共有MP数を決定し、最もMP稼働率の低いMP64から順にポートを割り当てることとている。
【0174】
このポート−MP対応付け方法1を採用すると、ポート毎にきめ細かくMP64を割り当てることが可能となり、MP64のMP稼働率を均一にしやすくなる。また、各MP64で処理すべきポート数を均一にできる。
【0175】
ポート−MP対応付け方法2
【0176】
このポート−MP対応付け方法2では、ポート稼働率に基づいて、1ポートずつ担当MP64を決定し、各MP64のMP稼働率が平均となるように、各ポートを各MP64に割り当てることとしている。
【0177】
ポート−MP対応付け方法2によれば、各MP64のMP稼働率を均一にすることができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【0178】
ポート−MP対応付け方法3
【0179】
このポート−MP対応付け方法3では、MP稼働率に2段の閾値(上限閾値と下限閾値)を設けてヒステリシス制御を行い、MP稼働率が上限閾値を超える毎に、当該MP64の全ての担当ポートに共有MPを1MPずつ増やし、MP稼働率が下限閾値を下回る毎に、当該MP64の全ての担当ポートから、共有MPを1MP減らすこととしている。
【0180】
ポート−MP対応付け方法3によれば、閾値が2つあるため、一方の閾値近傍でMP稼働率が振動するのを抑制することができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【0181】
以下、3種類のポート−MP対応付け方法の具体的内容について説明する。
【0182】
まず、ポート−MP対応付け方法1を図36のフローチャートにしたがって説明する。この処理は、各MPPK36に属するMP64のうち任意の1つのMP64が一定周期で実施する。
【0183】
まず、MP64は、全MP64について、全ポートに関するポート稼働率をPM68から取り込んで集計し(S71)、その後、MP間で共有するポート数の均衡を取るために、ポート稼働率を降順に並べ替える処理を行う(S72)。
【0184】
例えば、図37に示すように、MP64は、見直し前のポート稼働率テーブル140について、ポート稼働率の降順にポートの並び替えを行い、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル140Aを作成する。
【0185】
次に、MP64は、最高負荷ポートから最低負荷ポートに向けて以下の処理を実施する。
【0186】
まず、MP64は、ポート稼働率テーブル140Aとポート稼働率‐MP数対応テーブル146を参照してMP数を決定し(S73)、その後、MP間の負荷を均衡にするために、MP稼働率の最も低いMP64から順に当該ポートを割り当てる(S74)。
【0187】
続いて、MP64は、ポートが割り当てられた当該MP64について、当該ポートの負荷に対応したデータを基にマスタビットマップテーブルを作成し(S75)、全ポートに対する処理を終了したか否かを判定し(S76)、全てのポートについて処理を終了していないときには、ステップS73の処理に戻り、ステップS73〜S76の処理を繰り返し、全てのポートに対する処理を終了したときには、このルーチンでの処理を終了する(S76)。
【0188】
ステップS73、S74においては、図37に示すように、ポート稼働率テーブル140Aとポート稼働率‐MP数対応テーブル146を参照すると、#N−1のポートについては、ポート稼働率の合計が「75」であって、MP数150として、「2」に対応するため、ポート稼働率=「75」を「2」で割った値である「37.5」を、それぞれ#0、#1のMP64に割り付ける。
【0189】
同様に、#1のポートについては、ポート稼働率の合計が「60」であるため、このポート稼働率=「60」を共有MP数=「2」で割った値である「30」をそれぞれ#2、#3のMP64に割り付ける。#0、#2のポートについては、ポート稼働率の合計が「40」または「30」であって、共有MP数150が「1」であるため、#0、#1のMP64よりも、割り付けられたポート稼働率の低い#2のMP64に、ポート稼働率=「40」を割り付ける。また、#2のポートについては、#2のMP64に、ポート稼働率=「40」を割り付けたので、#3のMP64には、ポート稼働率=「30」割り付ける。これらの割り付けを基に、ポート稼働率テーブル140Aからポート稼働率テーブル140Bを作成する。
【0190】
この後、MP64は、ポート稼働率テーブル140Bをマスタビットマップテーブル124に反映し、図37に示すマスタビットマップテーブル124Aを作成する。このマスタビットマップテーブル124Aがポートスキャンビットマップテーブル126に反映される。
【0191】
このため、各MP64は、次のポートスキャン時に、マスタビットマップテーブル124Aの内容が反映されたポートスキャンビットマップテーブル126を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【0192】
また、各MP64のうち一部のMP64は、他のMP64に処理を移行することができるので、負荷を分散することが可能になる。例えば、#0のMP64は、#0のポートに関する処理を#2のMP64に移行することで、負荷を分散することが可能になり、#1のMP64は、#1のポートに関する処理を#2、#3のMP64に移行することで、負荷を分散することが可能になる。
【0193】
なお、マスタビットマップテーブル124Aにおいて、ポート稼働率テーブル140Bのうち、ポート稼働率が0よりも大きい数値が格納されているところのビットは“1”となり、ポート稼働率が0のところは“0”となっている。
【0194】
このように、ポート−MP対応付け方法1を用いることで、ポート稼働率に応じて各ポートを処理するためのMP64を変更することができる。これにより、一部のMP64の負荷を分散することができる。
【0195】
次に、ポート−MP対応付け方法2を図38のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1MP64が一定周期で実施する。
【0196】
まず、MP64は、全MP64について、全ポートのポート稼働率をPM68から取り込んで集計し(S81)、その後、ポート稼働率を降順に並び替える(S82)。例えば、図39に示すように、見直し前のポート稼働率テーブル140のポートについて、ポート稼働率を降順に並び替えて、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル140Cを作成する。
【0197】
この後、MP64は、ポート稼働率の合計から平均MP稼働率を算出する(S83)。例えば、ポート稼働率テーブル140Cを参照し、各ポートのポート稼働率の合計が205である場合、この合計205を、MP数4で割り算して、平均値=51%を算出する。
【0198】
次に、MP64は、MPPK36内の全てのMP64に対して、以下の処理を実施するとともに、高負荷ポートから低負荷ポートに向けて以下の処理を実施する。
【0199】
例えば、MP64は、各ポートについて、ポート処理権限を取得し(S84)、その後、権限を取得したポートのポート稼働率の合計が平均MP稼働率以下か否かを判定し(S85)、ポート稼働率の合計が平均稼働率以下のときには、ステップS84の処理に戻り、ステップS84とS85の処理を繰り返す。
【0200】
一方、ポート稼働率の合計が平均MP稼働率以下でないときには、MP64は、マスタビットマップテーブル124の当該MP64について、当該ポートの箇所に対応したデータを基にビットを設定し(S86)、全てのMP分の処理を行ったか否かを判定し(S87)、全てのMP64に対する処理を終了していないときには、ステップS84に戻り、ステップS84、S85、S86の処理を繰り返し、全てのMP64に対する処理を終了したときには、このルーチンでの処理を終了する。
【0201】
ステップS84、S85においては、図39に示すポート稼働率テーブル140Cを参照し、各ポートを担当する各MPのポート稼働率が平均値となるように、見直し後のポート稼働率テーブルとして、ポート稼働率テーブル140Dを作成する。
【0202】
例えば、#N−1のポートについては、ポート稼働率の合計が75であるため、#0のMP64に対して、ポート稼働率を51に設定し、#1のMP64については24(24=75−51)を設定する。#1のポートに対しては、ポート稼働率の合計が60であって、#1のMP64については、既にポート稼働率として24が設定されているため、27(27=51−24)を設定する。また#1のポートについては、#2のMP64に、ポート稼働率33(33=60−27)を設定する。同様に、#0のポートについては、#2のMP64にポート稼働率18を設定し、#3のMP64にポート稼働率22を設定し、#2のポートに対しては、#3のMP64にポート稼働率30を設定する。
【0203】
また、ステップS86、S87においては、ポート稼働率テーブル140の内容をマスタビットマップテーブル124に反映し、マスタビットマップテーブル124Bを生成する。
【0204】
このように、ポート−MP対応付け方法2を用いることで、各MP64が担当するポートのポート稼働率が平均となるように、各MP64に対して担当ポートを決定することができる。これにより、一部のMP64の負荷を分散することができる。
【0205】
また、マスタビットマップテーブル124Bを用いてポートスキャンビットマップテーブル126を生成した場合、次のポートスキャン時に、各MP64は、マスタビットマップテーブル124Bの内容が反映されたポートスキャンビットマップテーブル126を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【0206】
次に、ポート−MP対応付け方法3を図40のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1つのMP64が一定周期で実施する。
【0207】
まず、MP64は、PM68を検索して、自MP64のMP稼働率を集計し、図41に示すように、MP稼働率が上限閾値L1以上か否かを判定し(S92)、MP稼働率が上限閾値L1以上でないときには、MP稼働率が下限閾値L2未満か否かを判定し(S93)、MP稼働率が下限閾値L2未満であるときには、MP64が担当するポートを共有するMP64の数を1個減らすために、マスタビットマップ124を作成し(S94)、ステップS97の処理に移行する。なお、ステップS93で、MP稼働率が下限閾値L2未満でないと判定したときには、MP64は、ステップS97の処理に移行する。
【0208】
一方、MP64は、ステップS92において、MP稼働率が上限閾値L1以上と判定したときには、自MP64が担当する全てのポートに対して、以下の処理を実施する。
【0209】
具体的には、MP64は、共有MP数<MPPK内MP数か否かを判定し(S95)、このステップで否定の判定結果を得たときには、再度この処理を行い、このステップで肯定の判定結果を得た時には、MP稼働率にしたがって、MP64が担当するポートを共有するMP64を1個追加するために、マスタビットマップテーブル124を作成する(S96)。
【0210】
この後、MP64は、全てのポートに対して、見直すための処理を実施したか否かを判定し(S97)、全てのポートに対して、見直し処理を実施していないときには、ステップS95に戻り、ステップS95からS97の処理を繰り返し、全てのポートに対して、見直し処理を実施したときには、このルーチンでの処理を終了する。
【0211】
このように、MP稼働率にしたがって、当該MP64が担当するポートを共有するMP60の数を変更することができる。この際、MP64の数を増やすと負荷が分散されるため、稼働率が下がるが、上限閾値L1に対して、十分低い下限閾値L2を設定することで、MP稼働率が変動しても、MP稼働率が振動するのを防止することができる。
【0212】
次に、ポート−MP対応付け方法の他の例として、MP障害時における処理を図42のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1つのMP64が一定周期で実施する。
【0213】
まず、MPPK36に属するMP64のうちいずれか1つに障害が発生した場合、健全なMP64がPM68内のマスタビットマップ124を参照し、IO処理可能なMP一覧を取得し(S101)、障害が発生したMP64が保持しているポートに対して、以下の処理を実施する。
【0214】
例えば、#3のMP64で障害が発生した場合、#0〜#2のMP64のうちいずれか1つのMP64は、#3のMP64が保持しているポートは占有ポートか否かを判定し(S102)、占有ポートでないときには、ステップS102の処理を繰り返し、占有ポートであるときには、IO処理可能なMP64によって、当該ポートを共有するように、マスタビットマップ124に対してビットを設定する(S103)。
【0215】
次に、MP64は、全てのポートに対するチェックが終了したか否かを判定し(S104)、全てのポートに対するチェックを終了していないときには、ステップS102の処理に戻り、ステップS102〜S104の処理を繰り返し、全てのポートに対するチェックが終了したときには、このルーチンでの処理を終了する。
【0216】
この場合、マスタビットマップテーブル124として、図43に示すように、マスタビットマップテーブル124を用いているときに、#3のMP64で障害が発生したときには、#3のMP64が保持しているポート、例えば、#0、#2のポートに対して、#0〜#2のMP64に担当させるための処理を行い、マスタビットマップテーブル124Cを、図44に示すように、マスタビットマップテーブル124Dとして作成する。
【0217】
この際、#0のポートについては、#3のMP64の他に、既に、#2のMP64が処理を担当しているので、そのまま、#2のMP64が処理を担当することになる。これに対して、#2のポートについては、#3のMP64のみが担当していたので、#0〜#2のMP64がそれぞれ処理を担当することになる。
【0218】
このように、#3のMP64で障害が発生した場合、#3のMP64が占有する、#2のポートの処理を、#0〜#2のMP64が共有することで、#3のMP64が占有していた占有ポート(#2のポート)に対するIO処理を、他のMP64によって継続することができる。
【0219】
次に、ポート稼働率‐MP数対応テーブル146の内容を動的に変更するときの処理内容を図45のフローチャートにしたがって説明する。この処理は、MPPK36内の任意の1つのMP64が一定周期で実施する。
【0220】
まず、MP64は、ポートINキュー80または90を参照し、INキュー81または91のキュー滞留数を取得し(S111)、次に、一時的な変動の影響を受けて性能が不安定になるのを防止するために、キュー滞留数が過去N回ともに増えているか否かを判定する(S112)。
【0221】
ステップS112において、キュー滞留数が過去N回とも増えていると判定したときには、MP64は、MP障害・MP交換などによってIO処理不可能なMP64の影響を除外するために、マスタビットマップテーブル124を参照し、IO処理可能なMP64の一覧を取得する(S113)。
【0222】
次に、MP64は、PM68を参照して、各MP64のMP稼働率を基に、余剰能力のあるMP64であって、IO処理可能なMP64が存在するか否かを判定し(S114)、このステップS114で否定の判定結果を得たときには、このルーチンでの処理を終了し、このステップS114で肯定の判定結果を得たときには、共有MP64の数が増えるように、切替時(変更時)のポート稼働率を下げるための処理を行い(S115)、このルーチンでの処理を終了する。
【0223】
なお、ステップS114において、MP64の過負荷時に、ポート共有を行っても意味がないため、またMP障害・MP交換などによって、IO処理可能なMP64が減る場合は、見直すための処理は行わないこととしている。
【0224】
ステップS111〜ステップS115の処理を行うことで、キュー81、91のキュー滞留個数が増加したとき、例えば、図46に示すように、夜間のバッチ処理で、前回見直し時のキュー滞留個数を示す基準値STよりも、キュー滞留個数が連続して増加する場合には、図47に示すように、ポート稼働率‐MP対応テーブル146のうちポート稼働率148の閾値=チューニングパラメータを1/2に変更し、閾値=チューニングパラメータが1/2に変更されたポート稼働率‐MP数対応テーブル146Aを生成する。
【0225】
この場合、ポート稼働率148の閾値=チューニングパラメータは、「0〜49」が「0〜24」に、「50〜99」が「25〜49」に、「100〜149」が「50〜74」に、「150〜」が「75〜」にそれぞれ変更されている。
【0226】
一方、ステップS112において、キュー滞留数が過去N回とも増えていないと判定したときには、キュー滞留数が過去N回ともに減っているか否かを判定し(S116)、キュー滞留数が過去N回とも減っていないときには、このルーチンでの処理を終了し、キュー滞留数が過去N回とも減っていると判定したときには、占有MP64が増えるように、切替時のポート稼働率を上げるための処理を行い(S117)、このルーチンでの処理を終了する。
【0227】
すなわち、ステップS111、S112、S116、S117の処理を行った場合、例えば、図48に示すように、バッチ処理の終了に伴って、キュー滞留個数が連続して基準値STよりも減少しているときには、図49に示すように、ポート稼働率‐MP対応テーブル146のポート稼働率48の閾値=パラメータを2倍に変更し、ポート稼働率‐MP数対応テーブル146Bを生成する。
【0228】
この場合、ポート稼働率148の閾値=チューニングパラメータは、「0〜49」が「0〜99」に、「50〜99」が「100〜199」に、「100〜149」が「200〜299」に、「150〜」が「300〜」にそれぞれ変更されている。
【0229】
このように、INキュー81、91のキュー滞留数(IO滞留数)とMP稼働率を基にポート稼働率‐MP数対応テーブル146の値を動的に見直すことで、キュー滞留数(IO滞留数)に応じて最適なMP数とすることができる。
【0230】
例えば、キュー滞留数が増加した場合には、ポート稼働率148の閾値を1/2に変更することで、各MP64のポート稼働率が増加しても、各MP64のポート稼働率の増加に応じて、ポート稼働率‐MP数対応テーブル146おけるMP数150の値として、大きな数値が用いられるので、多くのMP64で処理を行うことができる。
【0231】
逆に、キュー滞留数が減少しているときには、ポート稼働率148の閾値を2倍に変更することで、各MP64のポート稼働率が変化しても、各MP64のポート稼働率が閾値の範囲内で変化している間は、少ないMP64で処理を行うことができる。
【0232】
本実施例によれば、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行するようにしたので、各MP64の検索対象となるキュー81、91の数を減少させることができ、各キュー81、91に格納されたコマンド(入出力要求)などの情報の検出を高速に行うことができる。
【0233】
また、本実施例によれば、各制御部60に属する各MP64が占有モードまたは共有モードを選択するに際して、スループットよりもレスポンスタイムを重視する場合、占有モードを選択することで、ロック競合が発生したり、ポートイベントによる情報を他のMP64に取得されたりするのを防止することができるとともに、レスポンスタイムの遅延を防止できる。
【0234】
一方、各制御部60に属する各MP64が占有モードまたは共有モードを選択するに際して、レスポンスタイムよりもスループットを重視する場合、共有モードを選択することで、1つのポートに関する処理を複数のMP64で共有することができ、スループットの向上に寄与することができる。
【符号の説明】
【0235】
10 オープン系ホスト計算機、12 メインフレーム用ホスト計算機、14 ストレージサブシステム、16、18 ネットワーク、20 オープンポートパッケージ、22 メインフレームポートパッケージ、24 ドライブポートパッケージ、26 キャッシュメモリ、28 共有メモリ、30 スイッチパッケージ、34 記憶装置、38 HDD、52 オープンポートMP、54 MFポートMP、56 ドライブポートMP、36 MPPK、60 制御部、62 記憶部、64 MP、68 PM、70 LM、76 MP検索テーブル80 オープンポートINキュー、86 MP検索テーブル、90 MFポートINキュー、120、124 マスタビットマップテーブル、126 ポートスキャンビットマップテーブル、128 イベントビットマップテーブル、130 LDEV−ポート対応テーブル、136 LDEV−MPPK対応テーブル、140 ポート稼働率テーブル、146 ポート稼働率−MP数対応テーブル。
【技術分野】
【0001】
本発明は、複数の記憶装置の記憶領域に割り当てられる複数の論理記憶装置に対する入出力処理を行うストレージサブシステムに関する。
【背景技術】
【0002】
ストレージサブシステムにおいては、複数の記憶装置の記憶領域に割り当てられた複数の論理記憶装置をホスト計算機に対して認識可能に提供し、ホスト計算機による当該論理記憶装置へのデータへの入出力処理ができるようになっている。
【0003】
ストレージサブシステムでは、ホスト計算機から入出力要求を受けたときには、ストレージサブシステム内に設けられたマイクロプロセッサが、入出力要求にしたがって、記憶装置へのデータ書き込み処理や、記憶装置からのデータの読み出し処理などの入出力処理を制御するようになっている。
【0004】
この種のストレージサブシステムの中には、記憶装置との入出力処理を実行するために、複数のマイクロプロセッサとローカルメモリを有する複数の制御部を設けるとともに、記憶装置の論理的記憶領域に対する入出力処理を担当する制御部を管理する管理テーブルを設けたものが提案されている(特許文献1参照)。
【0005】
特許文献1に記載されたシステムでは、例えば、ホスト計算機から、ポートを介して、記憶装置の論理的記憶領域に対する入出力要求があった場合、ホストインタフェース部が管理テーブルに基づいて、記憶装置の論理的記憶領域の入出力処理を担当する制御部を特定し、特定した制御部へ入出力要求を転送し、入出力要求を受けた制御部の中のいずれかのマイクロプロセッサが記憶装置の論理的記憶領域に対する入出力処理を実行するようになっている。
【0006】
特許文献1に記載されたシステムによれば、記憶装置の論理的記憶領域と各制御部との対応関係が管理テーブルで管理されているので、記憶装置の論理的記憶領域と各制御部との対応関係を任意に設定することができるとともに、ポートとマイクロプロセッサとの対応関係を固定することなく、制御部の中の複数のマイクロプロセッサに対して、入出力要求の処理を担当すべきマイクロプロセッサを任意に設定することができる。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2008−269424号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
しかし、従来技術では、ホスト計算機からの入出力要求が増加するに伴って、ホストインタフェース部のポート数を増やすと、制御部内の各マイクロプロセッサが処理を担当すべきポート数が増加するので、各ポートに入力された入出力要求を処理すべきマイクロプロセッサを決定するのに時間を要することになる。
【0009】
一方、1つのポートに入力された入出力要求に対して、複数のマイクロプロセッサで処理を共有する構成を採用した場合、入出力要求を処理すべきマイクロプロセッサを決定する時間を短くすることはできるが、同一の入出力要求に対する処理が複数のマイクロプロセッサで競合した場合、競合した各マイクロプロセッサにおいてオーバーヘッドが発生し、レスポンスタイムが悪化する恐れがある。
【0010】
本発明は、前記従来技術の課題に鑑みて為されたものであり、その目的は、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができるストレージサブシステムを提供することにある。
【課題を解決するための手段】
【0011】
前記目的を達成するために、本発明は、ホスト計算機と複数のポートを介して情報の授受を行う第一インターフェース部と、記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部を備え、前記各制御部は、前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、前記第一インターフェース部は、前記ホスト計算機から、前記各ポートを介して入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求の処理を担当する制御部を特定し、前記特定した制御部に対して入出力要求を転送し、前記入出力要求を受信した制御部は、前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記入出力要求の処理を占有する占有モードまたは2つ以上のマイクロプロセッサが前記入出力要求の処理を共有する共有モードのいずれか一方を選択し、前記選択した占有モードまたは共有モードに従った処理を実行することを特徴とするものである。
【発明の効果】
【0012】
本発明によれば、各ポートと各マイクロプロセッサとの対応関係を各マイクロプロセッサの負荷に基づいて動的に変更することができる。
【図面の簡単な説明】
【0013】
【図1】本発明に係るストレージシステムのブロック構成図である。
【図2】本発明に係るストレージサブシステムのモジュール結合構成図である。
【図3】ポートMPからMPPKへコマンドを転送する処理を説明するための図である。
【図4】ホストコマンド用MP検索テーブルの構成図である。
【図5】ベンダ固有コマンド用MP検索テーブルの構成図である。
【図6】MPPKの内部構成を説明するための構成図である。
【図7】ポートスキャンの基本的な内容を説明するためのフローチャートである。
【図8】ポートスキャンの基本的内容を説明するためのシーケンス図である。
【図9】リード処理の前半時の処理を説明するためのシーケンス図である。
【図10】リード処理の後半時の処理を説明するためのシーケンス図である。
【図11】ライト処理の前半時の処理を説明するためのシーケンス図である。
【図12】ライト処理の後半時の処理を説明するためのシーケンス図である。
【図13】マスタビットマップテーブルの基本構成図である。
【図14】ポートスキャンに用いるマスタビットマップテーブルの構成図である。
【図15】ポートスキャンに用いるポートスキャンビットマップテーブルの構成図である。
【図16】ポートスキャンに用いるイベントビットマップテーブルの構成図である。
【図17】LDEV‐ポート対応テーブルの構成図である。
【図18】LDEV‐ポート対応テーブルを生成する方法を説明するための図である。
【図19】3種類のビットマップテーブルを初期設定するときの処理を説明するためのフローチャートである。
【図20】初期設定に用いられるLDEV‐ポート対応テーブルの構成図である。
【図21】初期設定に用いられるマスタビットマップテーブルであって、絞り込み前の状態を示すマスタビットマップテーブルの構成図である。
【図22】初期設定に用いられるマスタビットマップテーブルであって、絞り込み後の状態を示すマスタビットマップテーブルの構成図である。
【図23】ポート稼働率テーブルの構成図である。
【図24】ポート稼働率‐MP数対応テーブルの構成図である。
【図25】LDEV‐MPPK対応テーブルの作成方法を説明するためのフローチャートである。
【図26】共有メモリにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図27】PMにおけるLDEV‐ポート対応テーブルの作成方法を説明するためのフローチャートである。
【図28】テーブルの初期設定処理を説明するためのシーケンス図である。
【図29】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのフローチャートである。
【図30】ポートスキャンビットマップテーブルを用いてポートスキャンを行うときの処理を説明するためのシーケンス図である。
【図31】MPPKにおける周期処理を説明するためのシーケンス図である。
【図32】ポートスキャンビットマップテーブルの更新処理を説明するためのフローチャートである。
【図33】ポートスキャンビットマップテーブルの更新処理に用いるイベントマップテーブルの構成図である。
【図34】イベントビットマップテーブルの内容を反映する前の状態を示すポートスキャンビットマップテーブルの構成図である。
【図35】イベントビットマップテーブルの内容を反映した後の状態を示すポートスキャンビットマップテーブルの構成図である。
【図36】ポート−MP対応付け方法1を説明するためのフローチャートである。
【図37】ポート−MP対応付け方法1を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図38】ポート‐MP対応付け方法2を説明するためのフローチャートである。
【図39】ポート−MP対応付け方法2を用いてポート稼働率テーブルとマスタビットマップテーブルを更新する方法を説明するための図である。
【図40】ポート‐MP対応付け方法3を説明するためのフローチャートである。
【図41】MP稼働率と時間との関係を説明するための図である。
【図42】MP障害時におけるポート−MP対応付け方法を説明するためのフローチャートである。
【図43】MP障害発生時の状態を説明するためのマスタビットマップテーブルの構成図である。
【図44】MP障害時に健全なMPが処理を担当したときの状態を説明するためのマスタビットマップテーブルの構成図である。
【図45】ポート稼働率‐MP数対応テーブルの動的変更処理を説明するためのフローチャートである。
【図46】夜間のバッチ処理におけるキュー滞留個数と時間との関係を説明するための図である。
【図47】ポート稼働率‐MP数対応テーブルの閾値を1/2に変更する方法を説明するための図である。
【図48】バッチ処理終了時におけるキュー滞留個数と時間との関係を説明するための図である。
【図49】ポート稼働率‐MP数対応テーブルの閾値を2倍に変更した状態を説明するための図である。
【発明を実施するための形態】
【実施例】
【0014】
本実施例は、ホスト計算機から、各ポートを介して入出力要求があったときに、複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部の中から、入出要求の処理を担当する制御部を決定し、決定した制御部は、単一のマイクロプロセッサが入出力要求の処理を占有する占有モードまたは2つ以上のマイクロプロセッサが入出力要求の処理を共有する共有モードのいずれか一方を選択し、選択した占有モードまたは共有モードに従った処理を実行するものである。
【0015】
以下、本発明の一実施例を図面に基づいて説明する。図1は、本発明の一実施例を示すストレージシステムの構成図である。
【0016】
図1において、ストレージシステムは、複数のホスト計算機10、12と、ストレージサブシステム14を備えており、各ホスト計算機10、12とストレージサブシステム14は、ネットワーク16、18を介して互いに接続されている。
【0017】
ホスト計算機10は、オープン系計算機として、例えば、マイクロプロセッサ(CPU)、オペレーティングシステム(OS)、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク16としては、例えば、ファイバチャネルが用いられる。
【0018】
ホスト計算機12は、メインフレーム(Main Frame)用計算機として、例えば、マイクロプロセッサ(CPU)、オペレーティングシステム(OS)、アプリケーションプログラムなどのプログラムを格納するメモリ、情報を入力するための入力装置、情報を表示するための表示装置などを備えて構成されている。ネットワーク18としては、例えば、FICON(FIbre CONnection;商標)、ファイバチャネルが用いられる。
【0019】
この際、各ホスト計算機10、12から送信されるコマンドには、リード要求やライト要求などの入出力要求が含まれている。入出力要求には、例えば、リード対象のデータが管理されているLUN(Logical Unit Number)およびLBA(Logical Block Address)が含まれる。また、各ホスト計算機10、12から送信されるライト要求には、例えば、ライト対象のデータを書き込むLUNおよびLBAと、ライト対象のデータが含まれる。
【0020】
ストレージサブシステム14は、複数のオープンポートパッケージ20と、複数のメインフレームポートパッケージ22と、ドライブポートパッケージ24と、キャッシュメモリ26と、共有メモリ28と、スイッチパッケージ30と、管理用端末32と、記憶装置34と、#0〜#3のマイクロプロセッサパッケージ(Micro Processor Package、以下、MPPKと称する。)36を備え、記憶装置34が複数のHDD(Hard Disk Drive)38から構成されている。
【0021】
ストレージサブシステム14は、図2に示すように、#0のモジュール40または#1のモジュール42として構成され、各モジュール40、42内のスイッチパッケージ30がネットワーク44を介して互いに接続されている。
【0022】
各スイッチパッケージ30は、内部ネットワーク46を介して、各オープンポートパッケージ20と、各メインフレームポートパッケージ22およびドライブポートパッケージ24に接続されているとともに、内部ネットワーク48を介して、#0〜#3のMPPK36に接続され、さらにキャッシュメモリ26と、共有メモリ28および管理用端末32に接続されている。またドライブポートパッケージ24は、内部ネットワーク50を介して、各HDD38に接続されている。
【0023】
各オープンポートパッケージ20は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク16に接続された複数のポート(図示せず)と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うオープンポートマイクロプロセッサ(以下、オープンポートMPと称する。)52を備えている。
【0024】
オープンポートMP52は、各ポートとネットワーク16を介してホスト計算機10と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK36の中から、コマンドの転送先となるMPPK36を特定し、特定したMPPK36に対して、スイッチパッケージ30を介してコマンドを転送する。
【0025】
この際、オープンポートMP52は、キャッシュメモリ26をリードアクセスまたはライトアクセスし、キャッシュメモリ26上に存在するリードデータまたはライトデータをホスト計算機10に送信するための処理を実行する。
【0026】
各メインフレームポートパッケージ22は、チャネルアダプタまたは第一のインターフェース部として、ネットワーク18に接続された複数のポート(図示せず)と、各ポートから入力されたコマンドにしたがってデータのアクセス制御処理を行うメインフレームポートマイクロプロセッサ(以下、MFポートMPと称する。)54を備えている。
【0027】
MFポートMP54は、各ポートとネットワーク18を介してホスト計算機12と情報の授受を行うとともに、各ポートに入力されたコマンドを制御プログラムにしたがって解析し、複数のMPPK36の中から、コマンドの転送先となるMPPK36を特定し、特定したMPPK36に対して、スイッチパッケージ30を介してコマンドを転送する。
【0028】
この際、MFポートMP54は、キャッシュメモリ26をリードアクセスまたはライトアクセスし、キャッシュメモリ26上に存在するリードデータまたはライトデータをホスト計算機12に送信するための処理を実行する。
【0029】
ドライブポートパッケージ24は、ディスクアダプタあるいは第二のインターフェース部として、内部ネットワーク50に接続された複数のポート(図示せず)と、記憶装置34との間でデータの入出力処理を行うドライブポートマイクロプロセッサ(以下、ドライブポートMPと称する。)56を備えている。
【0030】
ドライブポートMP56は、例えば、オープンポートMP52またはMFポートMP54からのリードアクセスまたはライトアクセスに応答して、記憶装置34内の指定のHDD38をアクセス対象として、アクセス対象のHDD38からデータを読み出し、読み出したデータをオープンポートMP52またはMFポートMP54に転送し、あるいはアクセス対象のHDD38に対してデータを書き込むようになっている。
【0031】
この際、各HDD38の記憶領域には、ホスト計算機10、12から参照できる論理的な記憶装置である複数の仮想デバイスとして、複数の論理デバイス(LDEV;Logical DEVice)または複数の論理ボリューム(LV;Logical Volume)、あるいは複数の論理ユニット(LU;Logical Unit)が割り当てられている。また、複数のHDD38でRAID(Redundant
Array of Inexpensive Disks)グループを構成した場合、RAIDグループの記憶領域を複数の論理デバイス、あるいは複数の論理ユニットの記憶領域として用いることもできる。
【0032】
キャッシュメモリ26は、各ポートMP52、54、56の処理に伴うデータなどを一時的に記憶する記憶部として構成されている。
【0033】
共有メモリ28は、#0〜#3のMPPK36で共通となる制御情報や各種テーブルに関する情報などを記憶する記憶部として構成されている。
【0034】
管理用端末32は、#0〜#3のMPPK36などに対して、各種設定をオペレータが自動または手動で行うための情報を入力する端末装置として構成されている。
【0035】
#0〜#3のMPPK36は、記憶部62と、複数のマイクロプロセッサ、例えば、#0〜#3のマイクロプロセッサ(Micro Processor、以下、MPと称する。)64を備え、コマンドで指定されたデータの入出力処理を担当する制御部60として機能し、記憶部62および各MP64が、バス66を介して互いに接続されている。
【0036】
記憶部62は、パッケージメモリ(Package Memory、以下、PMと称する。)68と、各MP64に対応して設けられたローカルメモリ(Local Memory、以下、LMと称する。)70から構成されている。
【0037】
PM68は、共有メモリ28に格納された制御情報と、各ポートMP52、54からのコマンドに関する情報および各種テーブルに関する情報などを格納する主メモリとして構成されている。
【0038】
LM70は、各MP64の処理に伴うデータなどを格納する記憶領域として構成されている。
【0039】
この際、各MP64は、PM68をアクセスし、PM68に格納された情報にしたがって各仮想デバイスに対するデータの入出力処理(IO:INPUT OUTPUT 処理)などを行うとともに、コマンドやデータなどをLM70に格納する。
【0040】
一方、図3に示すように、オープンポートパッケージ20のローカルメモリ72には、オープンINキュー74と、MP検索テーブル76に関する情報を格納するための領域が設けられている。オープンINキュー74は、オープンポートパッケージ20に設けられた複数のポート78に対応した記憶領域として構成されており、オープンINキュー74には、各ポート78が受信したコマンドやコマンドに関する情報が順次格納される。
【0041】
この際、オープンポートMP52は、オープンINキュー74に格納された情報を基にMP検索テーブル76を検索して、コマンドなどの転送先となるMPPK36を特定し、特定したMPPK36にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK36は、PM68のオープンINキュー80にコマンドなどを格納する。
【0042】
PM68のオープンINキュー80は、複数のポート78に対応した記憶領域として構成されており、オープンINキュー80には、各ポート78が受信したコマンドやコマンドに関する情報が、オープンポートMP52の処理に従って順次格納される。
【0043】
同様にして、メインフレームポートパッケージ22のローカルメモリ82は、メインフレームINキュー84とMP検索テーブル86を備えている。メインフレームINキュー84は、メインフレームポートパッケージ22に設けられた複数のポート88に対応した記憶領域として構成されており、メインフレームINキュー84には、各ポート88が受信したコマンドやコマンドに関する情報が順次格納される。
【0044】
この際、MFポートMP54は、メインフレームINキュー84に格納された情報を基にMP検索テーブル86を検索して、コマンドなどの転送先となるMPPK36を特定し、特定したMPPK36にコマンドなどを転送する。このとき、コマンドなどを受信したMPPK36は、PM68のメインフレームINキュー90にコマンドなどを格納する。
【0045】
PM68のメインフレームINキュー90は、複数のポート88に対応した記憶領域として構成されており、メインフレームINキュー90には、各ポート88が受信したコマンドやコマンドに関する情報が、MFポートMP54の処理に従って順次格納される。
【0046】
図4に、オープン系ホスト計算機に適用されるホストコマンド(標準化されたコマンド)用MP検索テーブル76の例を示す。
【0047】
ホストコマンド用MP検索テーブル76は、ポート番号100と、ソースID102と、LUN番号104と、宛先MPPK番号106から構成されている。ポート番号100には、各ポート78の番号が格納され、ソースID102には、ホスト計算機10を識別するための番号が格納される。LUN番号104には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号106には、コマンドに関する情報の宛先(転送先)となるMPPK36の番号が格納される。
【0048】
図5に、オープン系ホスト計算機に適用されるベンダ固有コマンド(各ベンダが独自に規定するコマンド)用検索テーブル77の例を示す。
【0049】
MP検索テーブル77は、LUN番号108と、宛先MPPK番号110から構成されている。LUN番号108には、コマンドで指定されるLUN番号であって、データのアクセス先となる番号が格納される。宛先MPPK番号110には、コマンドやコマンドに関する情報の宛先(転送先)となるMPPK36の番号が格納される。なお、MP検索テーブル86もMP検索テーブル76と同様に構成することができる。
【0050】
一方、各PM68におけるオープンINキュー80と、メインフレームINキュー90は、図6に示すように、各ポート78、88に対応した数のキュー81、91を備えている。例えば、オープンINキュー80は、#0〜#Mのポート78に対応して、#0〜#Mのキュー81を備えている。メインフレームINキュー90は、#0〜#Nのポート88に対応して、#0〜#Nのキュー91を備えている。
【0051】
この際、各MPPK36に属する各MP64は、それぞれPM68内のオープンINキュー80内の任意のキュー81や、メインフレームINキュー90内の任意のキュー91をアクセスし、各キュー81またはキュー91に格納されたコマンドなどの処理を実行することができる。例えば、各MP64は、各キュー81または各キュー91をアクセスするためのポートスキャンを実行し、ポートスキャンで得られたコマンドなどの処理を実行する。
【0052】
次に、各MP64のポートスキャンの処理を図7のフローチャートと図8のシーケンス図にしたがって説明する。
【0053】
各MP64は、例えば、ホスト計算機10からのコマンドに関する処理を実行する場合、各ポート78に対応したキュー81をアクセスするために、チェック対象ポートに関する情報を取得する(S1)。
【0054】
例えば、#0のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT1でチェック対象ポートに対応するキュー81をアクセスし、#1のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT2でチェック対象ポートに対応したキュー81をアクセスし、#2のMP64は、チェック対象ポートに関する情報を取得するために、タイミングT3でチェック対象ポートに対応するキュー81をアクセスする。
【0055】
次に、#0のMP64は、例えば、#0のキュー81をアクセスした場合、タイミングT4で#0のキュー81に対するロック(アクセス権)を取得する(S2)。このとき、#1のMP64は、タイミングT5で#0のキュー81をアクセスし、#0のキュー81に対して、ロックを取得しようとしても、#0のMP64との間でロック競合が生じることになる。
【0056】
この後、#0のMP64は、ロックが取れたか否かを判定し(S3)、ロックが取れないときには、ステップS6の処理に移行し、ロックが取れたときにはタイミングT6で#0のキュー81にIO(INPUT OUTPUT)情報(入出力処理に関する情報)が存在するか否かをチェックする(S4)。
【0057】
このとき、#0のMP64は、#0のキュー81にIO情報が存在しないときには、ステップS6の処理に移行し、#0のキュー81にIO情報が存在するときには、タイミングT7において、#0のキュー81に存在するIO情報をローカルメモリ70にコピーし(S5)、タイミングT8で、PM68に対して、#0のキュー81に対する処理が終了したとして、アンロックを行い(S6)、このルーチンでの処理を終了する。
【0058】
この後、#0のMP64は、ローカルメモリ70に格納されたIO情報を基にIO処理を開始する。なお、#2のMP64がタイミングT9でPM68に対してロック取得を行い、その後、タイミングT10において、チェック対象ポートに対応したキュー81をアクセスしたときに、アクセス先のキュー81にIO情報が存在しないときには、ポートイベントの空振りとなり、タイミングT11で、PM68に対してアンロックを行うことになる。
【0059】
ここで、ポートイベントとは、コマンド、新規IO、転送完了通知などの情報がポート78、88を介してオープンINキュー80またはメインフレームINキュー90に入力されることを意味し、ポートイベントの空振りとは、オープンINキュー80のキュー81またはメインフレームINキュー90のキュー91に、コマンド、新規IO、転送完了通知などの情報が存在しない状態を意味する。
【0060】
次に、リード処理のシーケンスを図9と図10にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機10としているが、コマンドの発行元をホスト計算機12としても同様に行うことができる。
【0061】
まず、タイミングT21でホスト計算機10からのリードコマンドをオープンポートMP52が受信すると、オープンポートMP52は、受信したリードコマンドを基にMP検索テーブル76を検索し、リードコマンドにしたがって転送先のMPPK36を特定し、特定したMPPK36のPM68に対して、タイミングT22でリードコマンドを転送する。
【0062】
例えば、オープンポートMP52は、ホスト計算機10から、複数の仮想デバイスのうちの一の仮想デバイス(例えば、一の論理ユニット)に対するデータの入出力要求として、リードコマンドを受けたときには、このリードコマンドに基づいて、複数の制御部60の中から、一の仮想デバイスに対するリード処理を担当する制御部60を特定し、特定した制御部60が属するMPPK36を転送先として、転送先のMPPK36にリードコマンドを転送する。
【0063】
このときリードコマンドを受信したMPPK36内においては、各MP64が非同期でPM68に対してポートスキャンを実施している。例えば、#1のMP64がタイミングT23でPM68に対してポートスキャンを開始し、例えば、#1のキュー81を検索する。このとき、タイミングT24で、#2のMP64がPM68に対してポートスキャンを開始し、PM68の#1のキュー81をアクセスすると、#2のMP64は、#1のMP64との間にロック競合が発生する。
【0064】
一方、#1のMP64が#1のキュー81に対してポートスキャンを実施し、#1のキュー81に対してロックを取得した後、#1のキュー81にリードコマンドが存在しているときには、タイミングT25で#1のLM70にリードコマンドを格納する。
【0065】
次に、#1のMP64は、タイミングT26で#1のLM70に格納されたリードコマンドを読み出してコマンドを解析する。この後、#1のMP64は、タイミングT27で、リードコマンドにしたがって、PM68に格納された制御情報をアクセスしてコマンド処理を開始する。
【0066】
例えば、#1のMP64は、PM68に格納された制御情報を基にリードコマンドで指定されたリードデータがキャッシュメモリ26に存在するか否かの判定を行い、リードデータがキャッシュメモリ26に存在するときには、ヒットとして、オープンポートMP52に対して、キャッシュメモリ26に存在するリードデータをアクセス先とする処理を行う。この場合、オープンポートMP52は、キャッシュメモリ26に存在するリードデータを読み出して、ホスト計算機10へ転送する。
【0067】
一方、キャッシュメモリ26にリードデータが存在しないときには、#1のMP64は、ミスヒットとして、ドライブポートMP56に対して、一の仮想デバイスに対するリードアクセスを指示する。この場合、ドライブポートMP56は、一の仮想デバイスに対するリードアクセスで得られたリードデータをキャッシュメモリ26に転送する。この後、オープンポートMP52は、キャッシュメモリ26からリードデータを読み出して、ホスト計算機10へ転送するか、またはドライブポートMP56から転送されたリードデータをホスト計算機10へ転送する。
【0068】
次に、タイミングT28において、#1のMP64は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP52へ転送するとともに、オープンポートMP52に対して、転送パラメータをホスト計算機10へ転送するための転送を起動し、その後、処理待ち状態となる。
【0069】
次に、図10に示すように、#1のMP64が処理待ち状態となっているときに、タイミングT29で、転送完了通知がオープンポートMP52に入力されると、オープンポートMP52は、転送完了通知を基に、タイミングT28で転送パラメータを作成したMP64が属するMPPK36を特定し、特定したMPPK36に対して、タイミングT30で転送完了通知を送る。この転送完了通知は、オープンポートMP52で特定されたMPPK36のオープンINキュー80うち、#1のキュー81に格納される。
【0070】
次に、タイミングT31で、#2のMP64がPM68に対してポートスキャンを行い、オープンINキュー80のうち#1のキュー81をアクセスすると、#2のMP64は、#1のキュー81に格納されていた情報として、転送完了通知を、タイミングT32で#2のLM70に格納する。
【0071】
タイミングT33で、#2のMP64が#2のLM70をアクセスし、#2のLM70に存在する転送完了通知は、#1のMP64に対する転送完了通知であることをチェックしたときには、#2のMP64は、タイミングT34で、転送完了通知の再送信として、#1のMP64に対する転送完了通知を#1のLM70に返送する。
【0072】
一方、タイミングT35で、#1のMP64がPM68に対してポートスキャンを行い、#1のキュー81をアクセスしたときに、#1のキュー81に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT36で処理を再開する。
【0073】
処理を再開した、#1のMP64は、タイミングT37で#1のLM70をアクセスし、転送完了通知を受領した場合、タイミングT38で転送完了通知をチェックする。このとき、転送完了通知が、#1のMP64に対する転送完了通知である判定したときには、#1のMP64は、タイミングT39で、1つのIO処理(ジョブ)が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT39でオープンポートMP52に対して送信し、リード処理を終了する。
【0074】
次に、ライト処理のシーケンスを図11と図12にしたがって説明する。なお、以下の処理では、コマンドの発行元をホスト計算機10としているが、コマンドの発行元をホスト計算機12としても同様に行うことができる。
【0075】
まず、タイミングT41でホスト計算機10からのライトコマンドをオープンポートMP52が受信すると、オープンポートMP52は、受信したライトコマンドを基にMP検索テーブル76を検索し、ライトコマンドにしたがって転送先のMPPK36を特定し、特定したMPPK36のPM68に対して、タイミングT42でライトコマンドを転送する。
【0076】
例えば、オープンポートMP52は、ホスト計算機10から、複数の仮想デバイスのうちの一の仮想デバイス(例えば、一の論理ユニット)に対するデータの入出力要求として、ライトコマンドを受けたときには、このライトコマンドに基づいて、複数の制御部60の中から、一の仮想デバイスに対するライト処理を担当する制御部60を特定し、特定した制御部60が属するMPPK36を転送先として、転送先のMPPK36にライトコマンドを転送する。
【0077】
このときライトコマンドを受信したMPPK36内においては、各MP64が非同期でPM68に対してポートスキャンを実施している。例えば、#1のMP64がタイミングT43でPM68に対してポートスキャンを開始し、例えば、#1のキュー81を検索する。このとき、タイミングT44で、#2のMP64がPM68に対してポートスキャンを開始し、PM68の#1のキュー81をアクセスすると、#2のMP64は、#1のMP64との間にロック競合が発生する。
【0078】
一方、#1のMP64が#1のキュー81に対してポートスキャンを実施し、#1のキュー81に対してロックを取得したあと、#1のキュー81にライトコマンドが存在しているときには、タイミングT45で#1のLM70にライトコマンドを格納する。
【0079】
次に、#1のMP64は、タイミングT46で#1のLM70に格納されたライトコマンドを読み出してコマンドを解析する。この後、#1のMP64は、タイミングT47で、ライトコマンドにしたがって、PM68に格納された制御情報をアクセスしてコマンド処理を開始する。
【0080】
例えば、#1のMP64は、PM68に格納された制御情報を基にライトコマンドで指定されたライトデータを格納すべき領域がキャッシュメモリ26に存在するか否かの判定を行い、ライトデータを格納すべき領域がキャッシュメモリ26に存在するときには、オープンポートMP52に対して、キャッシュメモリ26をライトデータのアクセス先とする処理を行う。この場合、オープンポートMP52は、ホスト計算機10から転送されたライトデータをキャッシュメモリ26に格納する。キャッシュメモリ26に格納されたライトデータは、その後、ドライブポートMP56によって、一の仮想デバイスに格納される。
【0081】
一方、キャッシュメモリ26にライトデータを格納すべき領域が存在しないときには、#1のMP64は、ドライブポートMP56に対して、キャッシュメモリ26上のデータを一の仮想デバイスに出力させる指示を行い、キャッシュメモリ26上に空き領域を形成させる。その後、オープンポートMP52は、ホスト計算機10から転送されたライトデータをキャッシュメモリ26の空き領域に格納する。
【0082】
次に、タイミングT48において、#1のMP64は、コマンド処理の結果を転送パラメータとして作成し、作成した転送パラメータをオープンポートMP52へ転送するとともに、オープンポートMP52に対して、転送パラメータをホスト計算機10へ転送するための転送を起動し、その後、処理待ち状態となる。
【0083】
次に、図12に示すように、#1のMP64が処理待ち状態となっているときに、タイミングT49で、転送完了通知がオープンポートMP52に入力されると、オープンポートMP52は、転送完了通知を基に、タイミングT48で転送パラメータを作成したMP64が属するMPPK36を特定し、特定したMPPK36に対して、タイミングT50で転送完了通知を送る。この転送完了通知は、オープンポートMP52で特定されたMPPK36のオープンINキュー80うち、#1のキュー81に格納される。
【0084】
次に、タイミングT51で、#2のMP64がPM68に対してポートスキャンを行い、オープンINキュー80のうち#1のキュー81をアクセスすると、#2のMP64は、#1のキュー81に格納されていた情報として、転送完了通知を、タイミングT52で#2のLM70に格納する。
【0085】
タイミングT53で、#2のMP64が#2のLM70をアクセスし、#2のLM70に存在する転送完了通知は、#1のMP64に対する転送完了通知であることをチェックしたときには、#2のMP64は、タイミングT54で、転送完了通知の再送信として、#1のMP64に対する転送完了通知を#1のLM70に返送する。
【0086】
一方、タイミングT55で、#1のMP64がPM68に対してポートスキャンを行い、#1のキュー81をアクセスしたときに、#1のキュー81に転送完了通知が存在しないときには、ポートイベントの空振りとして、タイミングT56で処理を再開する。
【0087】
処理を再開した、#1のMP64は、タイミングT57で#1のLM70をアクセスし、転送完了通知を受領した場合、タイミングT58で転送完了通知をチェックする。このとき、転送完了通知が、#1のMP64に対する転送完了通知である判定したときには、#1のMP64は、タイミングT59で、1つのIO処理(ジョブ)が良好な状態で終了したとして、良好状態のレスポンスであるGOODをタイミングT59でオープンポートMP52に対して送信し、ライト処理を終了する。
【0088】
各MP64がリード処理またはライト処理を行うに際して、複数のMP64から同一のキュー81またはキュー91に対してポートスキャンを実施すると、ロック競合が発生することがある。このロック競合は、各MPPK36に属するMP64の数が増える程頻発することになり、ロック競合により、IO処理時間が増大することになる。
【0089】
また、複数のMP64から同一のキュー81またはキュー91に対してポートスキャンを実施すると、転送完了通知など、ポートイベントに伴う情報が他のMP64に取得され、ポートイベントの空振りが発生することがある。このポートイベントの空振りは、各MPPK36に属するMP64の数が増える程増加し、IO処理時間が増大することになる。
【0090】
そこで、本実施例では、以下に示すように、複数のポート78、88のうちポートイベントのないポート(コマンドや転送完了通知などの情報が入力されないポート)を各ポートMP52、54のチェック対象ポートから除外することとしている。
【0091】
例えば、各MPPK36に属するMP64のチェック対象キュー(検索対象)として、ポートイベントのないポートに対応したキュー81またはキュー91をチェック対象キューから除外することとしている。
【0092】
この際、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0093】
また、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち仮想デバイスが予め割り付けられた(LU定義された)ポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0094】
さらに、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち、コマンド(入出力要求)を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理として、一の仮想デバイスに対するデータの入出力処理を実行することができる。
【0095】
また、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、検索対象のキューに対するポートスキャンを実行し、このポートスキャンの実行によって、コマンド(入出力要求)を得たときには、このコマンド(入出力要求)が格納されたキューに対応するポートに入力されたコマンド(入出力要求)の処理を実行し、検索対象のキューのうち、ポートスキャンの実行によって、コマンド(入出力要求)が存在しないキューを検索対象のキューから除外して、検索対象のキューを更新し、その後のポートスキャンでは、更新した検索対象のキューに対して、ポートスキャンを実行することができる。
【0096】
このように、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、各MP64の検索対象なるキュー81、91の数が減少するので、各キュー81、91に格納されたコマンド(入出力要求)などの情報の検出を高速に行うことができる。
【0097】
また、以下の実施例においては、各MPPK36に属するMP64とポート78またはポート88との対応関係、具体的には、各MPPK36に属する各MP64と各キュー81または各キュー91との対応関係を各MP64の負荷情報を基に動的に切り替えるために、各ポート78、88に入力された情報に関する処理モードとして、占有モードまたは共有モードを採用し、占有モードまたは共有モードにしたがってIO処理を実行することとしている。
【0098】
例えば、各MPPK36に属する各MP64は、各キュー81または各キュー91をアクセスして、各ポート78またはポート88に関する負荷情報として、低負荷状態を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、高負荷状態を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0099】
また、各MPPK36に属する各MP64は、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理に要する処理時間を設定時間毎に計測するとともに、各計測値を順次更新し、コマンド(入出力要求)を受信したときに、更新した各計測値と閾値とを比較し、比較結果から、各ポート78またはポート88に関する負荷情報として、コマンド(入出力要求)の処理に要する処理時間が閾値を下回る負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、前記比較結果から、各ポート78またはポート88に関する負荷情報として、コマンド(入出力要求)の処理に要する処理時間が閾値を上回る負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0100】
さらに、各MPPK36に属する各MP64は、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理に伴うMP稼働率(マイクロプロセッサ稼働率)を算出するとともに、算出したMP稼働率から各ポート78またはポート88に関するポート稼働率をそれぞれ算出し、コマンド(入出力要求)を受信したときに、算出した各ポート稼働率の高低を判定し、この判定結果から、各ポート78またはポート88に関する負荷情報として、算出したポート稼働率が低い値を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、占有モードを選択し、前記判定結果から、各ポート78またはポート88に関する負荷情報として、算出したポート稼働率が高い値を示す負荷情報を得たときには、各ポート78またはポート88に入力されたコマンド(入出力要求)の処理として、共有モードを選択することができる。
【0101】
ここで、占有モードとは、1つのポート78または88に入力された情報に関する処理、例えば、IO処理を1つのMP64で占有するモード、すなわち、1つのキュー81またはキュー91に格納された情報に関する処理、例えば、IO処理を1つのMP64で占有するモードである。
【0102】
一方、共有モードとは、1つのポート78または88に入力された情報に関する処理、例えば、IO処理を複数のMP64で共有するモード、すなわち、1つのキュー81または91に格納された情報に関する処理、例えば、IO処理を複数のMP64で共有するモードである。
【0103】
また、MP稼働率(マイクロプロセッサ稼働率)とは、単位時間当たりのMP64の利用率を示し、ポート稼働率とは、MP稼働率をポート78または88ごとの粒度に分解した値を示す。
【0104】
占有モードを用いた場合、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行することで、チェックすべきキュー数(ポート数)を削減することができるとともに、ロック競合が発生するのを防止することができる。また、各MP64は、自MP64で処理するのに必要なポートイベントに関する情報を他のMP64に取得されるのを防止することができる。
【0105】
ただし、占有モードを用いた場合、1つのポートについてのIO処理性能(1つのキューについてのIO処理性能)が1つのMP64の処理能力で限界になることがある。この場合、スループットが低下することになる。また、MP64が故障したときには、そのままでは、故障したMP64が担当していた処理が実行されなくなることを考慮する必要がある。
【0106】
一方、共有モードを用いてIO処理を行うと、各制御部60に属する各MP64は、1つのキュー(1つのポート)に関するIO処理を複数のMP64で共有するため、占有モードでIO処理するときよりも、IO処理性能が高くなる。
【0107】
ただし、各制御部60に属する各MP64は、共有モードを用いると、ロック競合に伴ってオーバーヘッドが増加することがある。また他のMP64に、自MP64のIO処理に必要なポートイベントに関する情報を取得され、オーバーヘッドの増加に伴ってレスポンスタイムが遅延することを考慮する必要がある。
【0108】
ポート78、88のうちポートイベントのないポートをチェック対象ポートから除外するに際しては、後述するように、マスタビットマップテーブル120、124(図13、図14参照)、ポートスキャンビットマップテーブル126(図15参照)、イベントビットマップテーブル128(図16参照)、LDEV‐ポート対応テーブル130(図17参照)を用い、各MP64とポート78、88との対応関係を動的に切り替えるに際しては、ポート稼働率テーブル140(図23参照)とポート稼働率‐MP数対応テーブル146(図24参照)を用いることとしている。
【0109】
この際、各MPPK(制御部)36の管理対象となる仮想デバイス(LDEV)と各MPPK(制御部)36との関係を定義したLDEV−MPPK(仮想デバイス・制御部対応テーブル)136を基に各仮想デバイス(LDEV)と各ポートとの関係を規定したLDEV‐ポート対応テーブル(仮想デバイス・ポート対応テーブル)130を作成し、LDEV‐ポート対応テーブル130を基に、複数のポートのうちポートスキャンの対象となるポートを各MP64に対して割り付けたマスタビットマップテーブル124を生成し、マスタビットマップテーブル124を基に、複数のポートのうちポートスキャンの対象となるポートを各MP64に対して割り付けたポートスキャンビットマップテーブル126を生成することとしている。
【0110】
この場合、各MP64は、ポートスキャンビットマップテーブル126に従ってポートスキャンの対象となるポートに対するポートスキャンを行ってポートイベントの有無を検出し、ポートスキャンによってポートイベントが検出されたポートを各MP64に対して割り付けたイベントビットマップテーブル128を生成し、イベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126に反映し、イベントビットマップテーブル128の内容が反映されたポートスキャンビットマップテーブル126に従ってポートスキャンの対象となるポートに対するポートスキャンを行って、IO処理を実行することとしている。以下、具体的な内容について説明する。
【0111】
図13に、マスタビットマップテーブル120の例を示す。マスタビットマップテーブル120は、各MP64のチェック対象ポートを示したビットマップテーブルであって、MP番号122と、#0〜#N−1のポート番号123から構成されている。
【0112】
MP番号122のエントリには、#0〜#3のMP64の番号が格納され、各ポート番号123のエントリには、#0〜#3のMP64に関するビットマップとして“1”または“0”の情報が格納される。なお、最下段のエントリには、処理MP数が各ポート番号123に対応して格納される。
【0113】
この際、#0〜#3のMP64に関するビットマップとして、各ポート番号123には、各MP64のチェック対象ポートに対しては、“1”が格納され、各MP64のチェック対象ポートから外れたポートに対しては、“0”が格納される。
【0114】
図13の例では、#0のMP64は、#0のポート番号123のポートをチェック対象ポートとし、#1のMP64は、#1のポート番号123のポートをチェック対象ポートとし、#2のMP64は、#2のポート番号123のポートをチェック対象ポートとしている。また#0〜#2のMP64は、#3のポート番号123に対応したポートをそれぞれチェック対象ポートとしている。#0、#1のMP64は、#N−1のポート番号123に対応したポートをチェック対象ポートとしている。
【0115】
すなわち、#0〜#2のポート番号123に対応したポートは、1つのMP64のみが処理を行う占有ポートとなり、#3と#N−1のポート番号123に対応したポートは、2以上のMP64が処理を担当する共有ポートとなる。
【0116】
ここで、マスタビットマップテーブル120は、その一部を省略すると、例えば、図14に示すように、マスタビットマップテーブル124として表すことができる。このマスタビットマップテーブル124から、図15に示すポートスキャンビットマップテーブル126を生成することができる。
【0117】
ポートスキャンビットマップテーブル126は、マスタビットマップテーブル124の内容をコピーして作成したものであって、各MP64が、#0〜#N−1のポートに対応したキュー81またはキュー91をポートスキャンし、新規IOや転送完了通知などのポートイベントを検出するために用いられる。
【0118】
すなわち、ポートスキャンビットマップテーブル126は、各MP64がポートスキャンを行う際に用いるビットマップテーブルとして構成されている。各MP64が、ポートスキャンビットマップテーブル126に従ってポートスキャンを実施し、ポートイベントを検出したときには、この検出結果が、図16に示すイベントビットマップテーブル128に反映されるようになっている。
【0119】
イベントビットマップテーブル128は、ポートイベントの検出の有無を記録するテーブルであって、各MP64によってポートイベントが検出されたときに、各ポートイベントの検出されたポートを記録するためのビットマップテーブルである。
【0120】
この際、各MP64によってポートイベントが開始される前は、イベントビットマップテーブル128の全てのビットは“0”になっている。各MP64が、ポートスキャンビットマップテーブル126に従ってポートスキャンを行って、キュー81またはキュー91に対応したポートでポートイベントが検出されないときには、イベントビットマップテーブル128のビットは、“0”のままであるが、キュー81またはキュー91に対応したポートでポートイベントが検出されたときには、イベントビットマップテーブル128のうち、ポートイベントが検出されたポートのビットが“0”から“1”に反転する。
【0121】
例えば、#1のMP64がポートスキャンビットマップテーブル126にしたがって#1のポートをポートスキャンし、#2のMP64がポートスキャンビットマップテーブル126にしたがって#2のポートをポートスキャンしたときに、#1のポートと#2のポートでポートイベントが検出されなかったときには、イベントビットマップテーブル128のうち、#1のMP64に対応した#1のポートのビットと#2のMP64に対応した#1のポートのビットは、それぞれ“0”である。
【0122】
一方、#0のMP64がポートスキャンビットマップテーブル126にしたがって#0のポートをポートスキャンし、#0〜#2のMP64がポートスキャンビットマップテーブル126にしたがって#3のポートをポートスキャンし、#0〜#1のMP64がポートスキャンビットマップテーブル126にしたがって#N−1のポートをポートスキャンし、各ポートでポートイベントが検出されたときには、イベントビットマップテーブル128のうち、#0のMP64に対応した#0のポートのビットと、#0〜#2のMP64に対応した#3のポートのビットと、#0〜#1のMP64に対応した#N−1のポートのビットは、それぞれ“0”から“1”に反転する。
【0123】
このように、ポートイベントが検出されたポートに対して、イベントマップテーブル128に“1”のビット情報を格納し、ポートイベントが検出されないポートに対して、イベントマップテーブル128に“0”のビット情報を格納することで、ポートイベントのないポートをチェック対象ポートから除外することができる。
【0124】
すなわち、ポートスキャンビットマップテーブル126を用いてポートスキャンを行って、ポートイベントの検出の有無をイベントビットマップテーブル128に反映した後、次回のポートスキャンのときには、ポートイベントの検出の有無が反映されたイベントビットマップテーブル128を用いてポートスキャンを行うことで、各MP64は、各ポートについて“0”のビット情報が格納されているポートに対しては、ポートスキャンを省略することができる。
【0125】
次に、LDEV‐ポート対応テーブル130の例を図17に示す。LDEV‐ポート対応テーブル130は、各LDEVがLU定義されたポートの一覧を示すテーブルであって、各LDEVがLU定義されていないポートをチェック対象ポートから除外するために用いられる。
【0126】
このLDEV‐ポート対応テーブル130は、LDEV番号132と、#0から#Xのポート番号134から構成されている。LDEV番号132には、LDEV番号が格納され、ポート番号134には、LDEVがLU定義されたポートに対しては、“1”のデータが格納され、LDEVがLU定義されていないポートに対しては、“0”のデータが格納される。
【0127】
LDEV‐ポート対応テーブル130は、図18に示すように、共有メモリ28に格納されたLDEV‐MPPK対応テーブル136を基に生成され、共有メモリ28に格納された後、各MPPK36のPM68にコピーされるようになっている。各PM68にコピーされたLDEV‐ポート対応テーブル130は、マスタビットマップテーブル120、124の生成に用いられる。このため、LDEVがLU定義されたポートに関する情報をマスタビットマップテーブル120、124に反映し、このマスタビットマップテーブル120、124に従ってポートスキャンビットマップテーブル126を生成することで、各LDEVがLU定義されたポートをチェック対象ポートから除外するができる。
【0128】
例えば、図17に示すLDEV‐ポート対応テーブル130の場合、#0のLDEVは、#0のポートに対してLU定義され、#10のLDEVは、#1のポートに対してLU定義されている。これに対して、#0のLDEVと#10のLDEVは、#2〜#Xのポートに対しては、LU定義されていない。このため、#0のLDEVと#10のLDEVに関するポートとして、#0のポートと#1のポートをチェック対象ポートとし、#2〜#Xのポートをチェック対象ポートから除外することができる。
【0129】
次に、3種類のビットマップテーブルの初期設定処理を図19のフローチャートにしたがって説明する。
【0130】
まず、3種類のビットマップテーブルを初期化するに際して、全ポートに対して以下の処理を実施する。まず、各MPPK36に属するMP64のうちいずれか1つのMP64は、図20に示すLDEV‐ポート対応テーブル130を参照し、各ポートについてビットが“1”(ON)か否かを判定し(S11)、ビットが“1”でないと判定したときには、図21に示すマスタビットマップテーブル124のビットを“0”(OFF)とし(S12)、ステップS14の処理に移行する。
【0131】
一方、ステップS11において、ビットが“1”であると判定したときには、MP64は、#0〜#3のMP64のうち#0のMP64から#1、#2、#3のMP64の順に、各ポートについて、LDEV‐ポート対応テーブル130にしたがってポート割り付けを行う(S13)。すなわち、図21に示すマスタビットマップテーブル124の各ポートに対して、ビットオンとするための処理として、“1”のデータを格納する。例えば、LDEV‐ポート対応テーブル130を基に、#0、#1のポートについては、#0〜#3のMP64に対して“1”のデータを格納する。
【0132】
この後、MP64は、全てのポートについての処理を終えたか否かを判定し、全てのポートに対する処理を終えていないときには、ステップS11に戻り、ステップS11からステップS14の処理を繰り返し、全てのポートに対する処理を終了したときには、マスタビットマップテーブル124のデータをポートスキャンビットマップテーブル126にコピーする処理を行う(S15)。この後、MP64は、イベントビットマップテーブル128の各ビットマップを全て0クリアとし(S16)、このルーチンでの処理を終了する。
【0133】
なお、図21に示すマスタビットマップテーブル124は、LU定義のないポートを抑止した状態、すなわち絞り込み前の状態を示しており、1ポートについて、1つのMP64に絞り込んだときには、図22に示すような構成となる。
【0134】
図22に示す場合、#0のMP64は、#0のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。また#1のMP64は、#1のポートをポートスキャンのチェック対象ポートとし、それ以外のポートを、ポートスキャンのチェック対象ポートから除外することができる。
【0135】
このように、LU定義のないポートは、IO情報を受領することがないため、各MP64のポートスキャンのチェック対象ポートから除外することで、各MP64のポートスキャンを高速化することができる。
【0136】
次に、図23に、ポート稼働率テーブル140の構成を示す。ポート稼働率テーブル140は、各MP64のポート稼働率を集計して記録するためのテーブルであって、MP番号142と#0〜#N−1のポート番号144から構成されている。
【0137】
図23に示すポート稼働率テーブル140の例では、#0のMP64について、#0のポートのポート稼働率が40であることを示し、#1のMP64については、#1のポートについてのポート稼働率が60であることを示し、#2のMP64については、#2のポートについてのポート稼働率が30であることを示している。ポート稼働率テーブル140の最下欄は、各ポートに対するポート稼働率の合計を示している。
【0138】
次に、図24に、ポート稼働率‐MP数対応テーブル146の構成を示す。ポート稼働率‐MP数対応テーブル146は、ポート稼働率によって各ポートの共有MP数(各ポートに関する処理を共有するMP64の数)を決定するためのテーブルであって、ポート稼働率148とMP数150で構成されている。
【0139】
ポート稼働率148の各エントリには、例えば、「0〜49」、「50〜99」、「100〜149」、「150〜」がチューニングパラメータあるいは閾値として格納されている。各チューニングパラメータあるいは閾値に対して、MP数150の各エントリには、「1」、「2」、「3」、「4」が格納されている。
【0140】
この場合、ポート稼働率148のチューニングパラメータあるいは閾値が「0〜49」のときには、各ポートに対して、1つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「50〜99」のときには、各ポートに対して、2つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「100〜149」のときには、各ポートに対して、3つのMP64が割り付けられ、ポート稼働率148のチューニングパラメータあるいは閾値が「150〜」のときには、各ポートに対して、4つのMP64が割り付けられる。
【0141】
すなわち、図24に示すポート稼働率‐MP数対応テーブル146を用いた場合、ポート稼働率148として「0〜49」を用いるときには、1個のMP64を用い、ポート稼働率148として「50〜99」を用いるときには、2個のMP64を用い、ポート稼働率148として「100〜149」を用いるときには、3個のMP64を用い、ポート稼働率148として「150〜」を用いるときには、4個のMP64を用いることになる。なお、これらの数値は、管理用端末32から自動または手動で設定することができる。
【0142】
次に、LDEV‐ポート対応テーブル130の初期設定処理を図25〜図27のフローチャートおよび図28のシーケンス図にしたがって説明する。
【0143】
まず、図25に示すように、全てのMPPK36に属する任意のMP64、例えば、オーナー権を有するMP64は、共有メモリ28に格納されたLDEV−MPPK対応テーブル136を更新し(S21)、共有メモリ28に格納されたLDEV−ポート対応テーブル130を作成し(S22)、このルーチンでの処理を終了する。
【0144】
次に、共有メモリ28に格納されたLDEV‐ポート対応テーブル130を作成するに際しては、図26に示すように、MP64は、全てのLDEVに対して、以下の処理を実施する。
【0145】
まず、MP64は、当該LDEVがLU定義されているポート一覧を共有メモリ28から取得し(S31)、各LDEVがLU定義されているか否かを判定し(S32)、LDEVがLU定義されていないときにはステップS31の処理に戻り、LDEVがLU定義されているときには、LDEV‐ポート対応テーブル130に“1”を設定し(S33)、全てのLDEVをチェックしたか否かを判定し(S34)、チェックしていないときにはステップS31に戻り、チェックが全て完了したときには各MPPK36に共有メモリ28のLDEV‐ポート対応テーブル130に変更がある旨、すなわち、LDEV‐ポート対応テーブル130が新規に作成された旨を通知し(S35)、このルーチンでの処理を終了する。
【0146】
次に、PM68のLDEV‐ポート対応テーブル130を作成するに際しては、図27に示すように、各MPPK36に属するMP64のうち1つのMP64は、共有メモリ28に格納されたLDEV‐ポート対応テーブル130に変更があるか否かを判定し(S41)、変更がないときにはこのルーチンでの処理を終了し、変更があるときには、自MPPK36がオーナーを有する全LDEVに対して以下の処理を実施する。
【0147】
すなわち、MP64は、共有メモリ28に格納されたLDEV‐ポート対応テーブル130の値を、PM68に格納されたLDEV‐ポート対応テーブル130にコピーし(S42)、次に、全LDEVについてチェックが終了したか否かを判定し(S43)、全てのLDEVに対してチェックが終了していないときにはステップS42に戻り、全てのLDEVに対するチェックが終了したときには、このルーチンでの処理を終了する。
【0148】
次に、各種テーブルの初期設定処理を図28のシーケンスチャートにしたがって説明する。まず、全てのMPPK36に属するMP64のうち任意のMP64、例えば、#1のMPPKに属するMP64は、タイミングT71で共有メモリ28に格納されたLDEV‐MPPK対応テーブル136を更新し、タイミングT32で共有メモリ28に格納されたLDEV‐ポート対応テーブル130を作成する。
【0149】
一方、各MPPK36に属するMP64のうち1つのMP64は、タイミングT81、T82で、PM68に格納されているポート稼働率テーブル140を初期化し、タイミングT83、T84で、PM68に格納されたポート稼働率‐MP数対応テーブル146を初期化する。
【0150】
次に、各MPPK36に属する任意の1つのMP64は、タイミングT85、T86で、マスタビットマップテーブル124、ポートスキャンビットマップテーブル126、イベントビットマップテーブル128を作成し、作成した各テーブルをPM68に格納する。
【0151】
次に、ポートスキャンビットマップ126とイベントビットマップ128を利用したときのポートスキャンの処理を図29のフローチャートと図30のシーケンス図にしたがって説明する。
【0152】
各MPPK36に属するMP64は、自MP64のポートスキャンビットマップテーブル126を参照し、チェック対象ポートナンバーを取得する(S51)。例えば、図30に示すように、#0のMP64は、タイミングT91でポートスキャンビットマップテーブル126を参照し、#1のMP64は、タイミングT92でポートスキャンビットマップテーブル126を参照し、#2のMP64は、タイミングT93でポートスキャンビットマップテーブル126を参照する。この際、各MP64は、チェック対象ポート番号を取得するに際しては、ポートスキャンビットマップ126のうち“1”のポートのチェック対象ポートナンバーを取得する。
【0153】
次に、#0のMP64は、タイミングT94でPM68に対してロックを取得する。例えば、図15に示すポートスキャンビットマップテーブル126にしたがって#0のポートに対するロックを取得する(S52)。この場合、タイミングT95で#1〜#3のMP64が#0のポートに対してロックを取得するための処理を行っても、ロックの取得が阻止されることになる。
【0154】
この後、#0のMP64は、ロックが取れたか否かを判定し(S53)、ロックが取れないときにはステップS57の処理に移行し、ロックが取れたときには、タイミングT96でポートINキュー80または90内のIO情報をチェックし、キュー81または91にIO情報が存在するか否かを判定し(S54)、キュー81または91にIO情報が存在しないときにはステップS57の処理に移行し、キュー81または91にIO情報が存在するときには、キュー81またはキュー91に存在するIO情報をタイミングT97でLM70にコピーし(S55)、タイミングT98で自MP64のイベントビットマップテーブル128に“1”をタイミングT98で設定する(S56)。
【0155】
この後、#0のMP64は、タイミングT99で、PM68に対してアンロックを行い(S57)、このルーチンでの処理を終了する。
【0156】
なお、#2のMP64は、タイミングT100でPM68に対してロック取得の処理を行い、その後、タイミングT101でポートINキュー80または90を参照し、キュー81または91にIO情報が存在しないときには空振りとなり、タイミングT102でPM68に対してアンロックを行うことになる。
【0157】
次に、各テーブルを更新するための周期処理を図31のシーケンス図にしたがって説明する。
【0158】
まず、ポートスキャンビットマップテーブル更新周期処理を行うに際して、各MPPK36に属する各MP64は、タイミングT111〜T114で、イベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126にコピーし、ポートスキャンビットマップテーブル126を更新する。これにより、各MP64は、ポートスキャンを行うときには、更新されたポートスキャンビットマップテーブル126にしたがって処理を行うことになる。
【0159】
次に、ポート稼働率採取周期処理を行うに際して、各MPPK36に属する各MP64は、タイミングT115〜T118で、ポート稼働率テーブル140の内容を集計する。すなわち、IO処理に伴ってポート稼働率が変化することを考慮し、各MPPK36に属する各MP64は、ポート稼働率採取周期毎にポート稼働率テーブル140の内容を集計することとしている。
【0160】
次に、ポート稼働率・MP数対応テーブル更新周期処理を行うに際して、各MPPK36に属するMP64のうち任意の1つのMP64は、タイミングT119、T120で、ポート稼働率‐MP数対応テーブル146の内容を更新する。例えばポート稼働率148の各エントリの値を更新したり、あるいはMP数150の各エントリの数値を変更したりする処理を行う。
【0161】
次に、マスタビットマップテーブル更新周期処理を行うに際して、各MPPK36に属するMP64のうち任意の1つのMP64は、タイミングT121、T122で、マスタビットマップテーブル124の内容を更新する。
【0162】
次に、ポートスキャンビットマップテーブルの更新方法を図32のフローチャートにしたがって説明する。
【0163】
この処理は、一定周期で各MPPK36に属する各MP64によって実施される。まず、各MP64は、ポートスキャンビットマップテーブル126を更新するに際して、自MP64のマスタビットマップテーブル124の全ビットに対して以下の処理を実施する。
【0164】
まず、各MP64は、ポートINキュー80または90をチェックし(S61)、キュー81または91に、ポートイベントがあるか否かを判定し(S62)、ポートイベントがないときにはステップS61の処理に戻り、ポートイベントがあると判定したときには、図33に示すように、イベントビットマップテーブル128に“1”のビットを立てる(S63)。すなわち、イベントビットマップテーブル128のうち、ポートイベントが検出されないポートに対応したビットは“0”であるが、ポートイベントが検出されたポートに対応したビットは“1”となる。
【0165】
次に、各MP64は、マスタビットマップテーブル124を参照し、マスタビットマップテーブル124を基に、イベントマップテーブル128で“1”のビットの立っていないビットを落とすための処理を行う(S64)。
【0166】
この際、図33に示すイベントビットマップテーブル128の内容を、図34に示すポートスキャンビットマップテーブル126に反映すると、ポートスキャンビットマップテーブル126は、図35に示すように、その内容が更新された状態となる。
【0167】
例えば、#1のMP64の場合、図34に示すポートスキャンビットマップテーブル126に従ってポートスキャンを行っても、#1のポートについては、ポートイベントがないため、図35に示すように、ポートスキャンビットマップテーブル126のうち、#1のポートに対応したビットが“1”から“0”に更新される。
【0168】
同様に、#2のMP64の場合、図34に示すポートスキャンビットマップテーブル126に従ってポートスキャンを行っても、#2のポートについてポートイベントが発生していないため、図35に示すように、ポートスキャンビットマップテーブル126のうち、#2のポートに対応した“1”のビットが“0”に更新される。
【0169】
次に、各MP64を、図33に示すイベントビットマップテーブル128のビットを全て0クリアし(S65)、このルーチンでの処理を終了する。なおイベントビットマップテーブル128は、各MP64によってポートスキャンが実施されたときに、ポートイベントの有無によってその内容が更新されることになる。
【0170】
このように、ポートイベントの発生の有無に従ってイベントビットマップテーブル128を更新するとともに、更新されたイベントビットマップテーブル128の内容をポートスキャンビットマップテーブル126に反映し、各MP64がポートスキャンするときに、イベントビットマップテーブル128の内容が反映されたポートスキャンビットマップテーブル126を用いることで、ポートイベントが発生しないポートに対するポートINキューチェックを省略することができる。
【0171】
次に、ポート−MP対応付け方法について説明する。本実施例では、以下に示すように、3種類の方法を用いることとしている。
【0172】
ポート−MP対応付け方法1
【0173】
ポート−MP対応付け方法1では、ポート稼働率に基づいて、1ポートずつ共有MP数を決定し、最もMP稼働率の低いMP64から順にポートを割り当てることとている。
【0174】
このポート−MP対応付け方法1を採用すると、ポート毎にきめ細かくMP64を割り当てることが可能となり、MP64のMP稼働率を均一にしやすくなる。また、各MP64で処理すべきポート数を均一にできる。
【0175】
ポート−MP対応付け方法2
【0176】
このポート−MP対応付け方法2では、ポート稼働率に基づいて、1ポートずつ担当MP64を決定し、各MP64のMP稼働率が平均となるように、各ポートを各MP64に割り当てることとしている。
【0177】
ポート−MP対応付け方法2によれば、各MP64のMP稼働率を均一にすることができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【0178】
ポート−MP対応付け方法3
【0179】
このポート−MP対応付け方法3では、MP稼働率に2段の閾値(上限閾値と下限閾値)を設けてヒステリシス制御を行い、MP稼働率が上限閾値を超える毎に、当該MP64の全ての担当ポートに共有MPを1MPずつ増やし、MP稼働率が下限閾値を下回る毎に、当該MP64の全ての担当ポートから、共有MPを1MP減らすこととしている。
【0180】
ポート−MP対応付け方法3によれば、閾値が2つあるため、一方の閾値近傍でMP稼働率が振動するのを抑制することができるとともに、占有モードと共有モードの切り替えを行うための論理を単純化することができる。
【0181】
以下、3種類のポート−MP対応付け方法の具体的内容について説明する。
【0182】
まず、ポート−MP対応付け方法1を図36のフローチャートにしたがって説明する。この処理は、各MPPK36に属するMP64のうち任意の1つのMP64が一定周期で実施する。
【0183】
まず、MP64は、全MP64について、全ポートに関するポート稼働率をPM68から取り込んで集計し(S71)、その後、MP間で共有するポート数の均衡を取るために、ポート稼働率を降順に並べ替える処理を行う(S72)。
【0184】
例えば、図37に示すように、MP64は、見直し前のポート稼働率テーブル140について、ポート稼働率の降順にポートの並び替えを行い、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル140Aを作成する。
【0185】
次に、MP64は、最高負荷ポートから最低負荷ポートに向けて以下の処理を実施する。
【0186】
まず、MP64は、ポート稼働率テーブル140Aとポート稼働率‐MP数対応テーブル146を参照してMP数を決定し(S73)、その後、MP間の負荷を均衡にするために、MP稼働率の最も低いMP64から順に当該ポートを割り当てる(S74)。
【0187】
続いて、MP64は、ポートが割り当てられた当該MP64について、当該ポートの負荷に対応したデータを基にマスタビットマップテーブルを作成し(S75)、全ポートに対する処理を終了したか否かを判定し(S76)、全てのポートについて処理を終了していないときには、ステップS73の処理に戻り、ステップS73〜S76の処理を繰り返し、全てのポートに対する処理を終了したときには、このルーチンでの処理を終了する(S76)。
【0188】
ステップS73、S74においては、図37に示すように、ポート稼働率テーブル140Aとポート稼働率‐MP数対応テーブル146を参照すると、#N−1のポートについては、ポート稼働率の合計が「75」であって、MP数150として、「2」に対応するため、ポート稼働率=「75」を「2」で割った値である「37.5」を、それぞれ#0、#1のMP64に割り付ける。
【0189】
同様に、#1のポートについては、ポート稼働率の合計が「60」であるため、このポート稼働率=「60」を共有MP数=「2」で割った値である「30」をそれぞれ#2、#3のMP64に割り付ける。#0、#2のポートについては、ポート稼働率の合計が「40」または「30」であって、共有MP数150が「1」であるため、#0、#1のMP64よりも、割り付けられたポート稼働率の低い#2のMP64に、ポート稼働率=「40」を割り付ける。また、#2のポートについては、#2のMP64に、ポート稼働率=「40」を割り付けたので、#3のMP64には、ポート稼働率=「30」割り付ける。これらの割り付けを基に、ポート稼働率テーブル140Aからポート稼働率テーブル140Bを作成する。
【0190】
この後、MP64は、ポート稼働率テーブル140Bをマスタビットマップテーブル124に反映し、図37に示すマスタビットマップテーブル124Aを作成する。このマスタビットマップテーブル124Aがポートスキャンビットマップテーブル126に反映される。
【0191】
このため、各MP64は、次のポートスキャン時に、マスタビットマップテーブル124Aの内容が反映されたポートスキャンビットマップテーブル126を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【0192】
また、各MP64のうち一部のMP64は、他のMP64に処理を移行することができるので、負荷を分散することが可能になる。例えば、#0のMP64は、#0のポートに関する処理を#2のMP64に移行することで、負荷を分散することが可能になり、#1のMP64は、#1のポートに関する処理を#2、#3のMP64に移行することで、負荷を分散することが可能になる。
【0193】
なお、マスタビットマップテーブル124Aにおいて、ポート稼働率テーブル140Bのうち、ポート稼働率が0よりも大きい数値が格納されているところのビットは“1”となり、ポート稼働率が0のところは“0”となっている。
【0194】
このように、ポート−MP対応付け方法1を用いることで、ポート稼働率に応じて各ポートを処理するためのMP64を変更することができる。これにより、一部のMP64の負荷を分散することができる。
【0195】
次に、ポート−MP対応付け方法2を図38のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1MP64が一定周期で実施する。
【0196】
まず、MP64は、全MP64について、全ポートのポート稼働率をPM68から取り込んで集計し(S81)、その後、ポート稼働率を降順に並び替える(S82)。例えば、図39に示すように、見直し前のポート稼働率テーブル140のポートについて、ポート稼働率を降順に並び替えて、並び替え後のポート稼働率テーブルとして、ポート稼働率テーブル140Cを作成する。
【0197】
この後、MP64は、ポート稼働率の合計から平均MP稼働率を算出する(S83)。例えば、ポート稼働率テーブル140Cを参照し、各ポートのポート稼働率の合計が205である場合、この合計205を、MP数4で割り算して、平均値=51%を算出する。
【0198】
次に、MP64は、MPPK36内の全てのMP64に対して、以下の処理を実施するとともに、高負荷ポートから低負荷ポートに向けて以下の処理を実施する。
【0199】
例えば、MP64は、各ポートについて、ポート処理権限を取得し(S84)、その後、権限を取得したポートのポート稼働率の合計が平均MP稼働率以下か否かを判定し(S85)、ポート稼働率の合計が平均稼働率以下のときには、ステップS84の処理に戻り、ステップS84とS85の処理を繰り返す。
【0200】
一方、ポート稼働率の合計が平均MP稼働率以下でないときには、MP64は、マスタビットマップテーブル124の当該MP64について、当該ポートの箇所に対応したデータを基にビットを設定し(S86)、全てのMP分の処理を行ったか否かを判定し(S87)、全てのMP64に対する処理を終了していないときには、ステップS84に戻り、ステップS84、S85、S86の処理を繰り返し、全てのMP64に対する処理を終了したときには、このルーチンでの処理を終了する。
【0201】
ステップS84、S85においては、図39に示すポート稼働率テーブル140Cを参照し、各ポートを担当する各MPのポート稼働率が平均値となるように、見直し後のポート稼働率テーブルとして、ポート稼働率テーブル140Dを作成する。
【0202】
例えば、#N−1のポートについては、ポート稼働率の合計が75であるため、#0のMP64に対して、ポート稼働率を51に設定し、#1のMP64については24(24=75−51)を設定する。#1のポートに対しては、ポート稼働率の合計が60であって、#1のMP64については、既にポート稼働率として24が設定されているため、27(27=51−24)を設定する。また#1のポートについては、#2のMP64に、ポート稼働率33(33=60−27)を設定する。同様に、#0のポートについては、#2のMP64にポート稼働率18を設定し、#3のMP64にポート稼働率22を設定し、#2のポートに対しては、#3のMP64にポート稼働率30を設定する。
【0203】
また、ステップS86、S87においては、ポート稼働率テーブル140の内容をマスタビットマップテーブル124に反映し、マスタビットマップテーブル124Bを生成する。
【0204】
このように、ポート−MP対応付け方法2を用いることで、各MP64が担当するポートのポート稼働率が平均となるように、各MP64に対して担当ポートを決定することができる。これにより、一部のMP64の負荷を分散することができる。
【0205】
また、マスタビットマップテーブル124Bを用いてポートスキャンビットマップテーブル126を生成した場合、次のポートスキャン時に、各MP64は、マスタビットマップテーブル124Bの内容が反映されたポートスキャンビットマップテーブル126を用いることで、全てのポートをチェック対象ポートとする必要がなく、ポートスキャンを高速化することができる。
【0206】
次に、ポート−MP対応付け方法3を図40のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1つのMP64が一定周期で実施する。
【0207】
まず、MP64は、PM68を検索して、自MP64のMP稼働率を集計し、図41に示すように、MP稼働率が上限閾値L1以上か否かを判定し(S92)、MP稼働率が上限閾値L1以上でないときには、MP稼働率が下限閾値L2未満か否かを判定し(S93)、MP稼働率が下限閾値L2未満であるときには、MP64が担当するポートを共有するMP64の数を1個減らすために、マスタビットマップ124を作成し(S94)、ステップS97の処理に移行する。なお、ステップS93で、MP稼働率が下限閾値L2未満でないと判定したときには、MP64は、ステップS97の処理に移行する。
【0208】
一方、MP64は、ステップS92において、MP稼働率が上限閾値L1以上と判定したときには、自MP64が担当する全てのポートに対して、以下の処理を実施する。
【0209】
具体的には、MP64は、共有MP数<MPPK内MP数か否かを判定し(S95)、このステップで否定の判定結果を得たときには、再度この処理を行い、このステップで肯定の判定結果を得た時には、MP稼働率にしたがって、MP64が担当するポートを共有するMP64を1個追加するために、マスタビットマップテーブル124を作成する(S96)。
【0210】
この後、MP64は、全てのポートに対して、見直すための処理を実施したか否かを判定し(S97)、全てのポートに対して、見直し処理を実施していないときには、ステップS95に戻り、ステップS95からS97の処理を繰り返し、全てのポートに対して、見直し処理を実施したときには、このルーチンでの処理を終了する。
【0211】
このように、MP稼働率にしたがって、当該MP64が担当するポートを共有するMP60の数を変更することができる。この際、MP64の数を増やすと負荷が分散されるため、稼働率が下がるが、上限閾値L1に対して、十分低い下限閾値L2を設定することで、MP稼働率が変動しても、MP稼働率が振動するのを防止することができる。
【0212】
次に、ポート−MP対応付け方法の他の例として、MP障害時における処理を図42のフローチャートにしたがって説明する。この処理は、各MPPK36内の任意の1つのMP64が一定周期で実施する。
【0213】
まず、MPPK36に属するMP64のうちいずれか1つに障害が発生した場合、健全なMP64がPM68内のマスタビットマップ124を参照し、IO処理可能なMP一覧を取得し(S101)、障害が発生したMP64が保持しているポートに対して、以下の処理を実施する。
【0214】
例えば、#3のMP64で障害が発生した場合、#0〜#2のMP64のうちいずれか1つのMP64は、#3のMP64が保持しているポートは占有ポートか否かを判定し(S102)、占有ポートでないときには、ステップS102の処理を繰り返し、占有ポートであるときには、IO処理可能なMP64によって、当該ポートを共有するように、マスタビットマップ124に対してビットを設定する(S103)。
【0215】
次に、MP64は、全てのポートに対するチェックが終了したか否かを判定し(S104)、全てのポートに対するチェックを終了していないときには、ステップS102の処理に戻り、ステップS102〜S104の処理を繰り返し、全てのポートに対するチェックが終了したときには、このルーチンでの処理を終了する。
【0216】
この場合、マスタビットマップテーブル124として、図43に示すように、マスタビットマップテーブル124を用いているときに、#3のMP64で障害が発生したときには、#3のMP64が保持しているポート、例えば、#0、#2のポートに対して、#0〜#2のMP64に担当させるための処理を行い、マスタビットマップテーブル124Cを、図44に示すように、マスタビットマップテーブル124Dとして作成する。
【0217】
この際、#0のポートについては、#3のMP64の他に、既に、#2のMP64が処理を担当しているので、そのまま、#2のMP64が処理を担当することになる。これに対して、#2のポートについては、#3のMP64のみが担当していたので、#0〜#2のMP64がそれぞれ処理を担当することになる。
【0218】
このように、#3のMP64で障害が発生した場合、#3のMP64が占有する、#2のポートの処理を、#0〜#2のMP64が共有することで、#3のMP64が占有していた占有ポート(#2のポート)に対するIO処理を、他のMP64によって継続することができる。
【0219】
次に、ポート稼働率‐MP数対応テーブル146の内容を動的に変更するときの処理内容を図45のフローチャートにしたがって説明する。この処理は、MPPK36内の任意の1つのMP64が一定周期で実施する。
【0220】
まず、MP64は、ポートINキュー80または90を参照し、INキュー81または91のキュー滞留数を取得し(S111)、次に、一時的な変動の影響を受けて性能が不安定になるのを防止するために、キュー滞留数が過去N回ともに増えているか否かを判定する(S112)。
【0221】
ステップS112において、キュー滞留数が過去N回とも増えていると判定したときには、MP64は、MP障害・MP交換などによってIO処理不可能なMP64の影響を除外するために、マスタビットマップテーブル124を参照し、IO処理可能なMP64の一覧を取得する(S113)。
【0222】
次に、MP64は、PM68を参照して、各MP64のMP稼働率を基に、余剰能力のあるMP64であって、IO処理可能なMP64が存在するか否かを判定し(S114)、このステップS114で否定の判定結果を得たときには、このルーチンでの処理を終了し、このステップS114で肯定の判定結果を得たときには、共有MP64の数が増えるように、切替時(変更時)のポート稼働率を下げるための処理を行い(S115)、このルーチンでの処理を終了する。
【0223】
なお、ステップS114において、MP64の過負荷時に、ポート共有を行っても意味がないため、またMP障害・MP交換などによって、IO処理可能なMP64が減る場合は、見直すための処理は行わないこととしている。
【0224】
ステップS111〜ステップS115の処理を行うことで、キュー81、91のキュー滞留個数が増加したとき、例えば、図46に示すように、夜間のバッチ処理で、前回見直し時のキュー滞留個数を示す基準値STよりも、キュー滞留個数が連続して増加する場合には、図47に示すように、ポート稼働率‐MP対応テーブル146のうちポート稼働率148の閾値=チューニングパラメータを1/2に変更し、閾値=チューニングパラメータが1/2に変更されたポート稼働率‐MP数対応テーブル146Aを生成する。
【0225】
この場合、ポート稼働率148の閾値=チューニングパラメータは、「0〜49」が「0〜24」に、「50〜99」が「25〜49」に、「100〜149」が「50〜74」に、「150〜」が「75〜」にそれぞれ変更されている。
【0226】
一方、ステップS112において、キュー滞留数が過去N回とも増えていないと判定したときには、キュー滞留数が過去N回ともに減っているか否かを判定し(S116)、キュー滞留数が過去N回とも減っていないときには、このルーチンでの処理を終了し、キュー滞留数が過去N回とも減っていると判定したときには、占有MP64が増えるように、切替時のポート稼働率を上げるための処理を行い(S117)、このルーチンでの処理を終了する。
【0227】
すなわち、ステップS111、S112、S116、S117の処理を行った場合、例えば、図48に示すように、バッチ処理の終了に伴って、キュー滞留個数が連続して基準値STよりも減少しているときには、図49に示すように、ポート稼働率‐MP対応テーブル146のポート稼働率48の閾値=パラメータを2倍に変更し、ポート稼働率‐MP数対応テーブル146Bを生成する。
【0228】
この場合、ポート稼働率148の閾値=チューニングパラメータは、「0〜49」が「0〜99」に、「50〜99」が「100〜199」に、「100〜149」が「200〜299」に、「150〜」が「300〜」にそれぞれ変更されている。
【0229】
このように、INキュー81、91のキュー滞留数(IO滞留数)とMP稼働率を基にポート稼働率‐MP数対応テーブル146の値を動的に見直すことで、キュー滞留数(IO滞留数)に応じて最適なMP数とすることができる。
【0230】
例えば、キュー滞留数が増加した場合には、ポート稼働率148の閾値を1/2に変更することで、各MP64のポート稼働率が増加しても、各MP64のポート稼働率の増加に応じて、ポート稼働率‐MP数対応テーブル146おけるMP数150の値として、大きな数値が用いられるので、多くのMP64で処理を行うことができる。
【0231】
逆に、キュー滞留数が減少しているときには、ポート稼働率148の閾値を2倍に変更することで、各MP64のポート稼働率が変化しても、各MP64のポート稼働率が閾値の範囲内で変化している間は、少ないMP64で処理を行うことができる。
【0232】
本実施例によれば、各制御部60に属する各MP64は、PM(主メモリ)68に属する各キュー81、91のうち特定のポートに対応したキューのみを検索対象とするポートスキャンを実行するようにしたので、各MP64の検索対象となるキュー81、91の数を減少させることができ、各キュー81、91に格納されたコマンド(入出力要求)などの情報の検出を高速に行うことができる。
【0233】
また、本実施例によれば、各制御部60に属する各MP64が占有モードまたは共有モードを選択するに際して、スループットよりもレスポンスタイムを重視する場合、占有モードを選択することで、ロック競合が発生したり、ポートイベントによる情報を他のMP64に取得されたりするのを防止することができるとともに、レスポンスタイムの遅延を防止できる。
【0234】
一方、各制御部60に属する各MP64が占有モードまたは共有モードを選択するに際して、レスポンスタイムよりもスループットを重視する場合、共有モードを選択することで、1つのポートに関する処理を複数のMP64で共有することができ、スループットの向上に寄与することができる。
【符号の説明】
【0235】
10 オープン系ホスト計算機、12 メインフレーム用ホスト計算機、14 ストレージサブシステム、16、18 ネットワーク、20 オープンポートパッケージ、22 メインフレームポートパッケージ、24 ドライブポートパッケージ、26 キャッシュメモリ、28 共有メモリ、30 スイッチパッケージ、34 記憶装置、38 HDD、52 オープンポートMP、54 MFポートMP、56 ドライブポートMP、36 MPPK、60 制御部、62 記憶部、64 MP、68 PM、70 LM、76 MP検索テーブル80 オープンポートINキュー、86 MP検索テーブル、90 MFポートINキュー、120、124 マスタビットマップテーブル、126 ポートスキャンビットマップテーブル、128 イベントビットマップテーブル、130 LDEV−ポート対応テーブル、136 LDEV−MPPK対応テーブル、140 ポート稼働率テーブル、146 ポート稼働率−MP数対応テーブル。
【特許請求の範囲】
【請求項1】
ホスト計算機とネットワークを介して接続されるストレージサブシステムであって、
前記ホスト計算機と複数のポートを介して情報の授受を行うともに、前記各ポートから入力されたコマンドに従ってデータのアクセス制御処理を行う第一インターフェース部と、
データを記憶する記憶装置と、
前記記憶装置に接続され、前記記憶装置との間でデータの入出力処理を行う第二インターフェース部と、
前記第一インターフェース部および前記第二インターフェース部と接続され、前記記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部と、
前記第一インターフェース部と前記第二インターフェース部および前記複数の制御部の処理に伴うデータを一時的に記憶するキャッシュメモリと、
前記複数の制御部が共有する制御情報を格納する共有メモリと、を備え、
前記各制御部は、
前記共有メモリに格納された前記制御情報を前記各制御部共通の制御情報として格納する主メモリと、前記主メモリに格納された前記制御情報に従って前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、
前記第一インターフェース部は、
前記ホスト計算機から、前記各ポートを介して、前記複数の仮想デバイスのうちの一の仮想デバイスに対するデータの入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求に従って前記一の仮想デバイスに対するデータの入出力処理を担当する制御部を特定し、特定した前記制御部に対して前記入出力要求を転送し、
前記入出力要求を受信した制御部は、
前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を占有する占有モードまたは2つ以上のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を共有する共有モードのいずれか一方を、前記各ポートに関する負荷情報を基に選択し、前記選択した占有モードまたは共有モードに従った処理を実行してなる、ストレージサブシステム。
【請求項2】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、前記検索対象のキューに対するポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行し、前記検索対象のキューのうち前記ポートスキャンの実行によって前記入出力要求が存在しないキューを前記検索対象のキューから除外して前記検索対象のキューを更新し、その後のポートスキャンでは、前記更新した前記検索対象のキューに対して前記ポートスキャンを実行しなる、請求項1に記載のストレージサブシステム。
【請求項3】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項4】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち前記仮想デバイスが予め割り付けられたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項5】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち、前記入出力要求を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項6】
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記各ポートに関する負荷情報として、低負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、高負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項7】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に要する処理時間を設定時間毎に計測し、前記各計測値を順次更新し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記更新した前記各計測値と閾値とを比較し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を下回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を上回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項8】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記算出した各前記ポート稼働率の高低を判定し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が低い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が高い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項9】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出し、前記各ポートについて算出された合計を、前記ポート稼働率の閾値に対応して設定されたマイクロプロセッサ数で除算し、前記除算して得られた前記ポート稼働率を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各ポートに関する前記ポート稼働率を複数のマイクロプロセッサに分散し、前記分散された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項1に記載のストレージサブシステム。
【請求項10】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出するとともに、前記各ポートについて算出された合計の平均値を算出し、前記算出された平均値を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各マイクロプロセッサに対する前記ポート稼働率を平均化し、前記平均化された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項1に記載のストレージサブシステム。
【請求項11】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記共有モードを選択したときには、前記共有モードで使用するマイクロプロセッサを選択するための情報として、前記算出した前記マイクロプロセッサ稼働率と前記マイクロプロセッサ稼働率に関する複数の閾値を用い、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち上限閾値を上回ったときに、前記共有モードで使用するマイクロプロセッサを1つ増やし、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち下限閾値を下回ったときに、前記共有モードで使用するマイクロプロセッサを1つ減らしてなる、請求項1に記載のストレージサブシステム。
【請求項12】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記判定結果を基に、前記各閾値を変更し、その後、前記入出力要求を受信したときには、前記変更した前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項1に記載のストレージサブシステム。
【請求項13】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあると判定したときには、前記各閾値を小さくし、前記各計測した前記キュー滞留数が過去数回に亘って減少傾向にあると判定したときには、前記各閾値を大きく、その後、前記入出力要求を受信したときには、前記小さくした前記各閾値または前記大きくした前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項1に記載のストレージサブシステム。
【請求項1】
ホスト計算機とネットワークを介して接続されるストレージサブシステムであって、
前記ホスト計算機と複数のポートを介して情報の授受を行うともに、前記各ポートから入力されたコマンドに従ってデータのアクセス制御処理を行う第一インターフェース部と、
データを記憶する記憶装置と、
前記記憶装置に接続され、前記記憶装置との間でデータの入出力処理を行う第二インターフェース部と、
前記第一インターフェース部および前記第二インターフェース部と接続され、前記記憶装置の少なくとも一部の記憶領域に割り当てられた複数の仮想デバイスに対して、データの入出力処理を制御する複数の制御部と、
前記第一インターフェース部と前記第二インターフェース部および前記複数の制御部の処理に伴うデータを一時的に記憶するキャッシュメモリと、
前記複数の制御部が共有する制御情報を格納する共有メモリと、を備え、
前記各制御部は、
前記共有メモリに格納された前記制御情報を前記各制御部共通の制御情報として格納する主メモリと、前記主メモリに格納された前記制御情報に従って前記仮想デバイスに対するデータの入出力処理を行う複数のマイクロプロセッサを備え、
前記第一インターフェース部は、
前記ホスト計算機から、前記各ポートを介して、前記複数の仮想デバイスのうちの一の仮想デバイスに対するデータの入出力要求があったとき、前記入出要求に基づいて前記複数の制御部の中から、前記入出要求に従って前記一の仮想デバイスに対するデータの入出力処理を担当する制御部を特定し、特定した前記制御部に対して前記入出力要求を転送し、
前記入出力要求を受信した制御部は、
前記複数のマイクロプロセッサのうち単一のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を占有する占有モードまたは2つ以上のマイクロプロセッサが前記一の仮想デバイスに対するデータの入出力処理を共有する共有モードのいずれか一方を、前記各ポートに関する負荷情報を基に選択し、前記選択した占有モードまたは共有モードに従った処理を実行してなる、ストレージサブシステム。
【請求項2】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象のキューとして、前記検索対象のキューに対するポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行し、前記検索対象のキューのうち前記ポートスキャンの実行によって前記入出力要求が存在しないキューを前記検索対象のキューから除外して前記検索対象のキューを更新し、その後のポートスキャンでは、前記更新した前記検索対象のキューに対して前記ポートスキャンを実行しなる、請求項1に記載のストレージサブシステム。
【請求項3】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうちチェック対象ポートとして予め設定されたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項4】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち前記仮想デバイスが予め割り付けられたポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項5】
前記各制御部に属する前記主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューのうち、前記入出力要求を一定時間受信していないポート以外のポートに対応したキューを検索対象とするポートスキャンを実行し、前記ポートスキャンの実行によって前記入出力要求を得たときには、当該入出力要求が格納されたキューに対応するポートに入力された前記入出力要求の処理を実行してなる、請求項1に記載のストレージサブシステム。
【請求項6】
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記各ポートに関する負荷情報として、低負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、高負荷状態を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項7】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に要する処理時間を設定時間毎に計測し、前記各計測値を順次更新し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記更新した前記各計測値と閾値とを比較し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を下回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記比較結果から、前記各ポートに関する負荷情報として、前記入出力要求の処理に要する処理時間が前記閾値を上回る負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項8】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記算出した各前記ポート稼働率の高低を判定し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が低い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記占有モードを選択し、
前記判定結果から、前記各ポートに関する負荷情報として、前記算出したポート稼働率が高い値を示す負荷情報を得たときには、前記各ポートに入力された前記入出力要求の処理として、前記共有モードを選択してなる、請求項1に記載のストレージサブシステム。
【請求項9】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出し、前記各ポートについて算出された合計を、前記ポート稼働率の閾値に対応して設定されたマイクロプロセッサ数で除算し、前記除算して得られた前記ポート稼働率を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各ポートに関する前記ポート稼働率を複数のマイクロプロセッサに分散し、前記分散された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項1に記載のストレージサブシステム。
【請求項10】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部に属する前記各マイクロプロセッサは、
前記入出力要求を受信したときに、前記各ポートに関する負荷情報として、前記算出した各ポート稼働率の合計を前記各ポートについて算出するとともに、前記各ポートについて算出された合計の平均値を算出し、前記算出された平均値を基準に、前記各マイクロプロセッサに対する前記ポート稼働率を補正して、前記各マイクロプロセッサに対する前記ポート稼働率を平均化し、前記平均化された前記ポート稼働率を基に、前記各ポートに入力された前記入出力要求の処理を担当すべき前記マイクロプロセッサを決定してなる、請求項1に記載のストレージサブシステム。
【請求項11】
前記各制御部に属する前記各マイクロプロセッサは、
前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記共有モードを選択したときには、前記共有モードで使用するマイクロプロセッサを選択するための情報として、前記算出した前記マイクロプロセッサ稼働率と前記マイクロプロセッサ稼働率に関する複数の閾値を用い、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち上限閾値を上回ったときに、前記共有モードで使用するマイクロプロセッサを1つ増やし、
前記算出した各マイクロプロセッサ稼働率が前記マイクロプロセッサ稼働率に関する複数の閾値のうち下限閾値を下回ったときに、前記共有モードで使用するマイクロプロセッサを1つ減らしてなる、請求項1に記載のストレージサブシステム。
【請求項12】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記判定結果を基に、前記各閾値を変更し、その後、前記入出力要求を受信したときには、前記変更した前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項1に記載のストレージサブシステム。
【請求項13】
前記各制御部に属する主メモリは、
前記各ポートに入力される前記入出力要求を格納するための領域として、前記複数のポートに対応した複数のキューを備え、
前記各制御部に属する前記各マイクロプロセッサは、
前記主メモリに属する前記各キューを検索対象とするポートスキャンを順次実行し、前記各キューに滞留する前記入出力要求の滞留数を示すキュー滞留数を順次計測し、かつ、前記各ポートに入力された前記入出力要求の処理に伴うマイクロプロセッサ稼働率を算出するとともに、前記算出した前記マイクロプロセッサ稼働率から前記各ポートに関するポート稼働率をそれぞれ算出し、
前記第一インターフェース部から転送された前記入出力要求を受信した制御部は、
前記入出力要求を受信したときに、前記各マイクロプロセッサが算出した各ポート稼働率と前記ポート稼働率の範囲を規定する複数の閾値とを比較して、前記前記算出した各ポート稼働率が前記複数の閾値のうちいずれの閾値に属するかを判定し、前記判定結果を基に、前記各閾値に対応して設定されたマイクロプロセッサ数に応じて、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定し、前記決定した前記マイクロプロセッサの数で前記各キューに関する処理を実行する過程で、前記各ポートに関する負荷情報として、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあるか、あるいは減少傾向にあるか否かを判定し、前記各計測した前記キュー滞留数が過去数回に亘って増加傾向にあると判定したときには、前記各閾値を小さくし、前記各計測した前記キュー滞留数が過去数回に亘って減少傾向にあると判定したときには、前記各閾値を大きく、その後、前記入出力要求を受信したときには、前記小さくした前記各閾値または前記大きくした前記各閾値を基に、前記各キューに関する処理を担当すべき前記マイクロプロセッサの数を決定してなる、請求項1に記載のストレージサブシステム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【図43】
【図44】
【図45】
【図46】
【図47】
【図48】
【図49】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【図43】
【図44】
【図45】
【図46】
【図47】
【図48】
【図49】
【公表番号】特表2012−524929(P2012−524929A)
【公表日】平成24年10月18日(2012.10.18)
【国際特許分類】
【出願番号】特願2012−506654(P2012−506654)
【出願日】平成21年9月29日(2009.9.29)
【国際出願番号】PCT/JP2009/005000
【国際公開番号】WO2011/039802
【国際公開日】平成23年4月7日(2011.4.7)
【出願人】(000005108)株式会社日立製作所 (27,607)
【Fターム(参考)】
【公表日】平成24年10月18日(2012.10.18)
【国際特許分類】
【出願日】平成21年9月29日(2009.9.29)
【国際出願番号】PCT/JP2009/005000
【国際公開番号】WO2011/039802
【国際公開日】平成23年4月7日(2011.4.7)
【出願人】(000005108)株式会社日立製作所 (27,607)
【Fターム(参考)】
[ Back to top ]