(57)【特許請求の範囲】
【請求項１】
優先度が付与され論理ボリュームを指定したＩ／Ｏコマンドをホスト計算機から受信しそのＩ／Ｏコマンドが起動された場合にそのＩ／Ｏコマンドで指定されている論理ボリュームに対してデータの入出力を行う記憶制御装置であって、
複数のホスト計算機からＩ／Ｏコマンドを受信する複数の通信インタフェース装置と、
複数のプロセッサユニットと、
前記複数のプロセッサユニットに共通の記憶領域である共有領域と
を有し、
前記複数のプロセッサユニット及び複数の論理ボリュームが論理的な複数の区域に分けられることにより、各区域が、１以上のプロセッサユニットと１以上の論理ボリュームとを含み、
各通信インタフェース装置が、Ｉ／Ｏコマンドを受信する複数のポートを有し、
各プロセッサユニットが、
複数の優先度にそれぞれ対応し前記複数の通信インタフェース装置に共通の複数のコマンド記憶領域と、
複数のコマンド記憶領域に共通の複数のプロセッサと
を有し、
各プロセッサは、そのプロセッサを含んだプロセッサユニットに関する稼働状況を表す情報である稼動状況情報を前記共有領域に格納し、
各プロセッサユニットは、Ｉ／Ｏコマンドの起動の制御に関するパラメータ値であってそのプロセッサユニットが有する複数のコマンド記憶領域の各々について設定されたパラメータ値を基に、Ｉ／Ｏコマンドの起動を制御し、
前記複数の区域は、同一優先度であるがパラメータ値が異なるコマンド格納領域を含み、
区域毎に、プロセッサユニットに論理ボリュームが割り当てられており、論理ボリュームが割り当てられているプロセッサユニット内のプロセッサのみが、その論理ボリュームに対してデータを入出力することができ、各通信インタフェース装置は、受信したＩ／Ｏコマンドを、そのＩ／Ｏコマンドで指定されている論理ボリュームが割り当てられているプロセッサユニットに転送し、そのプロセッサユニットは、そのＩ／Ｏコマンドを、そのＩ／Ｏコマンドに付与されている優先度に対応したコマンド記憶領域に格納し、複数のコマンド格納領域のパラメータ値を基に、優先度が高いＩ／Ｏコマンドほど一定時間内により多く起動されるように、複数のコマンド記憶領域内のＩ／Ｏコマンドを起動するようになっており、
負荷が所定の閾値を超えている第１のプロセッサユニットが、前記第１のプロセッサユニットを含んだ第１区域内に、前記第１プロセッサユニット以外のプロセッサユニットが存在しない場合、第２区域に含まれている複数のプロセッサユニットから前記稼働状況情報を基に第２のプロセッサユニットを決定し、決定された第２のプロセッサユニットを、前記第２区域から前記第１区域に含め、前記第２のプロセッサユニットに割り当てられている１以上の論理ボリュームを、前記第２区域に残っている１以上のプロセッサユニットに割り当て、前記第１のプロセッサユニットに割り当てられている複数の論理ボリュームから、負荷が期待値より高いコマンド記憶領域に蓄積されるＩ／Ｏコマンドで指定される論理ボリュームを決定し、決定された論理ボリュームを、前記第１区域に新たに追加された前記第２のプロセッサユニットに割り当てる、
記憶制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置におけるコマンドの起動を制御する技術に関する。
【背景技術】
【０００２】
コマンドに設定されている優先度を基にコマンドの起動を制御するストレージ装置が知られている。具体的には、例えば、Ｑｏｓ（Quality  of  service）制御に基づき発行されたＩ／Ｏコマンドを起動するストレージ装置が知られている。この種のストレージ装置は、優先度が付与されたＩ／Ｏ（Input／Output）コマンドを受信し、そのＩ／Ｏコマンドに付与されている優先度を基に、Ｉ／Ｏコマンドの起動を制御する（例えば、特許文献１）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−１０２４５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ストレージ装置が有する通信インタフェース装置は、一般に、ポートとそのポートに関連付けられたＭＰ（Micro  Processor）とを有する。この場合、或るポートが受信したＩ／Ｏコマンドは、そのポートに関連付けられているＭＰのみによって起動される。
【０００５】
このため、複数のポートのうちの１つのポートにＩ／Ｏコマンドが集中した場合、そのポートが受信した複数のＩ／Ｏコマンドが、期待通りの起動されない可能性がある。
【０００６】
また、ポートが受信したＩ／Ｏコマンドは、一旦記憶領域（典型的にはキュー）に蓄積されるが、ポート毎に、全ての優先度にそれぞれ対応した複数のキューを備えていなければならない。このため、管理しなければならないキュー情報（キューに関する情報）の量が多い。
【０００７】
これは、コマンドが格納される記憶領域が、キュー以外の記憶領域であっても生じ得る。
【０００８】
したがって、本発明の目的は、１つのポートにＩ／Ｏコマンドが集中してもそのポートで受信したＩ／Ｏコマンドを期待通りに起動でき、且つ、記憶制御装置において管理しなければならないコマンド記憶領域の管理情報の量を削減することにある。
【課題を解決するための手段】
【０００９】
記憶制御装置において、複数の優先度にそれぞれ対応しＩ／Ｏコマンドが格納される複数のコマンド記憶領域（例えばキュー）が、複数のポート及び複数のプロセッサに共通である。この場合、どのポートがＩ／Ｏコマンドを受信しても、そのＩ／Ｏコマンドは、そのＩ／Ｏコマンドに付与されている優先度に対応したコマンド記憶領域に格納される。複数のプロセッサは、優先度が高いＩ／Ｏコマンドほど一定時間内により多く起動されるように、複数のコマンド記憶領域内のＩ／Ｏコマンドを起動する。
【００１０】
記憶制御装置は、複数の論理ボリュームの基になる複数の物理記憶デバイスを備えたストレージ装置でも良いし、ストレージ装置とホスト計算機との間に介在できるインテリジェントなスイッチ装置でも良い。
【図面の簡単な説明】
【００１１】
【図１】本発明の一実施形態に係る計算機システムの構成例を示す。
【図２】本発明の一実施形態の概要を示す。
【図３】ＭＰＰＫ２８０がＩ／Ｏコマンドを起動するまでの流れを示す。
【図４】Ｉ／Ｏコマンド振分け処理の流れを示すフローチャートである。
【図５】振分け先検索テーブルを示す。
【図６】Ｉ／Ｏコマンドが格納されているエントリをＩＭＱからＰＱに再配置する処理の流れを示すフローチャートである。
【図７】ＰＱ２６３毎の上限起動数に基づくコマンド起動制御処理の模式図である。
【図８】キュー管理テーブルを示す。
【図９】コマンド起動制御処理の一部を示すフローチャートである。
【図１０】コマンド起動制御処理の残りを示すフローチャートである。
【図１１】上限起動数の更新処理の一部分のフローチャートである。
【図１２】上限起動数の更新処理の残りのフローチャートである。
【図１３】ＰＱ＃０〜＃３の直前回の残りシェア累積値を示すグラフである。
【図１４】ＰＱ＃０〜＃３の今回のシェア累積値を示すグラフである。
【図１５】ＰＱ＃０〜＃３の今回のシェア累積値と閾値との関係を示すグラフである。
【図１６】ＰＱ＃０〜＃３の今回の残りシェア累積値を示すグラフである。
【図１７】各ＰＱのコンカレンシー値を表すテーブルを示す。
【図１８】ＰＱ＃０〜＃３の今回のシェア累積値と起動中コマンド数との関係を示すグラフである。
【図１９】ＰＱ＃０〜＃３についての今回の上限起動数を示す。
【図２０】Ｑｏｓ主制御部１０にフィードバックされる稼働状況情報の種類を表すテーブルを示す。
【図２１】、取得単位「Ｉ／Ｏ処理完了毎」である稼働状況情報（Ｉ／Ｏ処理回数、データ転送量、平均応答時間）を取得する処理の流れを示すフローチャートである。
【図２２】取得単位「５０ミリ秒（瞬間値）」である稼働状況情報（キュー登録数、起動中コマンド数）を取得する処理の流れを示すフローチャートである。
【図２３】取得単位「１秒周期（１ｓ周期）（瞬間値）」でＳＭ内の稼働状況情報を更新する処理の流れを示すフローチャートである。
【図２４】ＬＤＥＶオーナ権移動前の各ＰＱの負荷を示す。
【図２５】ＬＤＥＶオーナ権移動後の各ＰＱの負荷を示す。
【図２６】Ｑｏｓ区域によってシェア累積値が異なることを示すグラフである。
【図２７】Ｑｏｓ制御テーブルを示す。
【図２８】計算機システムの初期構成におけるＬＤＥＶオーナ権移動の一例を示す図である。
【図２９】計算機システムの運用中でのＱｏｓ区域変更におけるＬＤＥＶオーナ権移動の一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して、本発明の一実施形態を説明する。なお、以下の説明では「ｘｘｘテーブル」の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「ｘｘｘテーブル」を「ｘｘｘ情報」と呼ぶことができる。
【００１３】
また、以下の説明では、要素を特定するための識別情報として、ＩＤ（識別子）或いは番号が使用されるが、識別情報として、名前、番号などが使用されて良い。
【００１４】
また、以下の説明では、起動されるコマンドは、Ｉ／Ｏコマンドであるとする。しかし、起動対象となるコマンドは、Ｉ／Ｏコマンドに代えて又は加えて、他種のコマンドでも良い。
【００１５】
図１は、本発明の一実施形態に係る計算機システムの構成例を示す。
【００１６】
計算機システムは、Ｑｏｓ主制御部１０と、Ｑｏｓ主制御部１０に接続されている複数（又は１つ）のホスト２０と、ホスト２０に通信ネットワーク３０を介して接続されるストレージ装置１００とを備える。
【００１７】
通信ネットワーク３０は、同図によると、ＳＡＮ（Storage  Area  Network）であるが、他種のネットワーク（例えば、ＬＡＮ（Local  Area  Network）、専用回線或いは公衆回線）でも良い。ホスト２０とストレージ装置１００とのデータのやり取りは、所定の通信プロトコル（例えば、ＴＣＰ／ＩＰ（Transmission  Control／Internet  Protocol）、或いは、ファイバチャネルプロトコル）にしたがって行われる。
【００１８】
Ｑｏｓ主制御部１０は、Ｑｏｓ制御を行う装置（例えば計算機）である。Ｑｏｓ主制御部１０は、Ｉ／Ｏコマンドの発行頻度を制御する機能を有する。また、Ｑｏｓ主制御部１０は、ホスト２０から送信されるＩ／Ｏコマンドに付与する優先度を決定する。Ｑｏｓ主制御部１０は、同図に示すように１つであっても良いし、各ホスト２０に備えられても良い。具体的には、例えば、Ｑｏｓ主制御部１０は、ホスト２０のＣＰＵで所定のコンピュータプログラムが実行されることにより発揮される機能であっても良い。
【００１９】
ホスト２０は、ＣＰＵやメモリなどを備えた計算機である。ホスト２０は、ストレージ装置１００により提供される論理的な記憶領域（以下、ＬＤＥＶ（Logical DEVice））を認識し、このＬＤＥＶを指定したＩ／Ｏコマンドを発行する。Ｉ／Ｏコマンドには、優先度が付与されている（優先度を表す情報が設定されている）。Ｉ／Ｏコマンドに付与される優先度は、Ｑｏｓ主制御部１０から送信される情報に従う優先度である。
【００２０】
ストレージ装置１００は、コントローラ２００と、ディスク装置３００とを有する。
【００２１】
同図によると、ディスク装置３００は、複数のディスク型の物理記憶デバイス（例えば、ＨＤＤ（Hard  Disk  Drive））３１０より構成されるＨＤＵ（Hard  Disk  Unit）である。ディスク装置３００は、例えば、複数のＲＡＩＤ（Redundant  Array  of  Independent  (or  Inexpensive)  Disks）グループを有する。そして、ＲＡＩＤグループを基に、記憶領域としてＬＤＥＶ（Logical  DEVice）３１１が形成される。なお、物理記憶デバイスとして、他種の記憶デバイス（例えばフラッシュメモリデバイス）が採用されても良い。
【００２２】
コントローラ２００は、ＣＨＡ（CHannel  Adaptor）２１０と、ＳＶＰ（SerVice  Processor）２２０と、ＳＷ（SＷitch）２３０と、ＣＭＰＫ（Cache  Memory  PacKage）２４０と、ＤＫＡ（Disk  Adaptor）２５０と、ＭＰＰＫ（Micro  Processor  PacKage）２６０とを有する。
【００２３】
ＣＨＡ２１０は、ストレージ装置１００の外部の装置とデータをやり取りする通信インターフェース装置である。ＣＨＡ２１０は、プロトコルチップ２１１と、ＬＲ（Local  Router）２１２と、複数のポート２１３とを有する。プロトコルチップ２１１は、所定のプロトコル（例えばファイバチャネルプロトコル）でデータを送受信するための回路や、ホスト２０からのＩ／Ｏコマンドを解析する回路を備えている。ＬＲ２１２は、ホスト２０からのＩ／ＯコマンドをＭＰＰＫ２６０に振り分ける回路である。
【００２４】
ＳＶＰ２２０は、ストレージ装置２００の稼働状況を監視する装置（例えば計算機）である。ＳＶＰ２２０は、コントローラ２００の稼働状況を表す情報（以下、稼働状況情報）と、ディスク装置３００の稼働状況情報を収集し、収集した稼働状況情報をＱｏｓ主制御部１０に送信（フィードバック）する。
【００２５】
ＳＷ２３０には、ＣＨＡ２１０、ＳＶＰ２２０、ＣＭＰＫ２４０、ＤＫＡ２５０及びＭＰＰＫ２６０が接続されている。ＳＷ２３０は、スイッチデバイス（例えばクロスバスイッチ）であり、ＳＷ２３０を介して、ＣＨＡ２１０、ＳＶＰ２２０、ＣＭＰＫ２４０、ＤＫＡ２５０及びＭＰＰＫ２６０が、それぞれ、互いに通信することができる。ＳＶＰ２２０は、ＳＷ２３０に代えて、ＣＨＡ２１０、ＤＫＡ２５０及びＭＰＰＫ２６０の少なくとも１つに接続されていても良い。
【００２６】
ＣＭＰＫ２４０は、ＳＭ（Shared  Memory）２４１を有する。ＳＭ２４１は、複数のＭＰＰＫ２６０に共有されるメモリである。ＳＭ２４１は、キャッシュ領域（図示せず）を有する。キャッシュ領域に、ＬＤＥＶ３１１に対して書き込まれるデータ（ＣＨＡ２１０が受信したライト対象データ）、及び、ＬＤＥＶ３１１からＤＫＡ２５０を介して読み出されたデータが、一時的に格納される。
【００２７】
ＤＫＡ２５０は、ＣＭＰＫ２４０を介して、ＣＨＡ２１０と、ディスク装置３００との間のデータの送受信を行う。
【００２８】
ＣＨＡ２１０が、ホスト２０からライトコマンドを受けた場合、そのライトコマンドを、複数のＭＰＰＫ２６０のうちの、そのライトコマンドで指定されているＬＤＥＶを担当するＭＰＰＫ２６０に転送する。ライトコマンドに付随するライト対象のデータは、一旦、ＣＭＰＫ２４０（ＳＭ２４１）に格納される。その後、そのライトコマンドを起動したＭＰ（ライトコマンドの転送先のＭＰＰＫ２６０内のＭＰ）によって、ＣＭＰＫ２４０（ＳＭ２４１）から、そのライト対象のデータが読み出され、そのデータが、ＤＫＡ２５０を介して、ライトコマンドで指定されているＬＤＥＶ３１１に書き込まれる。
【００２９】
また、ＣＨＡ２１０が、ホスト２０からリードコマンドを受けた場合、そのリードコマンドを、複数のＭＰＰＫ２６０のうちの、そのリードコマンドで指定されているＬＤＥＶを担当するＭＰＰＫ２６０に転送する。リード対象のデータは、そのリードコマンドを起動したＭＰ（リードコマンドの転送先のＭＰＰＫ２６０内のＭＰ）によって、ＤＫＡ２５０を介してＬＤＥＶ３１１から読み出される。読み出されたリード対象のデータは、一旦、ＣＭＰＫ２４０（ＳＭ２４１）格納される。その後、ＣＭＰＫ２４０（ＳＭ２４１）から、そのリード対象のデータが読み出され、そのデータがＣＨＡ２１０からホスト２０に送信される。
【００３０】
以上のように、Ｉ／Ｏコマンド（ライトコマンド又はリードコマンド）が起動されると、ＬＤＥＶに対するデータのＩ／Ｏが実行される。
【００３１】
ＭＰＰＫ２６０は、ローカルメモリ２６１と、複数のＭＰ（Micro  Processor）２６４とを有する。ローカルメモリ２６１に、このメモリ２６１を有するＭＰＰＫ２６０に転送されて来たＩ／Ｏコマンドが格納される。ローカルメモリ２６１には、ＩＭＱ２６２と、ＰＱ（Priority  Queue）２６３と、フリーキュー（図示省略）と、キュー管理テーブル（図８参照）とが含まれる。Ｉ／Ｏコマンドが格納される、ローカルメモリ２６１内の記憶領域（以下、エントリ）が、ＩＭＱ２６２、ＰＱ２６３或いはフリーキューのいずれかのキューに属している。つまり、エントリが、キューというデータ構造で管理される。ＰＱ２６３は、Ｉ／Ｏコマンドに付与され得る優先度の数と同じ数だけ存在するキューである。つまり、ＰＱ２６３は、優先度別に存在する。
【００３２】
初期状態では、全てのエントリは、フリーキューに属している。
【００３３】
ＭＰＰＫ２６０がＩ／Ｏコマンドを受信すると、そのＭＰＰＫ２６０内のいずれかのＭＰ２６４が、フリーキューからエントリを１つ取得し（エントリをデキューし）、Ｉ／Ｏコマンドをそのエントリに格納する。そのＭＰ２６４は、Ｉ／Ｏコマンドが格納されたエントリを、ＩＭＱに接続する（エンキューする）。いずれかのＭＰ２６４が、ＩＭＱから１つのエントリを取得し（デキューし）、そのエントリに格納されているＩ／Ｏコマンドに付与されている優先度に対応するＰＱに、そのエントリを接続する（エンキューする）。その後、いずれかのＭＰ２６４が、ＰＱからエントリをデキューし、そのエントリ内のＩ／Ｏコマンドを起動する。そのＭＰ２６４は、そのエントリを、フリーキューにエンキューする。
【００３４】
どのＩ／Ｏコマンドにどんな高さの優先度を付与するかは、所定の規則、例えば、Ｉ／Ｏコマンドで指定されるＬＤＥＶのＬＵＮ（Logical  Unit  Number）、及び／または、Ｉ／Ｏコマンドを発行するアプリケーションプログラムを基に、決定されて良い。
【００３５】
図２は、本実施形態の概要を示す。
【００３６】
ポート２１３にＭＰ２６４は関連付けられておらず（ポート２１３とＭＰ２６４が一体になっておらず）、ポート２１３とＭＰ２６４は互いに独立している。
【００３７】
複数の優先度に対応した複数のＰＱ２６３が、ポート２１３毎にではなく、ＭＰＰＫ２６０毎に存在する。どのＭＰＰＫ２６０に存在するＰＱ２６３の数も、ポート２１３の数に関係無く、優先度の数と同じである。１つのＭＰＰＫ２６０において、複数のＭＰ２６４が、複数のＰＱ２６３を共有する。
【００３８】
本実施形態によれば、複数の優先度に対応した複数のＰＱ２６３をポート毎に有することに比べて、ＰＱ２６３の数を削減することができる。従って、管理しなければならないキュー情報（キューに関する情報）を削減することができる。
【００３９】
また、後述するように、Ｑｏｓ主制御部１０が、ＭＰＰＫ２６０単位で、ＰＱ２６３毎に１種類以上の所定のパラメータ値（シェア値及びコンカレンシー値）を設定する。上記の通り、ＰＱ２６３の数を削減することができるので、パラメータ値の設定対象が削減することができる。このため、Ｑｏｓ主制御部１０の負荷が軽減される。
【００４０】
図３は、ＭＰＰＫ２８０がＩ／Ｏコマンドを起動するまでの流れを示す。
【００４１】
前述したように、いずれかのＭＰ２６４が、フリーキューからエントリをデキューし、デキューされたエントリに、ホスト２０からのＩ／Ｏコマンドを格納し、Ｉ／Ｏコマンドが格納されたエントリを、ＩＭＱ２６２にエンキューする（ステップ１）。
【００４２】
また、前述したように、いずれかのＭＰ２６４が、ＩＭＱ２６２からエントリをデキューし、デキューしたエントリを、そのエントリ内のＩ／Ｏコマンドに付与されている優先度に対応したＰＱ２６３にエンキューする（ステップ２）。
【００４３】
次に、前述したように、いずれかのＭＰ２６４が、いずれかのＰＱ２６３からエントリをデキューし、そのエントリ内のＩ／Ｏコマンドを起動する（ステップ３）。
【００４４】
ステップ３を実行するＭＰ２６４は、そのステップ３の直前回のステップ３を実行したＭＰ２６４と異なるＭＰ２６４である。つまり、本実施形態では、連続した複数のＩ／Ｏコマンドを１つのＭＰ２６４が起動するのではなく、連続した複数のＩ／Ｏコマンドが異なる複数のＭＰ２６４によって起動される。例えば、Ｉ／Ｏコマンドを起動するＭＰ２６４は、ラウンドロビンで切り替わる。具体的には、例えば、ＭＰ＃０が１つのＩ／Ｏコマンドを起動したら、次にＩ／Ｏコマンドを起動するＭＰ２６４はＭＰ＃１である。その後、Ｉ／Ｏコマンドを起動するＭＰ２６４は、ＭＰ＃２、ＭＰ＃３となり、その次は、再び、ＭＰ＃０となる。なお、各ＭＰが独立して動作するため、連続した複数のＩ／Ｏコマンドを１つのＭＰが起動しても良い。
【００４５】
このように、本実施形態では、ＭＰＰＫ２６０毎に、複数のＰＱ２６３が複数のＭＰ２６４に共有されている。ＰＱ２６３内のＩ／Ｏコマンドを起動するＭＰ２６４は、Ｉ／Ｏコマンドの起動の都度に異なる。このため、１つのＭＰＰＫ２６０において、複数のＩ／Ｏコマンドの起動にかかる負荷を複数のＭＰ２６４に分散することができる。
【００４６】
なお、ステップ３を行うＭＰ２６４に限らず、ステップ１及び／又はステップ２を行うＭＰ２６４も、そのステップの都度に異なっても良い。
【００４７】
図４は、Ｉ／Ｏコマンド振分け処理の流れを示すフローチャートである。図５は、振分け先検索テーブルを示す。
【００４８】
ＣＨＡ２１０内のプロトコルチップ２１１が、ポート２１３を介して、Ｉ／Ｏコマンドを受信する（ステップ４０１）。次に、プロトコルチップ２１１から、ＬＲ２１２にＩ／Ｏコマンドが転送される（ステップ４０２）。ＬＲ２１２は、そのＩ／Ｏコマンドから、ＬＵＮ（Logical  Unit  Number）と、Ｓ＿ＩＤとを取得する（ステップ４０３）。ＬＵＮとは、ホスト２０が指定したＬＤＥＶの番号である。Ｓ＿ＩＤとは、ホスト２０のＩＤである。つまり、Ｓ＿ＩＤを解析すれば、どのホスト２０から送信されたＩ／Ｏコマンドであるかが分かる。
【００４９】
次に、ＬＲ２１２は、図５に示す振分け先検索テーブル５００を参照して、Ｉ／Ｏコマンドの振分け先ＭＰＰＫを決定する（ステップ４０４）。テーブル５００は、どんなＩ／ＯコマンドをどのＭＰＰＫに振り分けるかを表す情報を有する。テーブル５００は、ＳＭ２４１に格納されていても良いし、各ＣＨＡ２１０内の記憶領域に格納されていても良い。具体的には、例えば、テーブル５００は、ポート２１３毎に、下記の情報、
（＊）Ｉ／Ｏコマンドを受信したポート２３１の番号であるポート番号５０４、
（＊）Ｉ／Ｏコマンドの送信元のホストのＩＤであるＳ＿ＩＤ５０１、
（＊）Ｉ／Ｏコマンドで指定されているＬＤＥＶの番号であるＬＵＮ５０２、
（＊）Ｉ／Ｏコマンドの振分け先のＭＰＰＫの番号であるＭＰＰＫ番号５０３、
を有する。図５によれば、例えば、ポート＃０で受信したＩ／Ｏコマンドの送信元が、Ｓ＿ＩＤ「０．０．１」のホスト２０であり、且つ、そのＩ／Ｏコマンドで指定されているＬＵＮが「０」の場合、そのＩ／Ｏコマンドの振分け先として、ＭＰＰＫ＃０が決定される。
【００５０】
ＬＲ２１２は、決定した振分け先ＭＰＰＫ２６０にＩ／Ｏコマンドを振り分ける（ステップ４０５）。そのＩ／Ｏコマンドは、振分け先のＭＰＰＫ２６０において、エントリに格納され、そのエントリがＩＭＱ２６２にエンキューされる。
【００５１】
図６は、Ｉ／Ｏコマンドが格納されているエントリをＩＭＱからＰＱに再配置する処理の流れを示すフローチャートである。
【００５２】
ＭＰＰＫ２６０内の任意のＭＰ２６４が、ＩＭＱ２６２からエントリをデキューし（ステップ６０１）、そのエントリ内のＩ／Ｏコマンドに付与されているＴａｓｋ  Ａｔｔｒｉｂｕｔｅを解析する（ステップ６０２）。ここで、Ｔａｓｋ  Ａｔｔｒｉｂｕｔｅとは、ＳＣＳＩ（Small  Computer  System  Interface）の規格に従う情報であり、Ｑｏｓ制御部１０が制御すべきＩ／Ｏコマンドか否かを表す情報である。Ｉ／Ｏコマンドが有するＴａｓｋ  Ａｔｔｒｉｂｕｔｅが「ＳＩＭＰＬＥ」という値の場合、そのＩ／Ｏコマンドは、Ｑｏｓ制御部１０が制御すべきＩ／Ｏコマンドである。
【００５３】
Ｔａｓｋ  Ａｔｔｒｉｂｕｔｅが「ＳＩＭＰＬＥ」という値である場合（ステップ６０３：ＹＥＳ）、ＭＰ２６４は、ローカルメモリ２６１内のフリーキューからエントリをデキューする（ステップ６０４）。次に、ＭＰ２６４は、ステップ６０１でデキューしたエントリ内のＩ／Ｏコマンドを、ステップ６０４でデキューしたエントリにコピーする（ステップ６０５）。ＭＰ２６４は、コピーされたＩ／Ｏコマンドに付与されている優先度「ｎ」を特定する（ステップ６０６）。ＭＰ２６４は、特定された優先度「ｎ」に対応するＰＱ２６３に、ステップ６０４でデキューしたエントリ（Ｉ／Ｏコマンドが格納されているエントリ）をエンキューする（ステップ６０７）。そして、ＭＰ２６４は、優先度「ｎ」に対応するＰＱ２６３についてのキュー登録数を１インクリメントする（ステップ６０８）。ここで、ＰＱ２６３の「キュー登録数」とは、そのＰＱに格納されているＩ／Ｏコマンド総数、すなわち、そのＰＱ２６３を構成するエントリの数である。キュー登録数をインクリメントする理由は、ＰＱ２６３毎に、処理できるＩ／Ｏコマンドの総数が決まっており、ＭＰ２６４及びＱｏｓ主制御部１０が、処理できるＩ／Ｏコマンドの総数の上限値を認識する必要があるからである。各ＰＱ２６３のキュー登録数（Ｉ／Ｏコマンド総数）を表す情報は、ＳＶＰ２２０に収集され、ＳＶＰ２２０からＱｏｓ制御部１０に送られる（フィードバックされる）。
【００５４】
Ｔａｓｋ  Ａｔｔｒｉｂｕｔｅが「ＳＩＭＰＬＥ」という値でない場合（Ｓ６０３：ＮＯ）、ＭＰ２６４は、ステップ６０１でデキューしたエントリ内のＩ／Ｏコマンドを、Ｑｏｓ制御処理外のＩ／Ｏコマンドとして処理する（Ｓ６０９）。例えば、ＭＰ２６４は、ステップ６０１でデキューしたエントリ内のＩ／Ｏコマンドを起動する。
【００５５】
次に、ＰＱ２６３内のエントリに格納されているＩ／Ｏコマンドの処理の流れを説明する。
【００５６】
本実施形態では、ＰＱ２６３毎に、一定時間長毎（例えば毎分）に起動可能なＩ／Ｏコマンドの数の上限（以下、上限起動数）が予め決められている。
【００５７】
図７は、ＰＱ２６３毎の上限起動数に基づくコマンド起動制御処理の模式図である。
【００５８】
図７に示す例によれば、ＭＰＰＫ２６０内に４つのＭＰ２６４が存在し、ローカルメモリ２６１内には、１６段階の優先度にそれぞれ対応した１６個のＰＱ２６３が存在している。点線枠１０００は、各ＰＱ２６３に対応する上限起動数を表している。図７によれば、ＰＱ＃０の上限起動数は「１５」、ＰＱ＃１の上限起動数は「４」、ＰＱ＃２の上限起動数は「７」、ＰＱ＃１５の上限起動数は「１」である。なお、この上限起動数は、後述のシェア値及びコンカレンシー値に基づいて決定される。Ｉ／Ｏコマンドを起動するＭＰ２６４は、ラウンドロビンで切り替わる。
【００５９】
例えば、上限起動数が「１５」であるＰＱ＃０からは、一定期間内に、最大１５個のＩ／Ｏコマンドが起動される。Ｉ／Ｏコマンドが起動される度に上限起動数がデクリメントされ、これが０になるまで、Ｉ／ＯコマンドがＰＱ＃０から起動される。
【００６０】
また、例えば、上限起動数が「１」であるＰＱ＃１５からは、一定期間内にＩ／Ｏコマンドが１つ起動されると、上限起動数が「０」となる。このため、ＰＱ＃１５からは、その一定期間内にＩ／Ｏコマンドは起動されない。
【００６１】
このように、それぞれのＰＱ２６３について、上限起動数が「０」となるまで、Ｉ／Ｏコマンドが起動される。上限起動数が「０」となったＰＱについて（上限起動数分のＩ／Ｏコマンドが起動されたＰＱについて）、上限起動数を新たに決定する処理が行われ、決定された上限起動数が、設定される。新たに設定された上限起動数は、直前回の上限起動数と比べて、同じであることもあれば、違っていることもある。
【００６２】
図８は、キュー管理テーブルを示す。
【００６３】
キュー管理テーブル９００は、例えば、ＭＰＰＫ２６０毎に存在し、ローカルメモリ２６１に格納されている。なお、全てのＭＰＰＫに対応する複数のキュー管理テーブルがマージされたテーブルがＳＭ２４１に格納されていても良い。
【００６４】
キュー管理テーブル９００は、このテーブル９００を有するＭＰＰＫ２６０内のＰＱ２６３毎に、キュー登録数９０１、起動中コマンド数９０２、及び、上限起動数９０３を有する。キュー登録数９０１は、ＰＱ２６３に登録されているＩ／Ｏコマンドの総数（ＰＱ２６３を構成するエントリの数）を表す情報である。起動中コマンド数９０２は、ＰＱ２６３から起動されている最中のＩ／Ｏコマンドの数を表す情報である。上限起動数９０３は、起動可能なＩ／Ｏコマンドの総数を表す情報である。
【００６５】
上限起動数９０３が多いＰＱ２６３ほど、一定時間内により多くのＩ／Ｏコマンドを処理することができる。ＭＰ２６４により、Ｉ／Ｏコマンドが起動されると、そのＩ／Ｏコマンドが格納されていたＰＱ２６３に対応した上限起動数９０３は１デクリメントされる。
【００６６】
同一の優先度に対応したＰＱでも、どのＭＰＰＫ内のＰＱであるかによって、上限起動数が異なっていてもよい。
【００６７】
図９及び図１０は、コマンド起動制御処理を示すフローチャートである。具体的には、図９が、コマンド起動制御処理の一部を示すフローチャートであり、図１０が、コマンド起動制御処理の残りを示すフローチャートである。以下、１つのＭＰ２６４を例に採り（図９〜図１９の説明において、「対象ＭＰ２６４」と言う）、コマンド起動制御処理を説明する。
【００６８】
対象ＭＰ２６４は、ラウンドロビンで、全てのＰＱ２６３をチェックする（ステップ７０１）。以下、１つのＰＱ２６３を例に採り（図９及び図１０の説明において、「対象ＰＱ２６３」と言う）、ステップ７０２以降を説明する。
【００６９】
対象ＭＰ２６４は、対象ＰＱ２６３のＰＱロックを取得する（ステップ７０２）。ここで、「ＰＱロック」とは、対象ＰＱ２６３から他のＭＰ２６４を排他するためのロックである。対象ＭＰ２６４が対象ＰＱ２６３のＰＱロックを取得できない場合、対象ＰＱ２６３が他のＭＰ２６４によってロックされていることになる。この場合（ステップ７０３：ＮＯ）、対象ＭＰ２６４は、別のＰＱについて、Ｓ７０２を行う。
【００７０】
ＰＱロックを取得できた場合、対象ＭＰ２６４は、対象ＰＱ２６３から先頭のエントリをデキューする（ステップ７０４）。デキューに成功した場合（ステップ７０５：ＹＥＳ）、対象ＭＰ２６４は、対象ＰＱ２６３に対応するキュー登録数９０１（図８参照）を１デクリメントする（ステップ７０５）。また、対象ＭＰ２６４は、対象ＰＱ２６３に対応する上限起動数９０３を１デクリメントする（ステップ７０５）。次に、対象ＭＰ２６４は、取得したＰＱロックを解放する（ステップ７０８）。そして、対象ＭＰ２６４は、デキューしたエントリが有するＩ／Ｏコマンドを起動する（ステップ７０９）。対象ＭＰ２６４は、対象ＰＱ２６３に対応する起動中コマンド数９０２を１インクリメントする（ステップ７１０）。対象ＭＰ２６４は、対象ＰＱ２６３からデキューしたエントリをフリーキューにエンキューする（ステップ７１１）。
【００７１】
対象ＭＰ２６４は、全てのＰＱ２６３に対応する全ての上限起動数９０３がゼロであるか否かをチェックする（ステップ７１２）。全ての上限起動数９０３がゼロの場合（ステップ７１２：ＹＥＳ）、対象ＭＰ２６４は、全ての上限起動数９０３を更新する処理を実施する（ステップ７１３）。
【００７２】
コマンド起動制御処理の流れは、上記の流れに限られない。例えば、ＭＰ２６４が、１つのＰＱについてＰＱロックを取得した場合、そのＭＰ２６４は、他のＰＱをチェックせず、他のＭＰ２６４が、ＰＱロックを取得できるまで他のＰＱをチェックして良い。つまり、各ＭＰ２６４は、ＰＱロックを取得したＰＱについてのみ１つのＩ／Ｏコマンドを起動しても良い。
【００７３】
次に、上限起動数更新処理を説明する。この更新処理には、シェア値及びコンカレンシー値が用いられる。
【００７４】
ここで、「シェア値」とは、ＰＱ２６３毎に存在するパラメータである。上限起動数更新処理の開始時に、ＰＱ２６３毎にそれぞれ設けられている領域に加算される。ＭＰ２６４は、ＰＱ２６３のジョブ起動比率が、そのＰＱ２６３に対応したシェア値の比率となるように、Ｉ／Ｏコマンドの起動数と起動順序とを制御する。
【００７５】
「コンカレンシー値」とは、各ＰＱ２６３の上限起動数の上限値である。ＭＰ２６４は、コンカレンシー値以下になるようにＩ／Ｏコマンドの上限起動数を制限する。これにより、優先度の高いＩ／Ｏコマンドの起動が遅れるのを防止することができる。
【００７６】
図１１及び図１２は、上限起動数の更新処理のフローチャートである。具体的には、図１１は、上限起動数の更新処理の一部分のフローチャートであり、図１２は、その更新処理の残りのフローチャートである。
【００７７】
対象ＭＰ２６４は、ラウンドロビンで、全てのＰＱ２６３をチェックする（ステップ１１０１）。対象ＭＰ２６４は、各ＰＱ２６３のキュー登録数９０１を特定する。ここで、ＭＰ２６３が全ＰＱ２６３をチェックすることを「１ラウンド」とする。１ラウンドにおいて、全てのＰＱ２６３につき、ステップ１１０２以降が行われる。以下、１つのＰＱ２６３を例に採り（図１１及び図１２の説明において、「対象ＰＱ２６３」と言う）、ステップ１１０２以降を説明する。
【００７８】
対象ＭＰ２６４は、対象ＰＱ２６３に対応したキュー登録数９０１を特定する（ステップ１１０２）。対象ＭＰ２６４は、対象ＰＱ２６３にエントリがあるかどうかをチェックする（ステップ１１０３）。エントリがある場合（ステップ１１０３：ＹＥＳ）、対象ＭＰ２６４は、対象ＰＱ２６３が有するシェア値及びコンカレンシー値を特定する（ステップ１１０４）。そして、対象ＭＰ２６４は、対象ＰＱ２６３に対応した残りシェア累積値（後述する）に、ステップ１１０４で特定したシェア値を累積する（ステップ１１０５）。
【００７９】
対象ＭＰ２６４は、対象ＰＱ２６３の起動中コマンド数９０２を特定する（ステップ１１０６）。
【００８０】
次に、対象ＭＰ２６４は、下記３つの条件の全て、
（＊）対象ＰＱ２６３にエントリがある、
（＊）上限起動数＋起動中コマンド数＜コンカレンシー値である、
（＊）シェア累積値が閾値を超えている、
を満たすかどうかチェックする（ステップ１１０７）。条件を満たしている場合、対象ＭＰ２６４は、ステップ１１０８以降を行う。上記３つの条件の少なくとも１つが満たされなくなるまで、対象ＰＱについて、ステップ１１０８以降が繰り返される。
【００８１】
対象ＭＰ２６４は、上限起動数９０３を１インクリメントする（ステップ１１０８）。次に、対象ＭＰ２６４は、シェア累積値から閾値を減算する（ステップ１１０９）。対象ＭＰ２６４は、キュー登録数９０１を１デクリメントする（ステップ１１１０）。
【００８２】
ステップ１１０８〜１１１０の繰り返しにおいて、閾値以下になった減算後のシェア累積値が、対象ＰＱについての「残りシェア累積値」である。
【００８３】
また、ステップ１１０８〜１１１０のループが終了した時点の上限起動数が、次回の一定時間内で起動可能なＩ／Ｏコマンドの数の上限である。
【００８４】
以上の上限起動数更新処理によれば、残りシェア累積値の大きさに応じて、次回の一定時間に対応した上限起動数が制御される。つまり、１つのＰＱについて、全ての一定時間において上限起動数が同じとは限らない。
【００８５】
コマンド起動制御処理（及び上限起動数更新処理）を、図１３〜図１９を参照して説明する。なお、ここでは、簡単のため、対象ＭＰ２６４について、優先度が最も高いＰＱ＃０、優先度が２番目に高いＰＱ＃１、優先度が３番目に高いＰＱ＃２の３つのＰＱがあるものとする。
【００８６】
（ｎ−１）番目のラウンドが終了した時点で、ＰＱ＃０〜＃２の残りシェア累積値が、図１３が示す通りであるとする。ｎ番目のラウンドは、図１３に示す残りシェア累積値が使用される。
【００８７】
ｎ番目のラウンドにおいて、対象ＭＰ２６４は、図１４に示すように、ＰＱ＃０〜＃２について、シェア値を、残りシェア累積値に累積する（図１１のステップ１１０５）。図１４によれば、シェア値は、優先度が高いほど大きな値でよい（すなわち、シェア値の大きさが、優先度の高さに相当して良い）。また、閾値は、ＰＱ＃０〜＃２に共通の値である。
【００８８】
ＰＱ＃０〜＃２について、図１４に示したシェア累積値から、閾値がシェア累積値以下になるまで、閾値が１回以上減算される。閾値が１回減算できる都度に、上限起動数が１インクリメントされる。従って、上限起動数は、図１４に示したシェア累積値が閾値で除算されることにより得られた商であり、残りシェア累積値は、その際の余りである。図１５によれば、ｎ番目のラウンドにおいて、ＰＱ＃０について、上限起動数が「３」であり、ＰＱ＃１について、上限起動数が「２」であり、ＰＱ２について、上限起動数が「０」である。図１５の例によれば、ＰＱ＃０〜＃２について、ｎ番目のラウンドが終了した時点の残りシェア累積値は、図１６に示す通りである。
【００８９】
図１７は、ＰＱ＃０〜＃２についてのコンカレンシー値を表すテーブルを示す。図１７に示す例によれば、ＰＱ＃０のコンカレンシー値は「５」、ＰＱ＃１のコンカレンシー値は「２」、ＰＱ＃２のコンカレンシー値は「１」である。
【００９０】
図１５に示したシェア累積値と、図１７に示したコンカレンシー値と、図１８に示した起動中コマンド数とに基づけば、ＰＱ＃０〜＃２についての上限起動数は、図１９に示す通りとなる（図１８の点線枠１８００は、ＰＱ＃０〜＃２における起動中コマンド数を示す）。
【００９１】
例えば、ＰＱ＃０については、シェア累積値を閾値で除算することにより得られた商「３」と同数のＩ／Ｏコマンドを起動することができる。具体的には、ＰＱ＃０について、２つのＩ／Ｏコマンドが起動している最中である。ＰＱ＃０のコンカレンシー値は「５」である。このため、ＰＱ＃０の上限起動数の最大値は、「３」である（５−２＝３）。図１９によれば、ＰＱ＃０について、シェア累積値を閾値で除算した商は「３」である。従って、ＰＱ＃０について、商「３」と同数のＩ／Ｏコマンドを起動できる。
【００９２】
しかし、ＰＱ＃１については、商「２」と同数のＩ／Ｏコマンドを起動することはできず、起動できるＩ／Ｏコマンドの数は、商「２」未満である。具体的には、ＰＱ＃１について、１つのＩ／Ｏコマンドが起動している最中である。ＰＱ＃１のコンカレンシー値は「２」である。このため、ＰＱ＃１の上限起動数の最大値は、「１」である（２−１＝１）。しかし、図１９によれば、ＰＱ＃１について、シェア累積値を閾値で除算した商は「２」である。従って、ＰＱ＃１についての上限起動数は、「１」となる。
【００９３】
上述のように、起動中コマンド数と上限起動数との合計がコンカレンシー値以下の数値に制限される。
【００９４】
図２０は、Ｑｏｓ主制御部１０にフィードバックされる稼働状況情報の種類を表すテーブルを示す。
【００９５】
Ｑｏｓ主制御部１０は、フィードバックされた稼働状況情報に基づいて、Ｉ／Ｏコマンドに付与すべき優先度、及び、シェア値を決定する。
【００９６】
同図によると、Ｑｏｓ主制御部１０にフィードバックされる稼働状況情報は６種類である。各種の稼働状況情報について、下記の３つ、
（＊）ＭＰＰＫ内計測単位（どのような要素毎に稼働状況情報が取得されるか）、
（＊）取得単位（どのようなタイミングで稼働状況情報が取得されるか）、
（＊）ＳＭ更新単位（どのようなタイミングで、取得された稼働状況情報をＳＭ２４１に格納するか）、
が定義されている。稼働状況情報＃１がＩ／Ｏ処理回数、稼働状況情報＃２がデータ転送量、稼働状況情報＃３が平均応答時間、稼働状況情報＃４がキュー登録数、稼働状況情報＃５が起動中コマンド数、稼働状況情報＃６が情報更新カウント値である。情報＃１〜＃５は、累積値であり、このため、Ｑｏｓ主制御部１０は累積値を受け取ることになる。それ故、Ｑｏｓ主制御部１０は、単位時間当たりの値を算出するために、今回受けた累積値から前回取得した累積値を減算し、それにより得られた値を単位時間で除算する必要がある。
【００９７】
図２１は、取得単位「Ｉ／Ｏ処理完了毎」である稼働状況情報（Ｉ／Ｏ処理回数、データ転送量、平均応答時間）を取得する処理の流れを示すフローチャートである。
【００９８】
ＭＰ２６４は、Ｉ／Ｏコマンドを起動すると（ステップ２１０１）、Ｉ／Ｏコマンド開始時刻をローカルメモリ２６１に登録する（ステップ２１０２）。そして、ＭＰ２６４は、Ｉ／Ｏコマンドの処理が終了すると（ステップ２１０３）、Ｉ／Ｏコマンド終了時刻をローカルメモリ２６１に登録する（ステップ２１０４）。その後、ＭＰ２６４は、ローカルメモリ２６１上のＩ／Ｏ処理数カウント値（処理されたＩ／Ｏコマンドの数を表す値）を１インクリメントする（ステップ２１０５）。
【００９９】
また、ＭＰ２６４は、Ｉ／Ｏコマンドの処理に従い書き込まれた又は読み出されたデータの量（データ転送量）を特定し（ステップ２１０６）、ローカルメモリ２６１上のデータ転送量カウント値に加算する（ステップ２１０７）。
【０１００】
また、ＭＰ２６４は、Ｉ／Ｏコマンド開始時刻とＩ／Ｏコマンド終了時刻との差分を基に平均応答時間（Ｉ／Ｏコマンド開始時刻とＩ／Ｏコマンド終了時刻との差分の合計をＩ／Ｏコマンド処理数カウント値で除算した値）を算出し（ステップ２１０８）、算出された値を、ローカルメモリ２６１上の平均応答時間カウント値に加算する（ステップ２１０９）。
【０１０１】
以上の処理により、ローカルメモリ２６１におけるＩ／Ｏ処理数カウント値、データ転送量カウント値、及び平均応答時間カウント値が、Ｉ／Ｏコマンドが処理される都度に、更新される。
【０１０２】
図２２は、取得単位「５０ミリ秒（瞬間値）」である稼働状況情報（キュー登録数、起動中コマンド数）を取得する処理の流れを示すフローチャートである。
【０１０３】
ＭＰ２６４は、キュー登録数９０１の瞬間値（当該時点でのキュー登録数）を特定する（ステップ２２０１）。そして、ＭＰ２６４は、その特定した瞬間値を、ローカルメモリ２６１上のキュー登録数カウント値に加算する（ステップ２２０２）。ここで、「瞬間値」とは、例えば、５０ｍｓｅｃ程度の短い時間幅で特定された値である。
【０１０４】
また、ＭＰ２６４は、起動中コマンド数９０２の瞬間値を特定する（ステップ２２０３）。そして、ＭＰ２６４は、その特定した瞬間値を、ローカルメモリ２６１上の起動中コマンド数カウント値に加算する（ステップ２２０２）。ここでも、「瞬間値」は、例えば、５０ミリ秒程度の短い時間幅で特定された値である。
【０１０５】
図２３は、取得単位「１秒周期（１ｓ周期）（瞬間値）」でＳＭ内の稼働状況情報を更新する処理の流れを示すフローチャートである。
【０１０６】
ＭＰ２６４は、１秒周期で、下記、
（＊）ローカルメモリ２６１上のＩ／０処理数カウント値（処理されたＩ／Ｏコマンドの累積値）を特定する（ステップ２３０１）、
（＊）ローカルメモリ２６１上のデータ転送量カウント値（入出されたデータの量の累積値）を特定する（ステップ２３０２）、
（＊）ローカルメモリ２６１上の平均応答時間カウント値（平均応答時間の累積値）を特定する（ステップ２３０３）、
を行う。ステップ２３０１〜ステップ２３０３の順番は、上記に限らない。
【０１０７】
次に、ＭＰ２６４は、ローカルメモリ２６１上のキュー登録数カウント値に基づいて、キュー登録数の平均値（１秒当たりのキュー登録数（例えば、キュー登録数カウント値を情報更新カウント値で除算することにより得られる値））を算出する（ステップ２３０４）。
【０１０８】
また、ＭＰ２６４は、ローカルメモリ２６１上の起動中コマンド数カウント値に基づいて、起動中コマンド数の平均値（１秒当たりの起動中コマンド数（例えば、起動中コマンド数カウント値を情報更新カウント値で除算することにより得られる値））を算出する（ステップ２３０５）。
【０１０９】
ＭＰ２６４は、ステップ２３０１〜２３０５で得た各種稼働状況情報を、ＳＭ２４１上の該当のカウント値に加算し（ステップ２３０６）、ステップ２３０１〜２３０５で得た各種稼働状況情報をゼロクリアする（リセットする）（ステップ２３０７）。そして、ＭＰ２６４は、ＳＭ２４１上の情報更新カウント値（図２０の情報＃６）を１インクリメントする（ステップ２３０８）。つまり、情報更新カウント値は、図２３に示す一連の処理が行われた回数である。
【０１１０】
ＳＭ２４１上の更新後の各種稼働状況情報が、ＭＰ２６４からＱｏｓ主制御部１０にフィードバックされる。ＳＭ２４１上の各種稼働状況情報は、１秒或いは１秒よりも長い周期で、定期的に（又は不定期的に）、Ｑｏｓ主制御部１０に送信される。
【０１１１】
Ｑｏｓ主制御部１０は、フィードバックされた１種類以上の稼働状況情報を基に、制御を行う。例えば、第１のＭＰＰＫ＃０内の第１のＰＱ＃１の負荷（ＰＱ＃１に蓄積されているＩ／Ｏコマンドの数）が、期待値より低い、或いは、第２のＭＰＰＫ＃１内の第２のＰＱ＃１（同一優先度のＰＱ）の負荷よりも高い場合、下記（１）〜（３）のいずれかの方法で、第１のＰＱ＃１の負荷と第２のＰＱ＃２の負荷と差を縮めることが期待できる。
（１）ＭＰＰＫ＃０がオーナ権であるＬＤＥＶを指定したＩ／Ｏコマンドの発行頻度を減らし、ＭＰＰＫ＃１がオーナ権であるＬＤＥＶを指定したＩ／Ｏコマンドの発行頻度を増やすような制御を、Ｑｏｓ主制御部１０が行う。
（２）Ｑｏｓ主制御部１０が、ＭＰＰＫ＃０及び／又は＃１について設定する制御パラメータ（例えば、シェア値及び／又はコンカレンシー値）を調整する。
（３）ＰＱ＃１に蓄積されるＩ／Ｏコマンドで指定されているＬＤＥＶのオーナ権が、ＭＰＰＫ＃０からＭＰＰＫ＃１に移る。
【０１１２】
ここで、「オーナ権」とは、対象となるＬＤＥＶに対してアクセスできる権利である。例えば、或るＭＰＰＫについて或るＬＤＥＶのオーナ権が設定されると、その或るＬＤＥＶには、そのＬＤＥＶのオーナ権を有するＭＰＰＫのみがアクセスでき、そのＬＤＥＶのオーナ権が無い他のＭＰＰＫは、そのＬＤＥＶに対してアクセスすることができない。
【０１１３】
この（３）の方法において、どのＬＤＥＶのオーナ権をＭＰＰＫ＃０からＭＰＰＫ＃１に移すかは、フィードバックされた稼働状況情報を基にＱｏｓ主制御部１０が決定しても良いし、管理者が稼働状況情報を基に決定しても良いし、ＭＰ２６４（又はＳＶＰ）が稼働状況情報を基に決定しても良い。図２４及び図２５に示すように、決定されたＬＤＥＶのオーナ権がＭＰＰＫ＃０からＭＰＰＫ＃１に移ることで、第１のＰＱ＃１の負荷と第２のＰＱ＃２の負荷との差を縮めることができる。ＬＤＥＶのオーナ権の移動により、オーナ権の移動元のＭＰＰＫとオーナ権の移動先のＭＰＰＫ間で負荷を分散することもできる。
【０１１４】
ＰＱ毎及びＭＰＰＫ毎に稼働状況情報（例えば、ＰＱ毎に、Ｉ／Ｏ頻度（例えば、単位は、ＩＯＰＳ（１秒当たりのＩ／Ｏコマンドの数））が取得され、期待される負荷との差が最大の負荷を有するＰＱが選択されて良い。そして、そのＰＱについて、そのＰＱに関与する各ＬＤＥＶ（そのＰＱに蓄積されるＩ／Ｏコマンドで指定され得る各ＬＤＥＶ）について、稼働状況情報が取得され、その稼働状況情報を基に、オーナ権（ＬＤＥＶ）の移動後の負荷と期待される負荷との差が最小になるようなオーナ権（ＬＤＥＶ）が決定されて良い。
【０１１５】
なお、或るＬＤＥＶのオーナ権が、第１のＭＰＰＫから第２のＭＰＰＫに移った場合、振分け先検索テーブル５００（図５参照）が更新される。具体的には、そのテーブル５００において、或るＬＤＥＶのＬＵＮに、第１のＭＰＰＫの番号に代えて、第２のＭＰＰＫの番号が対応付けられる。
【０１１６】
ところで、Ｑｏｓ制御として、下記のような制御も可能である。
【０１１７】
すなわち、計算機システムが、論理的に複数の区域（以下、Ｑｏｓ区域）に分割される。各Ｑｏｓ区域には、少なくとも１つのホストと、少なくとも１つのＭＰＰＫと、少なくとも１つのＬＤＥＶとが含まれる。Ｑｏｓ主制御部１０は、Ｑｏｓ区域毎に、他のＱｏｓ区域と異なるＱｏｓ制御を行うことができる。つまり、Ｑｏｓ区域毎に、独立したＱｏｓ制御が行われて良い。具体的には、例えば、第１のＱｏｓ区域及び第２のＱｏｓ区域にそれぞれ３つのＰＱがある場合、第１のＱｏｓ区域内の３つのＰＱについて設定されるシェア値及びコンカレンシー値と、第２のＱｏｓ区域内の３つのＰＱについて設定されるシェア値及びコンカレンシー値は異なっていて良い。例えば、図２６に示すように、Ｑｏｓ区域Ｘ内の３つのＰＱについてのシェア累積値と、Ｑｏｓ区域Ｙ内の３つのＰＱについてのシェア累積値とが、異なるように、Ｑｏｓ制御が行われて良い。また、Ｑｏｓ主制御部１０は、フィードバックされた稼働状況情報が、どのＱｏｓ区域に属する要素（例えば、ＭＰＰＫ、ＰＱ）に関する稼働状況情報であるかを基に、Ｑｏｓ区域別に、独立したＱｏｓ制御を行ってよい。より具体的には、例えば、Ｑｏｓ主制御部１０は、図２７に示すＱｏｓ制御テーブルを基に、下記のうちの少なくとも１つ、
（＊）どのＱｏｓ区域のＰＱにどのようなパラメータ（シェア値及び／又はコンカレンシー値）を設定するかを決定すること、
（＊）どのＱｏｓ区域についての稼働状況情報であるかを特定すること、
（＊）どのＱｏｓ区域内のＬＤＥＶのオーナ権を、どの別のＱｏｓ区域内のＭＰＰＫに移動するかを決定し、その決定に従い、Ｑｏｓ区域間で、ＬＤＥＶオーナ権を移動すること、
を行って良い。Ｑｏｓ制御テーブルは、例えば、Ｑｏｓ区域毎に、下記の情報、
（＊）Ｑｏｓ区域のＩＤ、
（＊）Ｑｏｓ区域に含まれるホストのＩＤ（例えばＳ＿ＩＤ）、
（＊）Ｑｏｓ区域に含まれているＭＰＰＫの番号、
（＊）Ｑｏｓ区域に含まれているＬＤＥＶのＩＤ（例えばＬＵＮ）、
を有して良い。
【０１１８】
Ｑｏｓ区域間のＬＤＥＶオーナ権の移動は、計算機システムの初期構成と、計算機システムの運用中でのＱｏｓ区域変更のいずれにおいても行うことができる。
【０１１９】
図２８は、計算機システムの初期構成におけるＬＤＥＶオーナ権移動の一例を示す図である。
【０１２０】
Ｑｏｓ区域Ｘ及びＹがある。Ｑｏｓ区域Ｘに、ＭＰＰＫ＃０が含められ、Ｑｏｓ区域Ｙに、ＭＰＰＫ＃３が含められる。ＭＰＰＫ＃０は、ＬＤＥＶ＃１〜＃３のオーナ権を有し、ＭＰＰＫ＃３は、ＬＤＥＶ＃８及び＃９のオーナ権を有している。
【０１２１】
この状況において、ＭＰ２６４又（はＳＶＰ２２０）が、ＳＶＰ２２０（又はＱｏｓ主制御部１０）から、ＬＤＥＶ＃４をＱｏｓ区域Ｙに含め、且つ、ＬＤＥＶ＃９をＱｏｓ区域Ｘに含めることが指定されたとする。
【０１２２】
この場合、ＭＰ２６４（又はＳＶＰ２２０）が、ＬＤＥＶ＃３のオーナ権を、ＭＰＰＫ＃０から、Ｑｏｓ区域Ｙ内のいずれかのＭＰＰＫ（例えばＭＰＰＫ＃３）に移動する。また、ＭＰ２６４（又はＳＶＰ２２０）が、ＬＤＥＶ＃８のオーナ権を、ＭＰＰＫ＃３から、Ｑｏｓ区域Ｘ内のいずれかのＭＰＰＫ（例えばＭＰＰＫ＃０）に移動する。Ｑｏｓ主制御部１０、ＳＶＰ２２０又はＭＰ２６４が、移動先のＱｏｓ区域における１以上のＭＰＰＫのうちのどのＭＰＰＫをオーナ権の移動先とするかを、移動対象のオーナ権に対応するＬＤＥＶを指定したＩ／Ｏコマンドが蓄積されるＰＱについてのパラメータ（例えば、シェア値）を基に、決定して良い。
【０１２３】
図２９は、計算機システムの運用中でのＱｏｓ区域変更におけるＬＤＥＶオーナ権移動の一例を示す図である。
【０１２４】
Ｑｏｓ区域変更前は、図２８に示した構成のＱｏｓ区域Ｘ及びＹがあるとする。その状態で、ホストＡ及びＢからのＩ／Ｏコマンドが増加し、ＭＰＰＫ＃０の負荷が増加したとする。
【０１２５】
この場合、例えば、ＭＰＰＫ＃０に割り当てられているＬＤＥＶのオーナ権を他のＭＰＰＫに移動することにより、ＭＰＰＫ＃０の負荷を軽減させることが考えられる。
【０１２６】
ここで、ＭＰＰＫ＃０のＬＤＥＶオーナ権の移動先は、ＭＰＰＫ＃０を含んだＱｏｓ区域Ｘ内である必要がある。なぜなら、ＭＰＰＫ＃０が有するオーナ権に対応したＬＤＥＶは、Ｑｏｓ区域Ｘに含められているＬＤＥＶであるからである。
【０１２７】
しかし、図２８に示したＱｏｓ区域Ｘによれば、ＭＰＰＫ＃０の他にＭＰＰＫが存在しない。
【０１２８】
そこで、ＭＰ２６４、ＳＶＰ２２０又はＱｏｓ主制御部１０は、ＭＰＰＫ＃０の負荷（例えば、ＭＰＰＫ＃０に蓄積されているＩ／Ｏコマンドの総数、或いは、少なくとも１つのＰＱについてのキュー登録数）が所定の閾値を超えたことを検出した場合、例えば、以下の処理、
（ａ）いずれかの他のＱｏｓ区域（Ｑｏｓ区域Ｙ）内のいずれか１以上のＭＰＰＫ（ＭＰＰＫ＃１）を、Ｑｏｓ区域Ｘに含める（その際、例えば、図２７に示したテーブルを、ＭＰＰＫ＃１がＱｏｓ区域Ｙに含まれるように更新する）、
（ｂ）ＭＰＰＫ＃１の、ＬＤＥＶ＃４及び＃５のオーナ権を、Ｑｏｓ区域Ｙ内のいずれかのＭＰＰＫ（ＭＰＰＫ＃２）に移動する、
（ｃ）Ｑｏｓ区域Ｘに既存ＭＰＰＫ＃０が有する、ＬＤＥＶ＃８のオーナ権を、Ｑｏｓ区域に新たに追加されたＭＰＰＫ＃１に移動する、
を行って良い。
【０１２９】
上記（ｂ）を行う理由は、ＬＤＥＶ＃４及び＃５は、Ｑｏｓ区域Ｙに含められているＬＤＥＶであるためである。
【０１３０】
上記（ｃ）を行う理由は、新たに追加されたＭＰＰＫにオーナ権を移動することで、既存のＭＰＰＫの負荷を新たに追加されたＭＰＰＫに分散するためである。なお、（ｃ）において、移行対象となるオーナ権に対応したＬＤＥＶは、例えば、
（＊）既存ＭＰＰＫ＃０が有する複数のＰＱのうち、期待値より高い負荷のＰＱに蓄積されるＩ／Ｏコマンドで指定されるＬＤＥＶ、
（＊）既存ＭＰＰＫ＃０に割り当てられている複数のＬＤＥＶから任意に選択されたＬＤＥＶ、
（＊）既存ＭＰＰＫ＃０に割り当てられている複数のＬＤＥＶのうち、Ｉ／Ｏ頻度が最も高いＬＤＥＶ、
のいずれかである。
【０１３１】
以上の処理により、ＭＰＰＫ＃０の負荷を軽減させることができる。
【０１３２】
なお、どのＱｏｓ区域にどのＭＰＰＫを追加するか、及び／又は、どのＱｏｓ区域からどのＭＰＰＫを除去するかは、ＳＭ２４１内の一種類以上の稼働状況情報、具体的には、例えば、どのＱｏｓ区域内のどのＭＰＰＫの負荷が所定の閾値より高くなったか、或いは、どのＱｏｓ区域内のどのＭＰＰＫに障害が発生したかを基に、決定されて良い。
【０１３３】
ＬＤＥＶオーナ権の移動に伴って、Ｑｏｓ主制御部１０、ＳＶＰ２２０又はＭＰ２６４が、移動対象のオーナ権に対応するＬＤＥＶを指定したＩ／Ｏコマンド（例えば、未だ起動されておらずエントリ（例えばＰＱ或いはＩＭＱ内のエントリ）に蓄積されているＩ／Ｏコマンド）を、移動元のＭＰＰＫから移動先のＭＰＰＫに移動しても良い。
【０１３４】
以上、本発明の一実施形態を説明したが、これは、本発明の説明のための例示であって、本発明の範囲をこの実施形態のみに限定する趣旨ではない。本発明は、他の種々の形態でも実施する事が可能である。
【０１３５】
例えば、ＳＶＰ２２０が無くても良い。その場合、いずれかのＭＰ２６４が、ＳＶＰ２２０の機能を有しても良い。
【符号の説明】
【０１３６】
１０…Ｑｏｓ主制御部、２０…ホスト、１００…ストレージ装置
【図１】
0005555370.tif 000002
【図２】
0005555370.tif 000003
【図３】
0005555370.tif 000004
【図４】
0005555370.tif 000005
【図５】
0005555370.tif 000006
【図６】
0005555370.tif 000007
【図７】
0005555370.tif 000008
【図８】
0005555370.tif 000009
【図９】
0005555370.tif 000010
【図１０】
0005555370.tif 000011
【図１１】
0005555370.tif 000012
【図１２】
0005555370.tif 000013
【図１７】
0005555370.tif 000014
【図２０】
0005555370.tif 000015
【図２１】
0005555370.tif 000016
【図２２】
0005555370.tif 000017
【図２３】
0005555370.tif 000018
【図２７】
0005555370.tif 000019
【図２８】
0005555370.tif 000020
【図２９】
0005555370.tif 000021
【図１３】
0005555370.tif 000022
【図１４】
0005555370.tif 000023
【図１５】
0005555370.tif 000024
【図１６】
0005555370.tif 000025
【図１８】
0005555370.tif 000026
【図１９】
0005555370.tif 000027
【図２４】
0005555370.tif 000028
【図２５】
0005555370.tif 000029
【図２６】
0005555370.tif 000030