(57)【要約】  ストレージシステムは、複数のプロセッサを含んだコントローラと、インターフェイスデバイスと、インターフェイスデバイスに関連付けられている複数のキューとを有する。複数のキューの各々には、そのキューに割り当てられているプロセッサからインターフェイスデバイスへ送られるデータが格納される。複数のキューは、専有キューと共有キューとを含み、専有キューは、複数のプロセッサの内の第１のプロセッサだけが割り当てられているキューであり、データの格納時に排他処理が不要なキューであり、共有キューは、複数のプロセッサの内の２以上の第２のプロセッサが割り当てられるキューであり、データの格納時に排他処理が必要なキューである。
2016067339.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサを含んだコントローラと、
記憶デバイスが接続されるインターフェイスデバイスと、
前記インターフェイスデバイスに関連付けられており専有キューと共有キューを含んだ複数のキューと
を有し、
前記複数のキューの各々には、そのキューに割り当てられているプロセッサから前記インターフェイスデバイスへ送られるデータが格納され、前記複数のキューの各々から前記インターフェイスデバイスにデータが送られるようになっており、
前記専有キューは、前記複数のプロセッサの内の１つのプロセッサである第１のプロセッサだけが割り当てられているキューであり、データの格納時に排他処理が不要なキューであり、
前記共有キューは、前記複数のプロセッサの内の２以上の第２のプロセッサが割り当てられるキューであり、データの格納時に排他処理が必要なキューであり、
前記第２のプロセッサは、前記第１のプロセッサ以外のいずれかのプロセッサである、
ストレージシステム。
【請求項２】
前記コントローラは、
前記複数のプロセッサにそれぞれ対応した複数のデータ発行頻度に基づいて、前記専有キューに割り当てるプロセッサを決定し、
プロセッサの前記データ発行頻度は、そのプロセッサが前記インターフェイスデバイスへデータを発行した頻度である、
請求項１記載のストレージシステム。
【請求項３】
前記コントローラは、
前記複数のデータ発行頻度のうち最大のデータ発行頻度に対応したプロセッサを、前記専有キューに割り当てるプロセッサとする、
請求項２記載のストレージシステム。
【請求項４】
前記コントローラは、
前記共有キューにデータが格納される頻度である共有頻度に関する所定の条件が満たされた場合、いずれかの第２のプロセッサである対象第２プロセッサを前記第１のプロセッサに代えて前記専有キューに割り当て、且つ、前記対象第２プロセッサに代えて前記第１のプロセッサを前記共有キューに割り当てる割当て切替えを実行する
請求項１記載のストレージシステム。
【請求項５】
前記所定の条件は、後共有頻度が前共有頻度よりも所定の閾値以上小さいことであり、
前記後共有頻度とは、前記対象第２のプロセッサを前記第１のプロセッサに代えて前記専有キューに割り当て、且つ、前記対象第２のプロセッサに代えて前記第１のプロセッサを前記共有キューに割り当てる割当て切替えを実行したと仮定した場合の共有頻度であり、
前記前共有頻度とは、前記割当て切替え前の共有頻度である
請求項４記載のストレージシステム。
【請求項６】
前記コントローラは、
前記複数のキューの各々について、専有及び共有のいずれのキュー種別であるかを管理しており、
前記共有のキューについては、そのキューにロックをかけることを含んだ排他処理を行ってそのキューにデータを格納するようになっており、前記専有のキューについては、前記排他処理無しにそのキューにデータを格納するようになっており、
前記コントローラは、前記複数のプロセッサと前記複数のキューとの割当関係を繰り返し更新するようになっており、
前記コントローラは、キューに割り当てられているプロセッサ数が１つだけになった場合に、そのキューのキュー種別を、共有から専有に変更する、
請求項１記載のストレージシステム。
【請求項７】
前記コントローラは、
前記複数のキューの内の利用負荷指標が最大のキューである第１のキューについて、そのキューのキュー種別を、共有から専有に変更するか否か判定するようになっており、
前記利用負荷指標は、キューにおける１のプロセッサあたりの利用負荷の大きさを示す指標であって、そのキューに割り当てられているプロセッサ数が多くなると小さくなり、各プロセッサからそのキューにデータが格納された頻度が大きくなると大きくなる値である
請求項６記載のストレージシステム。
【請求項８】
前記コントローラは、
前記第１のキューに割り当てられている複数のプロセッサの内、前記第１のキューにデータを格納する頻度が最小のプロセッサを、前記複数のキューの内の前記利用負荷指標が最小のキューである第２のキューに割り当てる割当て切替えを実行したと仮定した場合の前記第１のキューの利用負荷指標及び前記第２のキューの利用負荷指標をそれぞれ推定し、
前記推定された第１のキューの利用負荷指標が、前記推定された第２のキューの利用負荷指標よりも大きい場合、前記第２のキューに前記最小のプロセッサを割り当てる割当て切替えを実行する
請求項７記載のストレージシステム。
【請求項９】
前記利用負荷指標は、キューに割り当てられているプロセッサ数の逆数と、各プロセッサからそのキューにデータが格納された頻度の合計との積に基づく値である
請求項８記載のストレージシステム。
【請求項１０】
前記複数のプロセッサのそれぞれでプロセスを実行することによりデータが発行されるようになっており、
前記コントローラは、
複数のプロセスにそれぞれ対応した複数のデータ発行頻度に基づいて、前記専有キューに割り当てられている前記第１のプロセッサで実行するプロセスを決定し、
プロセスの前記データ発行頻度は、そのプロセスが前記インターフェイスデバイスへデータを発行した頻度である、
請求項１記載のストレージシステム。
【請求項１１】
前記コントローラは、
前記複数のデータ発行頻度のうち最大のデータ発行頻度に対応したプロセスを、前記専有キューに割り当てられている前記第１のプロセッサで実行するプロセスとする、
請求項１０記載のストレージシステム。
【請求項１２】
前記複数のプロセッサのそれぞれでプロセスを実行することによりデータが発行されるようになっており、
前記コントローラは、
前記共有キューにデータが格納される頻度である共有頻度及び前記第１のプロセッサの負荷に関する所定の条件が満たされた場合、いずれかの第２のプロセッサである対象第２プロセッサで実行されているプロセスを、前記第１のプロセッサに移動させるプロセス移動を実行する
請求項１記載のストレージシステム。
【請求項１３】
前記所定の条件とは、後共有頻度が前共有頻度よりも所定の閾値以上小さく、且つ、前記第１のプロセッサの負荷が所定の閾値未満であることであり、
前記後共有頻度とは、前記対象第２プロセッサで実行されているプロセスを前記第１のプロセッサに移動させるプロセス移動を実行したと仮定した場合の共有頻度であり、
前記前共有頻度とは、前記プロセス移動前の共有頻度である
請求項１２記載のストレージシステム。
【請求項１４】
ストレージシステムにおけるデータの記憶制御方法であって、
前記ストレージシステムは、複数のプロセッサを含んだコントローラと、記憶デバイスが接続されるインターフェイスデバイスと、前記インターフェイスデバイスに関連付けられており専有キューと共有キューを含んだ複数のキューと、を有し、
前記専有キューは、前記複数のプロセッサの内の１つのプロセッサである第１のプロセッサだけが割り当てられているキューであり、
前記共有キューは、前記複数のプロセッサの内の２以上の第２のプロセッサが割り当てられるキューであり、
前記第２プロセッサは、前記第１プロセッサ以外のいずれかのプロセッサであり、
前記コントローラは、
プロセッサから前記インターフェイスデバイスへ送られるデータが前記第１のプロセッサから発行されたものである場合、排他処理を行わずに前記データを前記専有キューに格納し、
プロセッサから前記インターフェイスデバイスへ送られるデータが前記第２のプロセッサから発行されたものである場合、排他処理を行って前記データを前記共有キューに格納する
記憶制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステム及び記憶制御方法の技術に関する。
【背景技術】
【０００２】
ストレージシステムにおいて、プロセッサは、キューを介してＩ／Ｆ（インターフェイス）デバイスとデータを遣り取りする。複数のプロセッサが１つのキューを利用する構成において、プロセッサは、キューにデータを格納する際、他のプロセッサからそのキューが利用されないように、排他処理を行う必要がある。排他処理は、プロセッサの処理負荷を高めるので、できるだけ実行されないことが望ましい。そこで、複数のプロセッサを備える計算機において、Ｉ／Ｆデバイスに対して、複数のプロセッサの各々が専用に利用するキューを設けることにより、排他処理を不要とする技術が知られている（特許文献１、２、３）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】ＵＳ８５９５３８５
【特許文献２】ＵＳ８５７８１０６
【特許文献３】特開２０１０−１２８６６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、Ｉ／Ｆデバイスに対して、複数のプロセッサの各々が専用に利用するキュー（「専有キュー」という）を設ける構成の場合、プロセッサの数が多いと、その分、専有キューの数も多く、延いては、Ｉ／Ｆデバイスにおけるリソース（レジスタなど）の使用量も大きい。したがって、プロセッサ数が多いと、Ｉ／Ｆデバイスのリソースが不足し、結果として、プロセッサ毎に専有キューを設けることができない場合もある。それを避けるために、Ｉ／Ｆデバイスに大きなリソースを載せることが考えられるが、Ｉ／Ｆデバイスに大きなリソースを載せると、Ｉ／Ｆデバイスのコストが増加してしまう。【０００５】
そこで、本発明の目的は、Ｉ／Ｆデバイスのリソース使用量と排他処理の負荷の両方を抑制したストレージシステム及び記憶制御方法を提供することにある。
【課題を解決するための手段】
【０００６】
一実施形態に係るストレージシステムは、複数のプロセッサを含んだコントローラと、記憶デバイスが接続されるインターフェイスデバイスと、インターフェイスデバイスに関連付けられている複数のキューとを有する。複数のキューの各々には、そのキューに割り当てられているプロセッサからインターフェイスデバイスに送られるデータが格納され、複数のキューの各々からインターフェイスデバイスにデータが送られるようになっている。複数のキューは、専有キューと共有キューとを含む。専有キューは、複数のプロセッサの内の１つのプロセッサである第１プロセッサだけが割り当てられているキューであり、データの格納時に排他処理が不要なキューである。共有キューは、複数のプロセッサの内の２以上の第２プロセッサが割り当てられるキューであり、データの格納時に排他処理が必要なキューである。第２プロセッサは、第１プロセッサ以外のいずれかのプロセッサである。
【発明の効果】
【０００７】
本発明によれば、Ｉ／Ｆデバイスのリソース使用量と排他処理の負荷の両方を抑制できる。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態に係るストレージシステムの動作概要を示す。
【図２】第１の実施形態に係るストレージシステムの構成例を示す。
【図３】キュー管理テーブルの構成例を示す。
【図４】プロセッサ別Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）数テーブルの構成例を示す。
【図５】Ｉ／Ｏ要求をキューに格納する処理の例を示すフローチャートである。
【図６】専有キューを何れのプロセッサに割り当てるかを決定する処理の例を示すフローチャートである。
【図７】Ｉ／Ｆデバイスに関する複数のキューの内、何れを専有キューとするかを決定する処理の例を示すフローチャートである。
【図８】キュー割り当て変更処理の例を示すフローチャートである。本処理は、図７のＳ３１０に相当する。
【図９】第２の実施形態に係るストレージシステムの動作概要を示す。
【図１０】第２の実施形態に係るストレージシステムの構成例を示す。
【図１１】プロセス別Ｉ／Ｏ数テーブルの構成例を示す。
【図１２】プロセスを何れのプロセッサで実行するかを決定する処理の例を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下、実施形態を説明する。以下の説明では、「ｘｘｘテーブル」の表現にて情報を説明することがあるが、情報は、どのようなデータ構造で表現されていてもよい。すなわち、情報がデータ構造に依存しないことを示すために、「ｘｘｘテーブル」を「ｘｘｘ情報」と呼ぶことができる。
【００１０】
また、以下の説明では、「ｘｘｘ部」を主語として処理を説明する場合があるが、「ｘｘｘ部」は、コンピュータプログラム（「プログラム」という）の一種であってもよい。プログラムは、プロセッサによって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及びネットワークインターフェイスデバイスの内の少なくとも１つを用いながら行うため、処理の主語が、プロセッサ、そのプロセッサを有する装置とされてもよい。プロセッサが行う処理の一部又は全部が、ハードウェア回路（例えば、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）など）で行われてもよい。プログラムは、プログラムソースからインストールされてよい。プログラムソースは、プログラム配布サーバ又は記憶メディア（例えば可搬型の記憶メディア）であってもよい。また、プロセッサ及びメモリをまとめてコントローラと呼んでもよい。
【００１１】
また、以下の説明では、同種の要素を区別して説明する場合には、「ｘｘｘ１ａ」、「ｘｘｘ１ｂ」のように、参照符号を使用し、同種の要素を区別しないで説明する場合には、「ｘｘｘ１」のように参照符号の内の共通番号のみを使用することがある。
＜第１の実施形態＞
【００１２】
図１は、第１の実施形態に係るストレージシステム１ａの動作概要を示す。
【００１３】
第１の実施形態に係るストレージシステム１ａは、記憶装置１４と、記憶装置１４へのデータの入出力を制御するコントローラ２ａとを有する。コントローラ２ａは、複数のプロセッサ１１（例えば１１ａ〜１１ｃ）と、メモリ１２ａと、Ｉ／Ｆデバイス１３（例えば１３ａ）とを備える。
【００１４】
メモリ１２ａは、プロセッサ１１がＩ／Ｆデバイス１３へ発行するデータ（Ｉ／Ｏ要求など）が一時的に格納されるキュー２０（例えばキュー２０ａ及び２０ｂ）を有する。
【００１５】
各キュー２０は、Ｉ／Ｆデバイス１３に関連付けられている。プロセッサ１１からＩ／Ｆデバイス１３へ発行されたデータは、発行先であるＩ／Ｆデバイス１３に関連付けられているキュー２０に格納される。キュー２０に格納されたデータは、順番に（例えばＦＩＦＯで）、Ｉ／Ｆデバイス１３に渡されて処理される。
【００１６】
コントローラ２ａは、Ｉ／Ｆデバイス１３に複数のキュー２０が関連付けられている場合、何れかのキュー２０にデータを格納する。ここで、１つのＩ／Ｆデバイス１３に関連付けられている複数のキューの内、一部のキュー（１又は２以上のキュー）は、それぞれ、専有キュー２０ａであり、残りのキュー（１又は２以上のキュー）は、それぞれ、共有キュー２０ｂである。つまり、１つのＩ／Ｆデバイス１３につき、少なくとも１つの専有キュー２０ａと少なくとも１つの共有キュー２０ｂとが存在する。専用キュー２０ａは、複数のプロセッサ１１のうちのいずれか１つのプロセッサだけが割り当てられたキュー２０である。以下、専有キュー２０ａに割り当てられているプロセッサを、「第１のプロセッサ」と言い、第１のプロセッサ以外のプロセッサを「第２のプロセッサ」と言うことがある。共有キュー２０ｂは、全ての第２のプロセッサのうちの２以上の第２のプロセッサが割り当てられているキュー２０である。共有キュー２０ｂと第２のプロセッサの対応関係については、様々な対応関係を採用可能である。例えば、全ての共有キュー２０ｂの各々に、全ての第２のプロセッサの各々が割り当てられてもよいし、第１の共有キュー２０ｂに、２以上の第２のプロセッサが割り当てられ、第２の共有キュー２０ｂに、２以上の第２のプロセッサが割り当てられてもよい。第１のプロセッサも第２のプロセッサも、それぞれ、そのプロセッサが割り当てられているキューにデータを格納することになる。
【００１７】
共有キュー２０ｂは、割り当てられている２以上の第２のプロセッサ１１から利用され得る。よって、コントローラ２ａは、第２のプロセッサがデータを共有キュー２０ｂに格納する際、共有キュー２０ｂついて排他処理を行う必要がある。
【００１８】
専有キュー２０ａは、第１のプロセッサ１１以外のプロセッサ１１から利用される可能性が無い。よって、コントローラ２ａは、データを専有キュー２０ａに格納する際、専有キュー２０ａについて排他処理を行う必要が無い。
【００１９】
排他処理を行う場合は、排他処理を行わない場合と比較して、キュー２０に対してデータを格納する処理に要する時間が長くなり、又、プロセッサ１１の処理負荷も高くなる。なお、排他処理は、コントローラ２ａにおいて、データを出力するプロセッサにより行われてもよいし、そのプロセッサに代えて又は加えて、所定のロジック（例えば、Ｉ／Ｆデバイス１３との間でデータをやり取りする複数のプロセッサとは別に設けられたプロセッサであって排他処理等の所定処理を行うためのプロセッサ）により行われてもよい。
【００２０】
ストレージシステムが備えるプロセッサ１１と同じ数の分、専有キュー２０ａを設けることが難しい場合もある。なぜなら、キュー２０の数が多いと、その分Ｉ／Ｆデバイス１３で使用されるリソース量（例えばレジスタ２１の数）が大きく、故に、Ｉ／Ｆデバイス１３のリソース量が不足してしまうことがあるからである。
【００２１】
そこで、本実施形態では、上述のとおり、複数のキュー２０の内の一部のキュー２０を、それぞれ、１つのプロセッサにのみ利用される専有キュー２０ａとし、残りのキューを、それぞれ、２以上のプロセッサに利用される共有キュー２０ｂとする。
【００２２】
これにより、ストレージシステムが備えるプロセッサ１１と同じ数の専有キュー２０ａを設けること無く（言い換えれば、１つのＩ／Ｆデバイス１３に関連付けられるキュー２０の数を、プロセッサ１１の数より少なくでき、以って、Ｉ／Ｆデバイスのリソース使用量を抑え）、且つ、排他処理が発生する回数を抑制する（つまり、排他処理の負荷を抑制する）ことができる。このため、例えば、排他処理がプロセッサ１１により行われるのであれば、プロセッサ１１の処理負荷を低減することになる。
【００２３】
図１において、専有キュー２０ａはプロセッサ１１ｃに割り当てられていて、共有キュー２０ｂは、プロセッサ１１ａ及び１１ｂに割り当てられているとする（図１の細い破線を参照）。
【００２４】
その後、プロセッサ１１ａ、１１ｂ及び１１ｃの中で、プロセッサ１１ｂのＩ／Ｆデバイス１３に対するデータの発行頻度が最大になった場合、次の処理が行われて良い。すなわち、コントローラ２ａは、専有キュー２０ａに、プロセッサ１１ｃに代えてプロセッサ１１ｂを割り当て（図１の太い破線矢印を参照）、プロセッサ１１ｃを、専有キュー２０ａに代えて共有キュー２０ｂに割り当てる（図１の太い実線矢印を参照）。これにより、共有キュー２０ｂにデータが格納される頻度が減少するため、排他処理が実行される回数も減少する。以下、第１の実施形態を詳細に説明する。
【００２５】
図２は、第１の実施形態に係るストレージシステム１ａの構成例を示す。
【００２６】
ストレージシステム１ａは、１以上の記憶装置１４と、それらの記憶装置１４に接続されたコントローラ２ａとを有する。コントローラ２ａは、複数のプロセッサ（例えば１１ａ〜１１ｃ）１１と、メモリ１２ａと、Ｉ／Ｆデバイス１３（例えば１３ａ及び１３ｂ）とを備え、これらの要素１１、１２ａ、１３は、内部バス１５で接続されている。内部バス１５は、双方向にデータの送信及び受信が可能である。内部バス１５の一例としては、ＰＣＩ  Ｅｘｐｒｅｓｓなどがある。
【００２７】
Ｉ／Ｆデバイス１３は、プロセッサ１１と記憶装置１４との間のＩ／Ｏを制御するデバイスである。Ｉ／Ｆデバイス１３は、プロセッサ１１からライトコマンド、リードコマンド及び消去コマンドなどのデータ（例えばＩ／Ｏ要求）を受領し、そのデータを記憶装置１４へ渡す。また、Ｉ／Ｆデバイス１３は、記憶装置１４からコマンド結果（例えばＩ／Ｏ要求の結果を含んだ応答）などのデータを受領し、そのデータをプロセッサ１１へ渡す。Ｉ／Ｆデバイス１３の一例としては、ホストバスアダプタ及びＳＡＴＡコントローラなどがある。Ｉ／Ｆデバイス１３は、Ｉ／Ｏデバイスと呼ばれてもよい。Ｉ／Ｆデバイス１３に接続されるデバイスは、記憶装置１４に限られない。Ｉ／Ｆデバイス１３（例えば１３ａ）は、リソースを有し、リソースには、そのＩ／Ｆデバイス１３に関連付けられている複数のキュー（例えば２０ａ及び２０ｂ）にそれぞれ対応付けられた複数のレジスタ２１（例えば２１ａ及び２１ｂ）が設けられる。レジスタ２１は、Ｉ／Ｆデバイス１３のリソースに設けられた記憶領域の一例である。
【００２８】
プロセッサ１１は、メモリ１２ａに記憶されているコンピュータプログラムを実行する。プロセッサ１１は、Ｉ／Ｆデバイス１３へコマンドなどのデータを送信したり、Ｉ／Ｆデバイス１３からコマンド結果などのデータを受信したりする。プロセッサの一例としては、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）及びＬＳＩ（Ｌａｒｇｅ−Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｅｄ  ｃｉｒｃｕｉｔ）などがある。
【００２９】
メモリ１２ａには、プロセッサ１１及びＩ／Ｆデバイス１３などからアクセスされるコンピュータプログラム及びデータなどが格納される。メモリ１２ａの一例としては、ＤＲＡＭ（Ｄｙｎａｍｉｔｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＭＲＡＭ（Ｍａｇｎｅｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）及びＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などがある。
【００３０】
メモリ１２ａは、Ｉ／Ｆデバイス１３毎に、Ｉ／Ｆデバイス１３に関連付けられたキューセット（複数のキュー２０）を有する。図２の例によれば、Ｉ／Ｆデバイス１３ａに対して、キュー２０ａ及び２０ｂが関連付けられており、Ｉ／Ｆデバイス１３ｂに対して、キュー２０ｃ及び２０ｄが関連付けられている。いずれのＩ／Ｆデバイス１３についても、関連付けられているキュー２０の数は、いずれかのキュー２０に割り当てられ得るプロセッサ１１の数より少なくてよい。また、キュー２０の数は、全てのＩ／Ｆデバイス１３について同じでもよいし異なっていてもよい。
【００３１】
メモリ１２ａは、複数のプロセス３１（例えば３１ａ〜３１ｄ）と、プロセススケジューラ３２と、Ｉ／Ｏ制御部３３と、キュー制御部３４と、キュー割当部３５とを記憶する。これらの要素３１〜３５は、プログラムであって、プロセッサ１１によって読み出されて実行されてよい。Ｉ／Ｏ制御部３３と、キュー制御部３４及びキュー割当部３５とが、それぞれ、複数のプロセッサ１１の各々で実行されてもよいし、Ｉ／Ｏ制御部３３が、複数のプロセッサ１１の各々で実行され、キュー制御部３４及びキュー割当部３５のうちの少なくとも一方が、複数のプロセッサ１１とは別のプロセッサ（図示せず）により実行されてもよい。
【００３２】
メモリ１２ａは、キュー管理テーブル１００と、プロセッサ別Ｉ／Ｏ数テーブル１２０とを記憶する。これらの要素１００、１２０は、データであって、プロセッサ１１で実行されるプログラム３１〜３５によって読み出されたり、書き換えられたりしてよい。
【００３３】
プロセス３１は、プロセッサ１１で実行されるプログラムである。１つのプロセス３１は、複数のプロセッサ１１の内の１つのプロセッサ１１で実行される。
【００３４】
プロセススケジューラ３２は、各プロセッサ１１における各プロセス３１の処理時間をスケジューリングする。プロセススケジューラ３２は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）の機能として提供され、プロセス３１は、そのＯＳ上で実行されてよい。
【００３５】
Ｉ／Ｏ制御部３３は、プロセス３１のＩ／Ｏを制御する。例えば、Ｉ／Ｏ制御部３３は、プロセス３１から発行されたコマンドを解析して、所定のキュー２０に格納したり、Ｉ／Ｆデバイス１３から発行されたコマンド結果を、プロセス３１に通知したりする。
【００３６】
キュー制御部３４は、キュー２０を制御する。キュー制御部３４は、プロセッサ１１がＩ／Ｆデバイス１３へデータを送信する際、そのＩ／Ｆデバイス１３に関連付いているキュー２０にデータを格納する。キュー制御部３４は、共有キュー２０にデータを格納する際、排他処理を行う。例えば、排他処理は、（１）共有キュー２０が他のプロセッサ１１からロックされていないことを確認すること、（２）ロックがされていないことの確認が取れたら共有キュー２０を他のプロセッサ１１から書き込みできないようにロックすること、（３）共有キュー２０へのデータの書き込みが完了した場合にロックを解除すること、を含んだ処理である。
【００３７】
キュー制御部３４は、専有キュー２０にデータを格納する際、上述の排他処理を行わない。すなわち、キュー制御部３４は、キュー２０のロック及びロック解除を行うこと無く、専有キュー２０にデータを格納する。
【００３８】
Ｉ／Ｆデバイス１３は、自己のレジスタ２１を参照し、そのレジスタ２１に対応付けられているキュー２０からＦＩＦＯでデータを取得する。そして、Ｉ／Ｆデバイス１３は、その取得したデータを、例えば、記憶装置１４に送信する。
【００３９】
キュー割当部３５は、キュー２０とプロセッサ１１との対応関係を制御する。具体的には、キュー割当部３５は、専有キュー２０に割り当てられる１つのプロセッサ１１を決定したり、共有キュー２０に割り当てられる２以上のプロセッサ１１を決定したりする。又は、キュー割当部３５は、複数のキュー２０の内、何れを専有キューとするか（何れを共有キューとするか）を決定してもよい。
【００４０】
キュー管理テーブル１００は、Ｉ／Ｆデバイス１３とキュー２０との対応関係と、キュー２０とプロセッサ１１との対応関係と、キュー２０のモード（専有キュー又は共有キュー）と、を管理するためのテーブルである。キュー管理テーブル１００の詳細については後述する（図３参照）。
【００４１】
プロセッサ別Ｉ／Ｏ数テーブル１２０は、プロセッサ１１がＩ／Ｆデバイス１３に対して発行したＩ／Ｏ要求の数を管理するためのテーブルである。プロセッサ別Ｉ／Ｏ数テーブル１２０の詳細については後述する（図４参照）。
【００４２】
図３は、キュー管理テーブル１００の構成例を示す。
【００４３】
キュー管理テーブル１００は、Ｉ／Ｆデバイス１３とキュー２０との対応関係と、キュー２０とプロセッサ１１との対応関係と、キュー２０のモード（専有キュー又は共有キュー）と、を管理する。キュー管理テーブル１００は、例えば、キュー２０毎にレコードを有し、各レコードが、フィールド値として、デバイスＩＤ１０１と、キューＩＤ１０２と、プロセッサＩＤ１０３と、モード１０４とを有する。
【００４４】
デバイスＩＤ１０１は、キュー２０が関連付けられているＩ／Ｆデバイス１３を識別するための情報である。キューＩＤ１０２は、キュー２０を識別するための情報である。プロセッサＩＤ１０３は、キュー２０に割り当てられているプロセッサ１１を識別するための情報である。
【００４５】
モード１０４は、キュー２０が「専有キュー」であるか「共有キュー」であるかを示す情報である。モード１０４は、「専有」の場合は「ＯＮ」、「共有」の場合は「ＯＦＦ」とするフラグであってもよい。
【００４６】
図３に示すキュー管理テーブル１００の例によれば、次のことがわかる。すなわち、デバイスＩＤ１０１「Ｄ１」のＩ／Ｆデバイス１３ａには、キューＩＤ１０２「Ｑ１」及び「Ｑ２」のキュー２０ａ、２０ｂが関連付けられている。そして、キューＩＤ１０２「Ｑ１」のキュー２０ａは、「専有キュー」（１０４）であり、プロセッサＩＤ１０３「Ｕ１」に割り当てられている。キューＩＤ１０２「Ｑ２」のキュー２０ｂは、「共有キュー」（１０４）であり、プロセッサＩＤ１０３「Ｕ２」及び「Ｕ３」のプロセッサ１１ｂ、１１ｃに割り当てられている。
【００４７】
図４は、プロセッサ別Ｉ／Ｏ数テーブル１２０の構成例を示す。
【００４８】
プロセッサ別Ｉ／Ｏ数テーブル１２０は、プロセッサ１１がＩ／Ｆデバイス１３に対して発行したＩ／Ｏ要求の数を管理するためのテーブルである。
【００４９】
プロセッサ別Ｉ／Ｏ数テーブル１２０は、プロセッサ１１毎にレコードを有し、各レコードが、フィールド値として、プロセッサＩＤ１２１と、デバイスＩＤ１２２と、Ｉ／Ｏ数１２３とを有する。プロセッサＩＤ１２１及びデバイスＩＤ１２２は、図３で説明したとおりである。
【００５０】
Ｉ／Ｏ数１２３は、プロセッサ１１がＩ／Ｆデバイス１３に対して所定期間に発行したＩ／Ｏ要求の数である。Ｉ／Ｏ数１２３は、ＩＯＰＳ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ  Ｐｅｒ  Ｓｅｃｏｎｄ）であってもよい。また、Ｉ／Ｏ数１２３において、シーケンシャルアクセスに係るＩ／Ｏ要求と、ランダムアクセスに係るＩ／Ｏ要求とが区別されてもよい。
【００５１】
図４に示すプロセッサ別Ｉ／Ｏ数テーブル１２０の例によれば、次のことがわかる。すなわち、プロセッサＩＤ１２１「Ｕ１」のプロセッサ１１ａは、デバイスＩＤ１２２「Ｄ１」のＩ／Ｆデバイス１３ａに対して、所定期間に「４３１回」のＩ／Ｏ要求を発行した。プロセッサＩＤ１２１「Ｕ１」のプロセッサ１１ａは、デバイスＩＤ１２２「Ｄ２」のＩ／Ｆデバイス１３ｂに対して、所定期間に「５回」のＩ／Ｏ要求を発行した。
【００５２】
図５は、Ｉ／Ｏ要求をキュー２０に格納する処理の例を示すフローチャートである。
【００５３】
Ｉ／Ｏ制御部３３は、Ｉ／Ｏ要求を発行したプロセッサ１１のプロセッサＩＤを特定する（Ｓ１０１）。そして、Ｉ／Ｏ制御部３３は、Ｉ／Ｏ要求が指定するＩ／Ｆデバイス１３のデバイスＩＤを特定する（Ｓ１０２）。
【００５４】
次に、Ｉ／Ｏ制御部３３は、キュー管理テーブル１００から、その特定したデバイスＩＤ１０１に対応するキューＩＤ１０２を特定する。そして、Ｉ／Ｏ制御部３３は、キュー管理テーブル１００から、その取得したキューＩＤ１０２に対応するモード１０４を特定する（Ｓ１０３）。
【００５５】
次に、Ｉ／Ｏ制御部３３は、その特定したモード１０４が「専有」又は「共有」の何れであるかを判定する（Ｓ１０４）。
【００５６】
Ｓ１０４で特定したモード１０４が「共有」の場合（Ｓ１０４：共有）、Ｉ／Ｏ制御部３３は、次の処理を行う。すなわち、Ｉ／Ｏ制御部３３は、Ｓ１０３において特定したキューＩＤ１０２の共有キュー２０をロックし（Ｓ１０５）、その後、その共有キュー２０にＩ／Ｏ要求を格納する（Ｓ１０６）。そして、Ｉ／Ｏ制御部３３は、共有キュー２０のロックを解除し（Ｓ１０７）、本処理を終了する。すなわち、Ｉ／Ｏ制御部３３は、共有キュー２０に対して排他処理を行う。
【００５７】
Ｓ１０４で取得したモードが「専有」の場合（Ｓ１０４：専有）、Ｉ／Ｏ制御部３３は、その専有キュー２０にＩ／Ｏ要求を格納し（Ｓ１１１）、本処理を終了する。すなわち、Ｉ／Ｏ制御部３３は、専有キュー２０に対して排他処理を行わない。よって、専有キュー２０が利用される方が、共有キュー２０が利用される場合よりも、プロセッサ１１の処理負荷が小さくなる。
【００５８】
図６は、専有キュー２０を何れのプロセッサ１１に割り当てるかを決定する処理の例を示すフローチャートである。
【００５９】
本処理は、Ｉ／Ｆデバイス１３に関する複数のキュー２０の内、専有キューとして利用されるキューの数が決まっている場合の例である。また、本処理は、１つのＩ／Ｆデバイス１３に対する処理の例である。ストレージシステム１ａが複数のＩ／Ｆデバイス１３を備える場合、Ｉ／Ｆデバイス１３毎に本処理が実行される。以下、１つのＩ／Ｆデバイス１３を例に取り、図６の説明において、そのＩ／Ｆデバイス１３を「対象Ｉ／Ｆデバイス」と言う。
【００６０】
キュー割当部３５は、専有キュー２０毎にループＡの処理を実行する。以下、１つのループＡの処理を例に取り、そのループＡの処理の対象となる専有キュー２０を「対象専有キュー」という。対象Ｉ／Ｆデバイス１３に関連付けられている複数のキュー２０の内、何れのキューが専有キューであるかは、キュー管理テーブル１００のデバイスＩＤ１０１及びモード１０４を参照することによりわかる。
【００６１】
次に、キュー割当部３５は、ループＡの処理において、プロセッサ１１のそれぞれについて、ループＢの処理を実行する。以下、１つのループＢの処理を例に取り、そのループＢの処理の対象となるプロセッサ１１を「対象プロセッサ」という。
【００６２】
次に、キュー割当部３５は、プロセッサ別Ｉ／Ｏ数テーブル１２０を参照し、現状における対象Ｉ／Ｆデバイス１３に関する排他数を算出する（Ｓ２０３）。ここで算出した排他数を「前排他数」という。
【００６３】
排他数とは、対象Ｉ／Ｆデバイス１３に関連付けられているキュー２０に、プロセッサ１１から発行されたＩ／Ｏ要求を格納するにあたって、排他処理が実行された回数を示す。すなわち、専有キュー２０にＩ／Ｏ要求が格納された場合、排他数はカウントされず、共有キュー２０にＩ／Ｏ要求が格納された場合、排他数はカウントされる。現状におけるＩ／Ｆデバイス１３に関する排他数は、対象Ｉ／Ｆデバイス１３に関連付けられている全ての共有キュー２０にそれぞれ対応したＩ／Ｏ数１２３の合計であってもよい。また、排他数は、共有キュー２０にＩ／Ｏ要求が格納される頻度という観点から「共有頻度」と呼ばれてもよい。
【００６４】
前排他数は、次のように算出される。すなわち、例えば、図３のキュー管理テーブル１００に示すように、デバイスＩＤ１０１「Ｄ１」の対象Ｉ／Ｆデバイス１３ａには、キューＩＤ１０２「Ｑ１」の専有キュー２０ａと、キューＩＤ１０２「Ｑ２」の共有キュー２０ｂとが関連付けられている。そして、専有キュー２０ａには、プロセッサＩＤ１０３「Ｕ１」のプロセッサ１１ａが割り当てられており、共有キュー２０ｂには、プロセッサＩＤ１０３「Ｕ２」及び「Ｕ３」のプロセッサ１１ｂ及び１１ｃが割り当てられている。そして、図４のプロセッサ別Ｉ／Ｏ数テーブル１２０に示すように、プロセッサＩＤ１２１「Ｕ１」のプロセッサ１１ａから、デバイスＩＤ１２２「Ｄ１」のＩ／Ｆデバイス１３ａに対するＩ／Ｏ数１２３は「４３１回」である。プロセッサＩＤ１２１「Ｕ２」のプロセッサ１１ｂから、Ｉ／Ｆデバイス１３ａに対するＩ／Ｏ数１２３は「１９回」である。プロセッサＩＤ１２１「Ｕ３」のプロセッサ１１ｃから、Ｉ／Ｆデバイス１３ａに対するＩ／Ｏ数１２３は「２回」である。この場合、対象Ｉ／Ｆデバイス１３ａに関する前排他数は、共有キュー２０ｂに割り当てられているプロセッサ１１ｂ、１１ｃからのＩ／Ｏ数１２３の合計「１９＋２＝２１」となる。
【００６５】
次に、キュー割当部３５は、対象専有キューに対象プロセッサ１１を割り当てたと仮定した場合における、対象Ｉ／Ｆデバイスに関する排他数を算出（推定）する（Ｓ２０４）。ここで算出した排他数を「後排他数」という。
【００６６】
前排他数は、次のように算出される。すなわち、例えば、仮に、専有キュー２０ａにプロセッサ１１ｂを割り当てた場合、元々専有キュー２０ａに割り当てられていたプロセッサ１１ａは、共有キュー２０ｂに割り当てられることになる。したがって、Ｉ／Ｆデバイス１３ａ（デバイスＩＤ「Ｄ１」）に関する後排他数は、共有キュー２０ｂに割り当てられることになるプロセッサ１１ａ（プロセッサＩＤ「Ｕ１」）及びプロセッサ１１ｃ（プロセッサＩＤ「Ｕ３」）のＩ／Ｏ数１２３の合計「４３１＋２＝４３３」となる。
【００６７】
次に、キュー割当部３５は、後排他数と前排他数との差Ｚ１が所定の閾値Ｃ１（Ｃ１は０以下の値）未満であるか否かを判定する（Ｓ２０５）。つまり、キュー割当部３５は、「Ｚ１（＝後排他数−前排他数）＜閾値Ｃ≦０」であるか否かを判定する。
【００６８】
Ｓ２０５の判定が肯定的な場合（Ｓ２０５：ＹＥＳ）、キュー割当部３５は、対象専有キューに、対象専用キューに割り当てられていたプロセッサに代えて対象プロセッサ１１を割り当てる（Ｓ２１０）。すなわち、キュー割当部３５は、キュー管理テーブル１００において、キューＩＤ１０２が対象専有キューと一致するレコードにおけるプロセッサＩＤ１０３を、対象プロセッサ１１に更新する処理を行う。なぜなら、対象専有キューに対象プロセッサ１１を割り当てた方が、Ｉ／Ｆデバイス１３に関する排他数が減少する可能性が高いと考えられるからである。そして、キュー割当部３５は、ループＢの処理を抜ける。
【００６９】
Ｓ２０５の判定が否定的な場合（Ｓ２０５：ＮＯ）、キュー割当部３５は、次の処理を行う。キュー割当部３５は、全てのプロセッサ１１についてループＢの処理を完了した場合、ループＢの処理を抜け、まだ未処理のプロセッサ１１が残っている場合、ループＢの処理を繰り返す。すなわち、キュー割当部３５は、対象専有キューに割り当てるプロセッサ１１を現状のままとする。なぜなら、対象専有キューに割り当てるプロセッサ１１を変更しても、Ｉ／Ｆデバイス１３に関する排他数が減少する可能性が低いと考えられるからである。
【００７０】
キュー割当部３５は、ループＢの処理を抜けた後、次の処理を行う。キュー割当部３５は、Ｉ／Ｆデバイスに関する全ての専有キューについてループＡの処理を完了した場合、ループＡの処理を抜けて本処理を終了し、まだ未処理の専有キューが残っている場合、ループＡの処理を繰り返す。
【００７１】
図７は、Ｉ／Ｆデバイス１３に関連付けられている複数のキューの内、何れを専有キューとするかを決定する処理の例を示すフローチャートである。
【００７２】
本処理は、Ｉ／Ｆデバイス１３に関連付けられている複数のキューの内、専有キューとして利用されるキューの数が決まっていない場合の例である。すなわち、本処理の場合、必要に応じて専有キューの数が増減し得る。また、本処理は、１つのＩ／Ｆデバイス１３に対する処理の例である。ストレージシステム１ａが複数のＩ／Ｆデバイス１３を備える場合、Ｉ／Ｆデバイス１３毎に本処理が実行される。キュー割当部３５は、図６に示す処理と図７に示す処理の何れかを採用しても良いし、所定のタイミングで図６に示す処理と図７に示す処理とを切り替えても良い。以下、１つのＩ／Ｆデバイス１３を例に取り、図７の説明において、そのＩ／Ｆデバイス１３を「対象Ｉ／Ｆデバイス」という。
【００７３】
キュー割当部３５は、キュー管理テーブル１００及びプロセッサ別Ｉ／Ｏ数テーブル１２０を参照し、対象Ｉ／Ｆデバイスに関連付いている各キュー２０の利用指標を算出する（Ｓ３０１）。ここで算出した利用指標を、「前利用指標」という。利用指標とは、キュー２０がプロセッサ１１にどのように利用されているか（つまり、キューの利用態様）を示す指標である。利用指標は、キュー２０に割り当てられているプロセッサ１１の数と、各プロセッサ１１からそのキュー２０に発行されたＩ／Ｏ数とに基づいて算出されてよい。利用指標は、キュー２０に発行されたＩ／Ｏ数が多くなると、大きくなる値であってよい。反対に、利用指標は、キュー２０に割り当てられているプロセッサ１１の数が多くなると、小さくなる値であってよい。例えば、利用指標は、キュー２０に割り当てられている各プロセッサ１１からそのキュー２０に発行されたＩ／Ｏ数の合計が、そのキュー２０に割り当てられているプロセッサ数の逆数によって重み付けされた値であってよい。この観点から、「利用指標」は、１のキュー２０における１のプロセッサ１１あたりの利用負荷指標と定義されてもよい。
【００７４】
例えば、キュー２０に割り当てられているプロセッサ１１の数が１つの場合に対する係数を「２．０」、プロセッサ１１の数が２つの場合に対する係数を「１．５」、プロセッサ１１の数が３つの場合に対する係数を「１．０」とする。そして、図３のキュー管理テーブル１００に示すように、デバイスＩＤ１０１「Ｄ２」のＩ／Ｆデバイス１３ｂに関連付いているキューＩＤ１０２「Ｑ３」のキュー２０ｃには、プロセッサＩＤ１０３「Ｕ３」のプロセッサ１１ｃだけが割り当てられている。そして、図４のプロセッサ別Ｉ／Ｏ数テーブル１２０に示すように、プロセッサ１１ｃ（プロセッサＩＤ１２１「Ｕ３」）からデバイスＩＤ１２２「Ｄ２」のＩ／Ｆデバイス１３ｂに発行されたＩ／Ｏ数１２３は「１１回」である。この場合、キュー２０ｃの前利用指標は、「２．０×１１＝２２」と算出されてよい。
【００７５】
また、デバイスＩＤ「Ｄ２」のＩ／Ｆデバイス１３ｂに関連付いているキューＩＤ１０２「Ｑ４」のキュー２０ｄには、プロセッサＩＤ１０３「Ｕ１」及び「Ｕ２」のプロセッサ１１ａ及び１１ｂが割り当てられている。そして、プロセッサ１１ａ及び１１ｂからキュー２０ｄに発行されたＩ／Ｏ数１２３は、それぞれ「５回」及び「１８９回」である。この場合、キュー２０ｄの前利用指標は、「１．５×（５＋１８９）＝２９１」と算出されてよい。
【００７６】
次に、キュー割当部３５は、各キューの中から、前利用指標が最大のキュー（「第１のキュー」という）と、前利用指標が最小のキュー（「第２のキュー」という）を特定する（Ｓ３０２）。つまり、第１のキューは、少数のプロセッサ１１から多数のＩ／Ｏ要求を受けているキューであるといえる。第２のキューは、多数のプロセッサ１１から少数のＩ／Ｏ要求を受けているキューであるといえる。上記の例において、キュー２０ｃの前利用指標は「２２」、キュー２０ｄの前利用指標は「２９１」であるので、キュー割当部３５は、第１のキューとしてキュー２０ｄを特定し、第２のキューとしてキュー２０ｃを特定する。
【００７７】
次に、キュー割当部３５は、Ｉ／Ｆデバイス１３にＩ／Ｏ要求を発行する複数のプロセッサ１１の中から、キューの割当の変更について検討するプロセッサ１１を選択する。例えば、キュー割当部３５は、プロセッサ別Ｉ／Ｏ数テーブル１２０を参照し、第１のキューに割り当てられている複数のプロセッサ１１の中で、Ｉ／Ｏ数１２３が最小のプロセッサ１１を選択してもよい（Ｓ３０３）。上記の例において、キュー割当部３５は、第１のキュー２０ｄ（キューＩＤ「Ｑ４」）に割り当てられているプロセッサ１１ａ及び１１ｂ（プロセッサＩＤ「Ｕ１」及び「Ｕ２」）の中から、Ｉ／Ｏ数１２３が最小のプロセッサ１１ａ（プロセッサＩＤ「Ｕ１」）を選択する。
【００７８】
次に、キュー割当部３５は、キュー管理テーブル１００及びプロセッサ別Ｉ／Ｏ数テーブル１２０を参照し、選択プロセッサ１１（Ｓ３０３で選択したプロセッサ）を第２のキューに割り当てたと仮定した場合における各キューの利用指標を算出（推定）する（Ｓ３０４）。ここで算出した利用指標を、「後利用指標」という。
【００７９】
第２のキューに選択プロセッサ１１を割り当てたと仮定した場合、第１のキューの後利用指標は、選択プロセッサ１１の割り当てが解除される分、係数が大きくなり（プロセッサ数が減少するため）、Ｉ／Ｏ数が減少する。一方、第２のキューの後利用指標は、選択プロセッサ１１が割り当てられる分、係数が小さくなり（プロセッサ数が増加するため）、Ｉ／Ｏ数が増加する。
【００８０】
上記の例の場合、第２のキュー２０ｃに選択プロセッサ１１ａを割り当てた場合、第２のキュー２０ｃに、プロセッサ１１ａ、１１ｃ（プロセッサＩＤ「Ｕ１」、「Ｕ３」）が割り当てられることとなる。よって、第２のキュー２０ｃの後利用指標は、「１．５×（５＋１１）＝２４」と算出される。一方、第１のキュー２０ｄには、プロセッサ１１ｂ（プロセッサＩＤ「Ｕ２」）だけが割り当てられることとなる。よって、第１のキュー２０ｄの後利用指標は、「２．０×１８９＝３７８」と算出される。
【００８１】
次に、キュー割当部３５は、第１のキューの後利用指標が、第２のキューの後利用指標以上であるか否かを判定する（Ｓ３０５）。すなわち、キュー割当部３５は、仮に第２のキューに選択プロセッサ１１を割り当てた場合において、第１のキューと第２のキューとの間における利用指標の大小関係が逆転するか否かを判定する。
【００８２】
第１のキューの後利用指標が第２のキューの後利用指標よりも小さい場合（Ｓ３０５：ＮＯ）、キュー割当部３５は、本処理を終了する。すなわち、キュー割当部３５は、第１のキューと第２のキューとの間において利用指標の大小関係が逆転する等により利用指標の差が一定以上減少しない場合、キューに対する選択プロセッサ１１の割り当てを変更しない。なぜなら、変更したとしても、Ｉ／Ｆデバイス１３に関連付いているキュー２０の全体における排他処理の発生回数が減少する可能性が低いからである。
【００８３】
第１のキューの後利用指標が第２のキューの後利用指標以上である場合（Ｓ３０５：ＹＥＳ）、キュー割当部３５は、キュー割り当て変更処理を実行し（Ｓ３１０）、本処理を終了する。すなわち、キュー割当部３５は、第１のキューと第２のキューとの間において利用指標の大小関係が逆転等せずに利用指標の差が一定以上減少する場合、本処理を終了する。キュー割り当て変更処理（Ｓ３１０）の詳細については後述する（図８参照）。上記の例の場合、第１のキュー２０ｄの後利用指標は「３７８」、第２のキュー２０ｃの後利用指標は「２４」と算出されるので、キュー割当部３５は、キュー割り当て変更処理（Ｓ３１０）を実行する。
【００８４】
図８は、キュー割り当て変更処理の例を示すフローチャートである。本処理は、図７のＳ３１０に相当する。
【００８５】
キュー割当部３５は、第２のキューに選択プロセッサ１１を割り当てる（Ｓ４０１）。上記の例の場合、キュー割当部３５は、キュー管理テーブル１００において、選択プロセッサＩＤ１０３「Ｕ１」を、キューＩＤ１０２「Ｑ４」との対応関係から、キューＩＤ１０２「Ｑ３」（第２のキュー）との対応関係へ変更する。
【００８６】
次に、キュー割当部３５は、第１のキューに割り当てられているプロセッサを特定する（Ｓ４０２）。上記の例の場合、キュー割当部３５は、キュー管理テーブル１００において、キューＩＤ１０２「Ｑ４」（第１のキュー）と対応関係を有するプロセッサＩＤ１０３「Ｕ２」を特定する。
【００８７】
そして、キュー割当部３５は、第１のキューに割り当てられているプロセッサの数が「１」であるか否かを判定する（Ｓ４０３）。
【００８８】
第１のキューに割り当てられているプロセッサの数が「１」でない場合（Ｓ４０３：ＮＯ）、キュー割当部３５は、そのままＳ４１０へ進む。つまり、キュー割当部３５は、キュー管理テーブル１００において、第１のキューのモード１０４を「共有」のままとする。
【００８９】
第１のキューに割り当てられているプロセッサの数が「１」である場合（Ｓ４０３：ＹＥＳ）、キュー割当部３５は、第１のキューを専有キューに変更する（Ｓ４０４）。つまり、キュー割当部３５は、キュー管理テーブル１００において、第１のキューのモード１０４を「専有」に変更する。そして、キュー割当部３５は、Ｓ４１０へ進む。
【００９０】
上記の例の場合、第１のキュー２０ｄ（キューＩＤ１０２「Ｑ４」）と対応関係を有するプロセッサの数は「１」（プロセッサＩＤ「Ｕ２」のみ）となるので、キュー割当部３５は、キュー管理テーブル１００において、キューＩＤ１０２「Ｑ４」のモード１０４を「専有」に変更する。
【００９１】
次に、キュー割当部３５は、第２のキューに割り当てられているプロセッサを特定する（Ｓ４１０）。上記の例の場合、キュー割当部３５は、キュー管理テーブル１００において、第２のキュー２０ｃ（キューＩＤ１０２「Ｑ３」）と対応関係を有するプロセッサＩＤ１０３「Ｕ１」及び「Ｕ３」を特定する。
【００９２】
そして、キュー割当部３５は、第２のキューに割り当てられているプロセッサの数が「２以上」であるか否かを判定する（Ｓ４１１）。
【００９３】
第２のキューに割り当てられているプロセッサの数が「２以上」でない場合（Ｓ４１１：ＮＯ）、キュー割当部３５は、本処理を終了し、図７に示す処理へ戻る。つまり、キュー割当部３５は、キュー管理テーブル１００において、第２のキューのモード１０４を「専有」のままとする。
【００９４】
第２のキューに割り当てられているプロセッサの数が「２以上」である場合（Ｓ４１１：ＹＥＳ）、キュー割当部３５は、第２のキューのモード１０４を「共有」に変更する（Ｓ４１２）。そして、キュー割当部３５は、本処理を終了し、図７に示す処理に戻る。
【００９５】
上記の例の場合、第２のキュー２０ｃ（キューＩＤ１０２「Ｑ３」）と対応関係を有するプロセッサの数は「２」（プロセッサＩＤ「Ｕ１」及び「Ｕ３」）となるので、キュー割当部３５は、キュー管理テーブル１００において、キューＩＤ１０２「Ｑ３」のモード１０４を「共有」に変更する。
【００９６】
以上の第１の実施形態の説明によれば、例えば以下の説明をできる。
【００９７】
コントローラ２ａ（例えば、プロセッサ１１で実行されるキュー制御部３４（図２参照））は、Ｉ／Ｆデバイス１３に関連付けられているキュー２０に対するＩ／Ｏを制御する。コントローラ２ａは、複数のプロセッサ１１の各々のＩ／Ｆデバイス１３に対するデータの発行頻度に基づいて、専有キュー２０ａに割り当てられるプロセッサ１１（「第１のプロセッサ」）を決定してよい。第１のプロセッサとされるプロセッサ１１は、複数のプロセッサ１１の内、Ｉ／Ｆデバイス１３に対するデータの発行頻度が最大のプロセッサ１１であってよい。これにより、Ｉ／Ｆデバイス１３に対するデータの発行頻度が最大のプロセッサ１１から発行されるデータについて、排他処理が不要となる。
【００９８】
コントローラ２ａは、共有キューにデータが格納される頻度である共有頻度に関する所定の条件が満たされた場合、共有キュー２０ｂに割り当てられているプロセッサ（この段落で「第２のプロセッサ」）１１を、専有キュー２０ａに割り当てられているプロセッサ（この段落で「第１のプロセッサ」）１１に代えて専有キュー２０ａに割り当て、且つ、第２のプロセッサに代えて第１のプロセッサを共有キュー２０ｂに割り当てる割当て切替えを実行してもよい。これにより、排他処理の発生状況が変化した場合に、専有キュー２０ａに割り当てるプロセッサを変更することができる。
【００９９】
所定の条件は、後共有頻度が前共有頻度よりも所定の閾値以上小さいことであってよい。ここで、後共有頻度とは、第２プロセッサを第１プロセッサに代えて専有キュー２０ａに割り当て、且つ、第２プロセッサに代えて第１プロセッサを共有キュー２０ｂに割り当てる割当て切替えを実行したと仮定した場合の共有頻度（共有キューにデータが格納される頻度）であってよい。前共有頻度とは、その割当て切替え前の共有頻度であってよい。これにより、排他処理の発生状況が変化した場合に、専有キュー２０ａに、排他処理を発生させる可能性のより高いプロセッサ１１を割り当てることができる。結果として、キュー２０の全体における排他処理の発生回数を減少させることができる。
【０１００】
コントローラ２ａは、複数のキュー２０の各々について、専有及び共有の何れのキュー種別であるかを管理し、共有のキューについては、そのキューにロックをかけることを含んだ排他処理を行ってそのキューにデータを格納し、専有のキューについては、排他処理無しにそのキューにデータを格納してよい。また、コントローラ２ａは、複数のプロセッサと複数のキューとの割当関係を繰り返し更新してよい。そして、コントローラ２ａは、キューに割り当てられているプロセッサ数が１つだけになった場合に、そのキューのキュー種別を共有から専有に変更してよい。
【０１０１】
コントローラ２ａは、複数のキューの内の利用負荷指標が最大のキューである第１のキューについて、そのキューのキュー種別を、共有から専有に変更するか否か判定してよい。ここで、利用負荷指標とは、キューにおける１のプロセッサあたりの利用負荷の大きさを示す指標であって、そのキューに割り当てられているプロセッサ数が多くなると小さくなり、各プロセッサからそのキューにデータが格納された頻度が大きくなると大きくなる値であってよい。
【０１０２】
コントローラ２ａは、上記の第１のキューに割り当てられている複数のプロセッサ１１の内、その第１のキューにデータを格納する頻度が最小のプロセッサ１１を、複数のキューの内の利用負荷指標が最小のキューである第２のキューに割り当てる割当て切替えを実行したと仮定した場合の第１のキューの利用負荷指標及び第２のキューの利用負荷指標をそれぞれ推定し、その推定した第１のキューの利用負荷指標が、その推定された第２のキューの利用負荷指標よりも大きい場合に、第２のキューに最小のプロセッサを割り当てる割当て切替えを実行してもよい。
＜第２の実施形態＞
【０１０３】
以下、第２の実施形態を説明する。その際、第１の実施形態の相違点を主に説明し、第１の実施形態との共通点については説明を省略又は簡略する。
【０１０４】
図９は、第２の実施形態に係るストレージシステム１ｂの動作概要を示す。
【０１０５】
第２の実施形態に係るストレージシステム１ｂは、複数のプロセッサ１１と、メモリ１２ｂと、Ｉ／Ｆデバイス１３（例えば１３ｂ）と、キュー２０（例えば２０ｃ及び２０ｄ）とを有する。しかし、ストレージシステム１ｂは、専有キュー２０とプロセッサ１１との割当て関係を変更せず、Ｉ／Ｏ要求を発行するプロセス３１を、適切なプロセッサ１１に移動させる。
【０１０６】
コントローラ２ｂは、プロセス３１のプロセッサ１１への配置を制御する。プロセス３１から発行されたデータは、そのプロセス３１を実行するプロセッサ１１が割り当てられているキュー２０に格納される。そこで、コントローラ２ｂは、Ｉ／Ｆデバイス１３に対するデータの発行頻度に基づいて、専有キュー２０に割り当てられている第１のプロセッサ１１で実行されるプロセス３１を決定してもよい。これにより、排他処理を発生させる可能性のより高いプロセス３１を、専有キュー２０ａに割り当てられているプロセッサ１１で実行することができる。つまり、キュー２０の全体における排他処理の発生回数が減少し得る。
【０１０７】
コントローラ２ｂは、専有キューに割り当てられていて負荷が所定の閾値未満であるプロセッサ（この段落で「第１のプロセッサ」）１１に、共有キューに割り当てられているプロセッサ（この段落で「第２のプロセッサ」）１１で実行されている１以上のプロセス３１を移動させるプロセス移動を実行したと仮定した場合の排他数（共有キューで排他処理が発生する回数）を推定する。コントローラ２ｂは、その推定した排他数が、プロセス移動前の排他数よりも所定の閾値以上小さい場合、そのプロセス移動を実行してもよい。これにより、排他処理の発生状況が変化した場合、排他処理を発生させる可能性のより高いプロセス３１を、専有キュー２０ａに割り当てられているプロセッサ１１に移動させることができる。
【０１０８】
図９において、ストレージシステム１ｂは、Ｉ／Ｆデバイス１３ｂに関連するキュー２０ｃ、２０ｄを有する。キュー２０ｃは「専有キュー」であり、キュー２０ｄは「共有キュー」である。専有キュー２０ｃには、プロセッサ１１ｃが割り当てられている。共有キュー２０ｄには、プロセッサ１１ａ及び１１ｃが割り当てられている。また、プロセッサ１１ａではプロセス３１ａが実行されており、プロセッサ１１ｂではプロセス３１ｂが実行されており、プロセッサ１１ｃではプロセス３１ｃが実行されている。
【０１０９】
その後、プロセス３１ａ、３１ｂ及び３１ｃの中で、プロセス３１ｂのＩ／Ｆデバイス１３ｂに対するデータの発行頻度が最大になった場合、次の処理が行われて良い。すなわち、コントローラ１ｂは、プロセス３１ｂを、専有キュー２０ｃに割り当てられているプロセッサ１１ｃへ移動させ、プロセス３１ｃを、共有キュー２０ｄに割り当てられているプロセッサ１１ｂへ移動させる。これにより、共有キュー２０ｄにデータが格納される頻度が減少し、その結果、排他処理の実行される回数も減少する。
【０１１０】
図１０は、第２の実施形態に係るストレージシステム１ｂの構成例を示す。
【０１１１】
コントローラ１ｂのメモリ１２ｂにおいて、キュー割当部３５に代えて、プロセス配置部３７が記憶される。プロセス配置部３７は、プロセス３１を実行するプロセッサ１１を決定する。プロセス配置部３７は、プロセス３１を実行するプロセッサ１１を変更する。すなわち、プロセス配置部３７は、或るプロセッサ１１で実行されているプロセス３１を、別のプロセッサ１１へ移動させることができる。
【０１１２】
また、プロセッサ別Ｉ／Ｏ数テーブル１４０の構成は、第１の実施形態でのプロセッサ部Ｉ／Ｏ数テーブル１２０の構成と異なる。プロセス別Ｉ／Ｏ数テーブル１４０は、プロセス３１がＩ／Ｆデバイス１３に対して発行したＩ／Ｏ要求の数を管理するためのテーブルである。プロセス別Ｉ／Ｏ数テーブル１４０は、プロセス３１が実行されているプロセッサ１１と、プロセッサ１１の使用率とを合わせて管理しても良い。プロセス別Ｉ／Ｏ数テーブル１４０の詳細については後述する（図１１参照）。
【０１１３】
図１１は、プロセス別Ｉ／Ｏ数テーブル１４０の構成例を示す。
【０１１４】
プロセス別Ｉ／Ｏ数テーブル１４０は、プロセス３１がＩ／Ｆデバイス１３に対して発行したＩ／Ｏ要求の数を管理する。さらに、プロセス別Ｉ／Ｏ数テーブル１４０は、プロセス３１が処理されているプロセッサ１１と、プロセッサ１１の使用率も管理する。
【０１１５】
プロセス別Ｉ／Ｏ数テーブル１４０は、例えば、プロセス３１毎にレコードを有し、各レコードが、フィールド値として、プロセスＩＤ１４１と、プロセッサＩＤ１４２と、プロセッサ使用率１４３と、デバイスＩＤ１４４と、Ｉ／Ｏ数１４５とを有する。
【０１１６】
プロセスＩＤ１４１は、プロセス３１を識別するための情報である。プロセッサＩＤ１４２及びデバイスＩＤ１４４は、図３において説明したとおりである。Ｉ／Ｏ数１４５は、図４において説明したとおりである。
【０１１７】
図１１に示すプロセス別Ｉ／Ｏ数テーブル１４０の例によれば、次のことがわかる。すなわち、プロセスＩＤ１４１「１００１」のプロセス３１ａは、プロセッサＩＤ１４２「Ｕ１」のプロセッサ１１ａで実行されている。そのプロセッサＩＤ１４２「Ｕ１」のプロセッサ使用率１４３は「３６％」である。プロセスＩＤ１４１「１００１」のプロセス３１は、デバイスＩＤ１４４「Ｄ１」のＩ／Ｆデバイス１３ａに対して、所定期間に「２４４回」（１４５）のＩ／Ｏ要求を発行し、デバイスＩＤ１４４「Ｄ２」のＩ／Ｆデバイス１４ｂに対して、所定期間に「５回」（１４５）のＩ／Ｏ要求を発行した。
【０１１８】
図１２は、プロセス３１を何れのプロセッサ１１で実行するかを決定する処理の例を示すフローチャートである。
【０１１９】
本処理は、Ｉ／Ｆデバイス１３に関する複数のキュー２０の内、専有キューとして利用されるキューの数が決まっている構成の例である。また、本処理は、１つのＩ／Ｆデバイス１３に対する処理の例である。ストレージシステム１ｂが複数のＩ／Ｆデバイス１３を備える場合、Ｉ／Ｆデバイス１３毎に本処理が実行される。以下、１つのＩ／Ｆデバイス１３を例に取り、図１２の説明において、そのＩ／Ｆデバイス１３を「対象Ｉ／Ｆデバイス」と言う。
【０１２０】
プロセス配置部３７は、プロセス３１毎にループＡの処理を実行する。以下、１つのループＡの処理を例に取り、そのループＡの処理の対象となるプロセス３１を「対象プロセス」という。どのようなプロセスが実行されているかについては、プロセススケジューラ３２に問い合わせることによりわかる。
【０１２１】
次に、プロセス配置部３７は、ループＡの処理において、プロセッサ１１のそれぞれについて、ループＢの処理を実行する。以下、１つのループＢの処理を例に取り、そのループＢの処理の対象となるプロセッサ１１を「対象プロセッサ」という。
【０１２２】
次に、キュー割当部３５は、プロセス別Ｉ／Ｏ数テーブル１４０を参照し、現状における対象Ｉ／Ｆデバイス１３に関する排他数（前排他数）を算出する（Ｓ６０３）。排他数については、図６において説明したとおりである。
【０１２３】
前排他数は、次のように算出される。すなわち、例えば、図３のキュー管理テーブル１００に示すように、デバイスＩＤ１０１「Ｄ２」の対象Ｉ／Ｆデバイス１３ｂには、キューＩＤ１０２「Ｑ３」の専有キュー２０ｃと、キューＩＤ１０２「Ｑ４」の共有キュー２０ｄとが関連付けられている。そして、専有キュー２０ｃには、プロセッサＩＤ「Ｕ３」のプロセッサ１１ｃに割り当てられており、共有キュー２０ｄには、プロセッサＩＤ「Ｕ１」及び「Ｕ２」のプロセッサ１１ａ及び１１ｂが割り当てられている。そして、図１１のプロセス別Ｉ／Ｏ数テーブル１４０に示すように、プロセッサ１１ａ（プロセッサＩＤ１４２「Ｕ１」）で実行されているプロセスＩＤ１４１「１００１」のプロセス３１ａから、デバイスＩＤ１４４「Ｄ２」のＩ／Ｆデバイス１３ｂに対するＩ／Ｏ数１４５は「５回」である。プロセッサ１１ｂ（プロセッサＩＤ１４２「Ｕ２」）で実行されているプロセスＩＤ１４１「１００２」のプロセス３１ｂから、デバイスＩＤ１４４「Ｄ２」のＩ／Ｆデバイス１３ｂに対するＩ／Ｏ数１４５は「１８９回」である。プロセッサ１１ｃ（プロセッサＩＤ１４２「Ｕ３」）で実行されているプロセスＩＤ１４１「１００３」のプロセス３１ｃから、デバイスＩＤ１４４「Ｄ２」のＩ／Ｆデバイス１３ｂに対するＩ／Ｏ数１４５は「１１回」である。この場合、対象Ｉ／Ｆデバイス１３ｂに関する前排他数は、共有キュー２０ｄが割り当てられているプロセッサ１１ａ及び１１ｂで実行されているプロセス３１ａ及び３１ｂのＩ／Ｏ数１４５の合計「５＋１８９＝１９４」となる。
【０１２４】
次に、プロセス配置部３７は、対象プロセッサ１１に対象プロセス３１を移動させた場合における、対象Ｉ／Ｆデバイス１３に関する排他数（後排他数）を算出する（Ｓ６０４）。
【０１２５】
前排他数は、次のように算出される。すなわち、例えば、プロセス３１ｂをプロセッサ１１ｂからプロセッサ１１ｃに移動させたと仮定した場合、プロセッサ１１ｃが割り当てられているキュー２０ｃは、プロセス３１ｂ及び３１ｃから利用されることになる。したがって、Ｉ／Ｆデバイス１３ｂ（デバイスＩＤ「Ｄ２」）に関する後排他数は、共有キュー２０ｄに割り当てられているプロセッサ１１ａで実行されているプロセス３１ａ（プロセスＩＤ「１００１」）のＩ／Ｏ数１４５の「５」となる。
【０１２６】
次に、プロセス配置部３７は、後排他数と前排他数との差Ｚ２が所定の閾値Ｃ２（Ｃ２は０以下の値）未満であり、且つ、対象プロセッサ使用率１４３が閾値Ｃ３未満であるか否かを判定する（Ｓ６０５）。つまり、「Ｚ２（＝後排他数−前排他数）＜閾値Ｃ２≦０」であり、且つ、「対象プロセッサ使用率１４３＜閾値Ｃ３」であるか否かを判定する。
【０１２７】
Ｓ６０５の判定が肯定的な場合（Ｓ６０５：ＹＥＳ）、プロセス配置部３７は、対象プロセス３１を対象プロセッサ１１に移動させる（Ｓ６１０）。このとき、プロセス配置部３７は、プロセス別Ｉ／Ｏ数テーブル１４０において、対象プロセスＩＤ１４１に対象プロセッサＩＤを対応付けるように更新する。なぜなら、プロセス３１の移動先のプロセッサ１１の使用率にも余裕があり、且つ、プロセス３１を移動させた方が、Ｉ／Ｆデバイス１３に関連する排他数が減少する可能性が高いと考えられるからである。そして、プロセス配置部３７は、ループＢの処理を抜ける。
【０１２８】
Ｓ６０５の判定が否定的な場合（Ｓ６０５：ＮＯ）、プロセス配置部３７は、次の処理を行う。プロセス配置部３７は、全てのプロセッサ１１についてループＢの処理を完了した場合、ループＢの処理を抜け、まだ未処理のプロセッサ１１が残っている場合、ループＢの処理を繰り返す。すなわち、プロセス配置部３７は、対象プロセス３１を移動させず、現状のままとする。なぜなら、プロセス３１の移動先のプロセッサ１１の使用率に余裕が無い、又は、プロセス３１を移動してもＩ／Ｆデバイス１３に関する排他数が減少する可能性が低いと考えられるからである。
【０１２９】
プロセス配置部３７は、ループＢの処理を抜けた後、次の処理を行う。プロセス配置部３７は、全てのプロセス３１についてループＡの処理を完了した場合、ループＡの処理を抜けて本処理を終了し、まだ未処理のプロセス３１が残っている場合、ループＡの処理を繰り返す。
【０１３０】
複数のプロセッサのそれぞれでプロセスを実行することによりデータが発行されるようになっている第２の実施形態の説明によれば、例えば以下の説明をできる。
【０１３１】
コントローラ２ｂは、複数のプロセスにそれぞれ対応した複数のデータ発行頻度に基づいて、専有キューに割り当てられている第１のプロセッサで実行するプロセスを決定する。ここで、プロセスのデータ発行頻度は、そのプロセスがＩ／Ｆデバイスへデータを発行した頻度である。また、コントローラ２ｂは、その複数のデータ発行頻度のうち最大のデータ発行頻度に対応したプロセスを、専有キューに割り当てられている第１のプロセッサで実行するプロセスとしてよい。これにより、Ｉ／Ｆデバイス１３に対するデータの発行頻度が最大のプロセス３１から発行されるデータについて、排他処理が不要となる。
【０１３２】
コントローラ２ｂは、共有キューにデータが格納される頻度である共有頻度及び第１のプロセッサの負荷に関する所定の条件が満たされた場合、いずれかの第２のプロセッサである対象第２プロセッサで実行されているプロセスを、第１のプロセッサに移動させるプロセス移動を実行する。コントローラ２ｂは、所定の条件として、後共有頻度が前共有頻度よりも所定の閾値以上小さく、且つ、第１のプロセッサの負荷が所定の閾値未満であることを設定してもよい。ここで、後共有頻度とは、第２のプロセッサで実行されているプロセスを第１のプロセッサに移動させるプロセス移動を実行したと仮定した場合の共有頻度であってよい。そして、前共有頻度とは、プロセス移動前の共有頻度であってよい。これにより、排他処理の発生状況が変化した場合に、専有キュー２０に割り当てられており、且つ、負荷が所定未満のプロセッサ１１に、排他処理を発生させる可能性のより高いプロセス３１を実行させることができる。結果として、プロセッサの負荷を考慮しつつ、キュー２０の全体における排他処理の発生回数を減少させることができる。
【０１３３】
上述した実施形態は、本発明の説明のための例示であり、本発明の範囲をそれらの実施形態にのみ限定する趣旨ではない。当業者は、本発明の要旨を逸脱することなしに、他の様々な態様で本発明を実施することができる。例えば、コントローラ２は、複数のプロセッサ１１を含み、メモリ１２及びＩ／Ｆデバイス１３は、コントローラ２の外に設けられていてもよい。
【０１３４】
例えば、複数のプロセッサ１１は、一つの集積回路に含まれる複数のコア（マルチコア）であってもよい。例えば、複数のプロセッサ１１は、マルチスレッドＣＰＵにおける複数のスレッドであってもよい。
【符号の説明】
【０１３５】
１ａ、１ｂ：ストレージシステム  １１ａ、１１ｂ、１１ｃ：プロセッサ  １２ａ、１２ｂ：メモリ  １３ａ、１３ｂ：Ｉ／Ｆデバイス  ２０ａ、２０ｂ、２０ｃ、２０ｄ：キュー
【図１】
2016067339.tif 000003
【図２】
2016067339.tif 000004
【図３】
2016067339.tif 000005
【図４】
2016067339.tif 000006
【図５】
2016067339.tif 000007
【図６】
2016067339.tif 000008
【図７】
2016067339.tif 000009
【図８】
2016067339.tif 000010
【図９】
2016067339.tif 000011
【図１０】
2016067339.tif 000012
【図１１】
2016067339.tif 000013
【図１２】
2016067339.tif 000014
【国際調査報告】
2016067339.tif 000015
2016067339.tif 000016
2016067339.tif 000017