(57)【特許請求の範囲】
【請求項１】
第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させる情報処理装置であって、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集する収集部と、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定する決定部と、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出する遷移速度算出部と、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出する成長時間算出部と、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、前記決定部によって決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する予測部と、をそなえる、情報処理装置。
【請求項２】
第１タイミングで、前記決定部によって決定された前記移動対象の単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する一方、前記第１タイミングとは異なる第２タイミングで、前記予測部によって予測された前記遷移先単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する移動部をそなえる、請求項１に記載の情報処理装置。
【請求項３】
前記複数の単位領域のそれぞれには、前記複数の単位領域の配置順に対応して変化する昇順または降順の数値が、各単位領域を特定する識別情報として割り当てられ、
前記遷移速度算出部は、
前記アクセスログから、前記所定タイミング毎に、前記複数の単位領域のうちアクセス数が最大の単位領域の識別情報を抽出し、
前記所定タイミング毎に抽出された複数の識別情報の数値から、前後する二つの識別情報の数値の差が所定範囲内である、連続する二以上の識別情報の数値を含むグループが抽出された場合、前記グループの終点における前記識別情報の数値と前記グループの始点における前記識別情報の数値との差分と、前記グループの始点から終点までに要する経過時間と、に基づき、前記遷移速度を算出する、請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記成長時間算出部は、
前記アクセスログから、前記所定タイミング毎に、ＩＯ数の大きい上位ｎ個の単位領域の識別情報及びアクセス数を抽出し、
前記アクセスログから、最新の所定タイミングでアクセス数が最大の単位領域の最新識別情報を抽出し、
前記所定タイミング毎に抽出された前記上位ｎ個の単位領域の識別情報及びアクセス数を参照することで、前記最新の所定タイミングよりも前のタイミングにおいて、前記最新識別情報の単位領域のアクセス数が前記所定値を超える最古の所定タイミングを求め、
前記最新の所定タイミングと前記最古の所定タイミングとの差分時間に基づき、前記成長時間を算出する、請求項３に記載の情報処理装置。
【請求項５】
前記予測部は、下記計算式によって、前記遷移先単位領域の識別情報の数値を算出し、前記遷移先単位領域を予測する、請求項４に記載の情報処理装置。
[前記遷移先単位領域の識別情報の数値]
＝[前記移動対象の単位領域の識別情報の数値]
+([現在時刻]-[前記移動対象の単位領域の移動時刻]+[前記成長時間])*[前記遷移速度]
【請求項６】
第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させるコンピュータに、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集し、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定し、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出し、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出し、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する、
処理を実行させる、ストレージ制御プログラム。
【請求項７】
コンピュータが、第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させるストレージ制御方法であって、
前記コンピュータが、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集し、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定し、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出し、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出し、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する、ストレージ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本件明細書に開示の発明は、情報処理装置、ストレージ制御プログラム、及びストレージ制御方法に関する。
【背景技術】
【０００２】
データを格納するストレージシステムとして、複数の記憶媒体（記憶装置）を組み合わせた階層ストレージシステムが用いられることがある。複数の記憶媒体としては、例えば高速アクセスが可能であるが比較的低容量で高価格なＳＳＤ（Solid State Drive）、及び大容量で低価格であるが比較的低速なＨＤＤ（Hard Disk Drive）が挙げられる。
【０００３】
階層ストレージシステムでは、アクセス頻度が低い記憶領域のデータをＨＤＤに配置する一方、アクセス頻度が高い記憶領域のデータをＳＳＤに配置することで、ＳＳＤの使用効率を高め、システム全体の性能を高めることができる。従って、階層ストレージシステムの性能を向上させるには、アクセス頻度が高い記憶領域のデータを効率的にＳＳＤに配置することが望ましい。
【０００４】
アクセス頻度が高いデータをＳＳＤに配置する手法としては、例えば、前日のアクセス頻度に応じて、１日単位でアクセス頻度が高い領域をＳＳＤに配置する手法が知られている。
【０００５】
しかし、ファイル共有等に用いられるストレージシステムへのアクセスパターンにおいては、数分から数十分程度の比較的短時間に記憶領域の狭い範囲へＩＯ（Input Output）要求（以下、単にＩＯと表記する場合がある）が集中し、時間とともに別の領域に移動することがある。このようなワークロードでは、１日等の長い期間のアクセス頻度の集計では追従できない場合が多い。ワークロードとは、記憶装置へのアクセス分布（記憶装置の利用状況）を表す指標であり、時間の経過と記憶装置のオフセット位置（記憶領域）とに応じて変化する。
【０００６】
短時間に負荷が移動するワークロードに対応する技術として、ＩＯ集中の発生を監視し、ＩＯ集中が発生する都度、ＩＯ集中が発生した領域をＨＤＤからＳＳＤへ移動する技術が知られている（例えば、特許文献１参照）。この技術では、ＩＯ集中が収束したら、ＳＳＤに移動した領域をＨＤＤへ移動してＳＳＤ領域を空けておくことで、次のＩＯ集中が発生した領域を速やかにＳＳＤに移動させることができる。また、このとき、高負荷領域の近傍の領域を繋ぎ合わせた領域を移動対象領域として決定する技術も知られている（例えば、特許文献２参照）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１４−１６４５１０号公報
【特許文献２】特開２０１４−１９１５０３号公報
【特許文献３】特開２０１４−２２９１４４号公報
【特許文献４】特開２０１３−１７１３０５号公報
【特許文献５】特開平９−２１４９３５号公報
【特許文献６】特開２００３−２１６４６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ところで、ＩＯ集中が発生する都度、ＩＯ集中が発生した領域のデータをＨＤＤからＳＳＤへ移動する技術に加え、近い将来ＩＯが集中する領域を予測しＩＯが集中する前に当該領域のデータをＳＳＤへ移動する、予測移動と呼ばれる技術も知られている。
【０００９】
しかし、現状の予測移動技術において、ＩＯ集中領域を予測するために用いられるパラメータは、事前にワークロードを分析して得られ、静的に設定されるので、遷移するＩＯ集中領域を精度よく予測して追従することができない。これに伴い、ＩＯが集中する前にＩＯ集中領域のデータをＳＳＤに適切に移動することができず、予測移動による性能向上を期待できない場合がある。
【００１０】
１つの側面で、本件明細書に開示の発明は、アクセスが集中する領域を精度よく予測し当該領域のデータを適切に移動することで、予測移動による性能向上を実現することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様において、本件の情報処理装置は、第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させるもので、収集部、決定部、遷移速度算出部、成長時間算出部、及び予測部を有する。前記収集部は、前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集する。前記決定部は、前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定する。前記遷移速度算出部は、前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出する。前記成長時間算出部は、前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出する。前記予測部は、前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、前記決定部によって決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する。
【発明の効果】
【００１２】
アクセスが集中する領域を精度よく予測し当該領域のデータを適切に移動することで、予測移動による性能向上を実現することができる。
【図面の簡単な説明】
【００１３】
【図１】一実施形態の一例としての階層ストレージシステムの構成例を示す図である。
【図２】ＩＯＤＢのデータ構造の一例を示す図である。
【図３】移動制御部による制御の一例を説明する図である。
【図４】階層テーブルのデータ構造の一例を示す図である。
【図５】ワークロードの分析例を示す図である。
【図６】ワークロードの分析例を示す図である。
【図７】ワークロードの分析例並びに遷移速度及び成長時間を説明する図である。
【図８】ワークロードの分析例および予測移動制御の処理手順の一例を説明する図である。
【図９】移動制御部による予測移動制御の処理手順の一例を説明する図である。
【図１０】予測セグメントのデータ構造の一例を示す図である。
【図１１】移動制御部及び観測処理部による観測移動制御の処理手順の一例を説明する図である。
【図１２】一実施形態に係る動的階層制御におけるＳＳＤの消費量と平均応答時間との関係の一例を、所定の閾値ごとに示した図である。
【図１３】図１２に示すワークロードにおけるＳＳＤ消費量の一例を示す図である。
【図１４】移動制御部及び観測処理部による観測移動制御の処理手順の一例を説明する図である。
【図１５】データ収集部によるデータ収集処理及びワークロード分析部によるパラメータ更新処理の動作例を説明するフローチャートである。
【図１６】遷移速度算出部による遷移速度の算出手法を説明する図である。
【図１７】遷移速度算出部による遷移速度の算出手法を説明する図である。
【図１８】遷移速度算出部による遷移速度の算出手法を具体的に説明する図である。
【図１９】成長時間算出部による成長時間の算出手法を具体的に説明する図である。
【図２０】遷移速度算出部による遷移速度の算出手順の一例を説明するフローチャートである。
【図２１】成長時間算出部による成長時間の算出手順の一例を説明するフローチャートである。
【図２２】ワークロード分析部による移動判定処理の動作例を説明するフローチャートである。
【図２３】移動制御部による予測移動制御処理の動作例を説明するフローチャートである。
【図２４】移動制御部による観測移動制御処理の動作例を説明するフローチャートである。
【図２５】移動指示部による移動指示通知処理の動作例を説明するフローチャートである。
【図２６】観測処理部による観測処理の動作例を説明するフローチャートである。
【図２７】階層ドライバの移動処理部による転送開始処理の動作例を説明するフローチャートである。
【図２８】階層ドライバの移動処理部による転送完了処理の動作例を説明するフローチャートである。
【図２９】ＩＯマップ部によるＩＯ受信処理の動作例を説明するフローチャートである。
【図３０】図１に示す階層ストレージ制御装置のハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１４】
以下、図面を参照して本発明の実施の形態を説明する。ただし、以下に説明する実施形態は、あくまでも例示であり、以下に明示しない種々の変形や技術の適用を排除する意図はない。すなわち、本実施形態を、その趣旨を逸脱しない範囲で種々変形して実施することができる。なお、以下の実施形態で用いる図面において、同一符号を付した部分は、特に断らない限り、同一若しくは同様の部分を表す。
【００１５】
〔１〕一実施形態
〔１−１〕階層ストレージシステムの構成例
図１は一実施形態の一例としての階層ストレージシステム１の構成例を示す図である。図１に示すように、階層ストレージシステム１は、例示的に、階層ストレージ制御装置１０、１以上（図１では１つ）のＳＳＤ２０、及び１以上（図１では１つ）のＨＤＤ３０をそなえることができる。
【００１６】
階層ストレージシステム１は、複数の記憶装置をそなえるストレージ装置の一例である。階層ストレージシステム１は、ＳＳＤ２０及びＨＤＤ３０等の互いに性能の異なる複数の記憶装置を搭載し、図示しないホスト装置に対して階層化された記憶装置の記憶領域を提供することができる。一例として、階層ストレージシステム１は、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）を用いて複数の記憶装置にデータを分散又は冗長化した状態で保存し、ホスト装置に対してＲＡＩＤグループに基づく１以上のストレージボリューム（ＬＵＮ；Logical Unit Number）を提供することができる。
【００１７】
階層ストレージ制御装置１０は、ネットワークを介したホスト装置等からのユーザＩＯに応じて、ＳＳＤ２０及びＨＤＤ３０へのリード又はライト等の種々のアクセスを行なうことができる。階層ストレージ制御装置１０としては、ＰＣ（Personal Computer）やサーバ、又はコントローラモジュール（ＣＭ；Controller Module）等の情報処理装置（コンピュータ）が挙げられる。
【００１８】
また、一実施形態に係る階層ストレージ制御装置１０は、ユーザＩＯのアクセス頻度に応じて、アクセス頻度が低い領域をＨＤＤ３０に配置する一方、アクセス頻度が高い領域をＳＳＤ２０に配置する、動的階層制御を行なうことができる。このように、階層ストレージ制御装置１０は、ＳＳＤ２０とＨＤＤ３０との間で、複数のセグメント（単位領域）におけるデータを移動させる情報処理装置の一例である。
【００１９】
なお、階層ストレージ制御装置１０はＬｉｎｕｘ（登録商標）に実装されているモジュール（プログラム）であるｄｅｖｉｃｅ−ｍａｐｐｅｒの機能を用いることができる。例えば階層ストレージ制御装置１０は、動的階層制御において、ｄｅｖｉｃｅ−ｍａｐｐｅｒによりストレージボリュームをセグメント（サブＬＵＮ；sub_LUN）単位で監視し、高負荷となったセグメントのデータをＨＤＤ３０からＳＳＤ２０へ移動することで高負荷セグメントへのＩＯを処理することができる。
【００２０】
ここで、セグメントは、ストレージボリュームを所定のサイズで分割した領域であり、動的階層制御における階層移動の最小単位の領域（単位領域）である。例えばセグメントは１ＧＢ（Byte）程度のサイズとすることができる。
【００２１】
ＳＳＤ２０は、種々のデータやプログラム等を格納する記憶装置の一例であり、ＨＤＤ３０は、ＳＳＤ２０とは異なる性能の（例えばより低速な）記憶装置の一例である。一実施形態において、互いに異なる記憶装置（以下、便宜上、第１及び第２の記憶装置と表記する場合がある）として、ＳＳＤ２０等の半導体ドライブ装置及びＨＤＤ３０等の磁気ディスク装置をそれぞれ例に挙げているが、これらに限定されるものではない。第１及び第２の記憶装置として、例えばリード／ライトの速度差等の互いに性能差のある種々の記憶装置が用いられてもよい。
【００２２】
ＳＳＤ２０及びＨＤＤ３０は、ストレージボリューム上のセグメントのデータを格納可能な記憶領域を含み、階層ストレージ制御装置１０は、セグメント単位でＳＳＤ２０−ＨＤＤ３０間の領域移動を制御することができる。
【００２３】
なお、図１の例では、階層ストレージシステム１がそれぞれ１つのＳＳＤ２０及びＨＤＤ３０をそなえるものとしているが、これに限定されるものではなく、複数のＳＳＤ２０及び複数のＨＤＤ３０をそなえてもよい。
【００２４】
〔１−２〕階層ストレージ制御装置の機能構成例
次に、階層ストレージ制御装置１０の機能構成例について説明する。
図１に示すように、階層ストレージ制御装置１０は、例示的に、階層管理部１１、階層ドライバ１２、ＳＳＤドライバ１３、及びＨＤＤドライバ１４をそなえることができる。なお、階層管理部１１はユーザ空間で実行されるプログラムとして実現され、階層ドライバ１２、ＳＳＤドライバ１３、及びＨＤＤドライバ１４はＯＳ（Operating System）空間で実行されるプログラムとして実現されてよい。
【００２５】
階層管理部１１は、ストレージボリュームについてトレースされたＩＯの情報に基づいて、領域移動を行なうセグメントを判定し、判定したセグメントのデータの移動を階層ドライバ１２に指示することができる。ＩＯのトレースでは、ブロックＩＯレベルでのＩＯをトレースするコマンドであるｂｌｋｔｒａｃｅが用いられてよい。なお、ｂｌｋｔｒａｃｅに代えて、ディスクＩＯの利用状況を確認するコマンドであるｉｏｓｔａｔが用いられてもよい。ｂｌｋｔｒａｃｅ及びｉｏｓｔａｔはＯＳ空間で実行される。
【００２６】
階層管理部１１は、例示的に、データ収集部１１ａ、ＩＯＤＢ（Database）１１ｂ、ワークロード分析部１１ｃ（遷移速度算出部１１ｈおよび成長時間算出部１１ｉ）、移動指示部１１ｄ、及び移動制御部１１ｅとしての機能をそなえることができる。これらの機能は、階層ストレージ制御装置１０におけるＣＰＵ１０ａ（図３０参照）がストレージ制御プログラム１００（図３０参照）を実行することで実現可能になっている。
【００２７】
データ収集部１１ａは、ｂｌｋｔｒａｃｅを用いてトレースされたＩＯの情報を所定間隔（例えば１分間隔）で収集及び集計して、集計結果をタイムスタンプとともにＩＯＤＢ１１ｂへ、アクセスログとして格納することができる。
【００２８】
データ収集部１１ａによるＩＯの情報の集計は、収集したＩＯの情報に基づいて、セグメントごとに、例えばセグメントを特定する情報及びＩＯ数の集計を含んでよい。
【００２９】
ＩＯＤＢ１１ｂは、データ収集部１１ａにより集計されたセグメントごとのＩＯ数に関する情報を記憶するものであり、例えば図示しないメモリ等により実現される。
【００３０】
図２は、図１に示すＩＯＤＢ１１ｂの一例を示す図である。図２に示すように、ＩＯＤＢ１１ｂは、セグメントごとに、セグメントを特定する情報、ＩＯ数、及びタイムスタンプ（timestamp）を対応させて記憶してよい。一例として、ＩＯＤＢ１１ｂには、セグメ
ント“０”について、合計ＩＯ数“1000”、タイムスタンプ“1”が設定されている。
【００３１】
このように、データ収集部１１ａは、複数のセグメントのそれぞれについてのアクセスログ（ＩＯ数）を、一定時間間隔（例えば１分間隔）の所定タイミング毎に収集する収集部の一例である。
【００３２】
なお、セグメントを特定する情報として、セグメントの番号（ＩＤ；Identifier）を用いているが、これに代えてストレージボリュームの先頭オフセットが用いられてもよい。ＩＯ数は、セグメントに対して１分間に行なわれたＩＯの合計数（ｉｏｐｍ；IO per minute）である。タイムスタンプは、時刻を識別する識別子であり、例えば時刻そのものが設定されてもよい。以下では、セグメントを特定するセグメントの番号を、セグメントＩＤ、sub_LUN_IDもしくはseg_idと表記する場合がある。
【００３３】
ワークロード分析部１１ｃは、ＩＯＤＢ１１ｂが記憶するセグメントから、ＳＳＤ２０又はＨＤＤ３０にデータを移動するセグメントを選択し、選択したセグメントに関する情報を移動指示部１１ｄ又は移動制御部１１ｅへ通知することができる。
【００３４】
一例として、ワークロード分析部１１ｃは、ＳＳＤ２０にデータを移動するセグメントとして、セグメント数が同時に階層移動を行なう最大のセグメント数（所定数）に達するまで、ＩＯ数が多い順にセグメントを抽出することができる。
【００３５】
ワークロード分析部１１ｃによるセグメントの抽出は、ＩＯ数又はアクセスの集中率（全体に対するＩＯ数の割合）が所定の閾値よりも高いセグメントを抽出することを含んでもよい。また、セグメントの抽出は、ＨＤＤ３０にデータを移動するセグメントとして、例えばＩＯ数が上記所定数に入らなかった、又はＩＯ数若しくはアクセスの集中率が所定の閾値以下となった、ＳＳＤ２０上のセグメントを抽出することを含んでもよい。
【００３６】
さらに、セグメントの抽出は、上記のＳＳＤ２０又はＨＤＤ３０にデータを移動するセグメントの抽出条件に所定回数以上連続して該当したときに、当該セグメントを、ＳＳＤ２０又はＨＤＤ３０にデータを移動するセグメントとして抽出することを含んでもよい。なお、上記ＩＯ数等の他に、リードライト比（ｒｗ比）に基づいてセグメントが選択されてもよい。
【００３７】
ここで、ワークロード分析部１１ｃは、移動指示部１１ｄに対して、ＨＤＤ３０内のセグメントについてＳＳＤ２０への階層移動を指示した後、移動制御部１１ｅに対して、ＳＳＤ２０内の他のセグメントについてＨＤＤ３０への階層移動を指示することができる。一方、ワークロード分析部１１ｃは、或るセグメントについてＳＳＤ２０への階層移動を行なっている間に当該セグメントへの負荷が下がると予測される場合には、当該セグメントについてはＨＤＤ３０への階層移動を抑制し、他のセグメントについてＨＤＤ３０への階層移動を指示してもよい。
【００３８】
例えば、ワークロード分析部１１ｃは、スパイクの平均余命時間と階層移動にかかる時間とに基づいて、階層移動中のセグメントへの負荷が下がるか否かを判断できる。なお、スパイクとは、一部のセグメントに負荷が集中することであり、平均余命時間は、負荷が継続する継続時間から既に実行済みの実行時間を減じた時間であり、ワークロードに応じて定まる値である。管理者等は予め平均余命時間を求め、階層ストレージ制御装置１０に設定しておくことができる。
【００３９】
具体的には、ワークロード分析部１１ｃは、ＳＳＤ２０にデータを移動するセグメントを抽出し、抽出したセグメントについてＳＳＤ２０にデータを移動するコスト（時間）を計算する。そして、ワークロード分析部１１ｃは、平均余命時間が移動時間以下になる場合には、ＨＤＤ３０からＳＳＤ２０への階層移動を行なわずに、ＳＳＤ２０からＨＤＤ３０への階層移動を行なうと判断することができる。
【００４０】
このようなワークロード分析部１１ｃの処理は、所定のタイミングで行なわれてよいが、期間によってはＨＤＤ３０からＳＳＤ２０へ移動するセグメント又はＳＳＤ２０からＨＤＤ３０へ移動するセグメントが抽出及び通知されない場合もある。この場合、ワークロード分析部１１ｃは、移動制御部１１ｅに対して通知を行なわなくてもよいし、セグメントを選択しなかった旨を通知してもよい。なお、所定のタイミングには、例えば１分ごと等の所定の周期で到来するタイミングが含まれてよい。
【００４１】
このように、ワークロード分析部１１ｃは、所定のタイミングで、ＨＤＤ３０におけるセグメントごとのＩＯ数（アクセスログ）に基づき、複数のセグメントの中から、アクセスが集中する集中状態の単位領域を、ＨＤＤ３０からＳＳＤ２０への移動対象の単位領域として決定する決定部の一例である。また、この決定部としてのワークロード分析部１１ｃは、ＳＳＤ２０の記憶領域を第１のサイズで分割した複数のセグメントの中から、ＨＤＤ３０へデータを移動させる移動対象の単位領域を決定することができる。ワークロード分析部１１ｃは、決定した単位領域の移動を移動指示部１１ｄへ指示することができる。
【００４２】
さらに、ワークロード分析部１１ｃは、例示的に、遷移速度算出部１１ｈ及び成長時間算出部１１ｉをそなえることができる。
【００４３】
遷移速度算出部１１ｈは、一定時間間隔の所定タイミング毎に、ＩＯＤＢ１１ｂに保存されるアクセスログに基づき、複数のセグメントにおける、アクセス集中状態のセグメントの遷移速度を算出する。算出された遷移速度は、例えば図示しないメモリ等に設定登録され保存される。遷移速度や、その算出手法／算出手順については、図８、図１６〜図１８及び図２０を参照しながら後述する。なお、以下では、遷移速度を“pm (proactive migration)_speed”と表記する場合がある。
【００４４】
成長時間算出部１１ｉは、一定時間間隔の所定タイミング毎に、ＩＯＤＢ１１ｂに保存されるアクセスログに基づき、所定タイミングでアクセス集中状態にあるセグメントが、アクセスのほぼ無い状態からアクセス集中状態になるまでに要する成長時間を算出する。アクセスのほぼ無い状態とは、例えば、当該セグメントに対する単位時間あたりのアクセス数（ＩＯ数）が所定値以下の状態と定義される。ここで、例えば、単位時間は６０秒、所定値は２０とすることが考えられるが、これらの値に限定されるものではない。算出された成長時間は、例えば図示しないメモリ等に設定登録され保存される。成長時間や、その算出手法／算出手順については、図８、図１９及び図２１を参照しながら後述する。なお、以下では、成長時間を“pm_growth”と表記する場合がある。なお、アクセス集中状態とは、例えば、当該セグメントに対する単位時間あたりのアクセス数（ＩＯ数）が、上記所定値よりも大きい異なる所定値以上の状態と定義してもよい。
【００４５】
移動指示部１１ｄは、ワークロード分析部１１ｃ又は移動制御部１１ｅからの指示に基づいて、階層ドライバ１２に、選択されたセグメントのデータの、ＨＤＤ３０からＳＳＤ２０への移動、又は、ＳＳＤ２０からＨＤＤ３０への移動を指示することができる。
【００４６】
移動指示部１１ｄによる移動の指示は、選択されたセグメントのストレージボリューム上のオフセットをＨＤＤ３０上のオフセットに変換して、セグメントごとにデータの移動を指示することを含んでよい。例えば、ＨＤＤ３０のセクタサイズが５１２Ｂである場合に、ボリューム上のオフセットが１ＧＢであれば、ＨＤＤ３０上でのオフセットは１×１０２４×１０２４×１０２４／５１２＝２０９７１５２となる。
【００４７】
移動制御部１１ｅは、上述したＩＯ数に基づくセグメントごとの階層移動時にユーザＩＯが発生した場合のＩＯレスポンスの劣化を防ぐために、図９を参照しながら後述する制御を行なうものである。移動制御部１１ｅは、例示的に、予測セグメントＤＢ１１ｆ及び移動キュー１１ｇをそなえることができる。
【００４８】
図３は移動制御部１１ｅによる制御の一例を説明する図である。図３において「ＩＯ分析による移動」の矢印で示すように、ＳＳＤ２０−ＨＤＤ３０間の階層移動は、ワークロード分析部１１ｃによるＩＯ数（アクセスログ）の分析によって行なわれる。移動制御部１１ｅは、ＩＯ分析による移動に加えて、予測移動（Proactive Migration）制御処理及び観測移動（Observational Migration）制御処理を行なうことができる。
【００４９】
予測移動制御では、ＩＯ分析によるＨＤＤ３０からＳＳＤ２０への移動に加えて、近い将来ＩＯが集中する（ＩＯ数が増加する）セグメントを予測し、ＩＯが集中する前に当該セグメントをＳＳＤ２０へ移動することができる。予測移動制御により、ＩＯが集中する前に当該セグメントのデータをＳＳＤ２０に移行できるため、ＩＯ数の分析によりＩＯが集中しているセグメントのデータを移行するよりもユーザＩＯへの影響を低減させることができる。このとき、本実施形態の予測移動制御では、図示しないメモリ等に登録保存された遷移速度および成長時間に基づき、アクセス集中状態のセグメントが、ワークロード１１ｃによって決定された移動対象のセグメントから遷移する遷移先セグメントが予測される。そして、予測された遷移先セグメントのデータが、ＳＳＤ２０に移動される。
【００５０】
観測移動制御では、ＩＯ分析によるＳＳＤ２０からＨＤＤ３０への移動の実行に先立って、セグメントサイズよりも十分小さなサイズでの階層移動を実行してＨＤＤ３０の負荷が低いタイミングを検出し、検出したタイミングでＩＯ分析による移動を行なうことができる。観測移動制御により、ＩＯ分析による移動対象のセグメントの決定直後に移動を実行するよりもユーザＩＯへの影響を低減させることができる。
【００５１】
予測移動制御及び観測移動制御の詳細については後述する。
【００５２】
階層ドライバ１２は、例示的に、ＩＯマップ部１２ａ、ＩＯキュー１２ｂ、階層テーブル１２ｃ、移動処理部１２ｄ、及び観測処理部１２ｅをそなえることができる。
【００５３】
ＩＯマップ部１２ａは、ホスト装置からのストレージボリュームに対するＩＯ要求を処理することができる。例えば、ＩＯマップ部１２ａは、階層テーブル１２ｃを用いてＩＯ要求をＳＳＤドライバ１３又はＨＤＤドライバ１４に振り分け、ＳＳＤドライバ１３又はＨＤＤドライバ１４からのＩＯレスポンスをホスト装置に返す処理を行なう。
【００５４】
ＩＯキュー１２ｂは、ＩＯ要求を一時的に格納するＦＩＦＯ（First-In First Out）構造の記憶領域であり、図示しないメモリ等により実現される。
【００５５】
一例として、階層移動中のセグメントに対してＩＯ要求が発行されると、ＩＯマップ部１２ａは、当該セグメントのデータの移動が完了するまで、当該ＩＯ要求をＩＯキュー１２ｂに格納し、ＩＯ要求を保留する。データの移動が完了すると、ＩＯマップ部１２ａは、ＩＯキュー１２ｂから当該ＩＯ要求を読み出して、ＳＳＤドライバ１３又はＨＤＤドライバ１４への振り分けを再開する。
【００５６】
階層テーブル１２ｃは、ＩＯマップ部１２ａによるＩＯ要求の振り分け及び移動処理部１２ｄ等による階層制御に用いられるテーブルであり、例えば図示しないメモリ等により実現される。
【００５７】
階層テーブル１２ｃのデータ構造の一例を図４に示す。図４に示すように、階層テーブル１２ｃは、ＳＳＤ２０にデータが移動されたセグメントごとに、ＳＳＤオフセットと、ＨＤＤオフセットと、状態とを対応させて記憶することができる。
【００５８】
ＳＳＤオフセットは、ＳＳＤ２０にデータが移動されたセグメントのＳＳＤ２０におけるオフセットを示す。ＳＳＤオフセットは、ボリューム上のセグメントサイズ（例えば１ＧＢ）に対応するオフセット“2097152”を単位とする固定値であり、例えば、“0”、“2097152”、“4194304”、“6291456”、．．．となる。
【００５９】
ＨＤＤオフセットは、ＳＳＤ２０にデータが移動されたセグメントのＨＤＤ３０におけるオフセットを示す。ＨＤＤオフセットの値“NULL”は、ＳＳＤオフセットで指定されるＳＳＤ２０の領域が未使用であることを示す。
【００６０】
状態は、セグメントの状態を示し、“allocated”、“Moving（HDD→SSD）”、“Moving（SSD→HDD）”、又は“free”を含む。“allocated”はセグメントがＳＳＤ２０に割り当てられていることを示し、“Moving（HDD→SSD）”はセグメントのデータがＨＤＤ３０からＳＳＤ２０に転送中であることを示す。“Moving（SSD→HDD）”はセグメントのデータがＳＳＤ２０からＨＤＤ３０に転送中であることを示し、“free”はＳＳＤオフセットで指定されるＳＳＤ２０の領域が未使用であることを示す。
【００６１】
ＩＯマップ部１２ａは、上述した階層テーブル１２ｃを参照することで、ＩＯ要求をＳＳＤドライバ１３又はＨＤＤドライバ１４のいずれに振り分けるかを判定することができるとともに、ＩＯ要求がセグメント移動中であるか否かを判定することができる。
【００６２】
移動処理部１２ｄは、移動指示部１１ｄからセグメント移動指示を受け取ると、ＨＤＤ３０又はＳＳＤ２０の移動対象の単位領域に記憶されたデータをＳＳＤ２０又はＨＤＤ３０に移動する移動処理を実行することができる。このとき、移動処理部１２ｄは、階層テーブル１２ｃを参照して、セグメントの移動指示で指定されたセグメントのデータをＳＳＤ２０−ＨＤＤ３０間で移動する。
【００６３】
より具体的に、移動処理部１２ｄは、セグメント移動指示を受け取ると、階層テーブル１２ｃ内のＨＤＤオフセットより“NULL”となっているエントリを探し、セグメント移動指示で指定されたＨＤＤオフセット情報と、状態とを登録する。なお、このとき登録される状態は、“Moving（HDD→SSD）”又は“Moving（SSD→HDD）”となる。そして、移動処理部１２ｄは、ＳＳＤ２０−ＨＤＤ３０間のデータの転送指示をｋｃｏｐｙｄに発行する。
【００６４】
また、移動処理部１２ｄは、ｋｃｏｐｙｄにより全ての領域内のデータの転送が完了すると、階層テーブル１２ｃから転送が完了したエントリを探し、状態が“Moving（HDD→SSD）”の場合、当該状態を“allocated”に変更する。一方、移動処理部１２ｄは、状態が“Moving（SSD→HDD）”である場合、当該状態を“free”に変更するとともに、対応するＨＤＤオフセットを“NULL”に設定する。
【００６５】
なお、ｋｃｏｐｙｄは、ｄｅｖｉｃｅ−ｍａｐｐｅｒに実装され、デバイス間のデータコピーを実行するモジュール（プログラム）であり、ＯＳ空間で実行される。
【００６６】
このように、移動指示部１１ｄ及び移動処理部１２ｄは、ワークロード分析部１１ｃ又は移動制御部１１ｅから指示された領域に記憶されたデータを、セグメントごとにＳＳＤ２０及びＨＤＤ３０間で移動する。
【００６７】
観測処理部１２ｅは、移動制御部１１ｅからの移動指示（観測移動指示）に応じて、ＳＳＤ２０からＨＤＤ３０へセグメントサイズよりも十分小さなサイズの階層移動を行ない、そのときのユーザＩＯレスポンスを観測することができる。
【００６８】
観測処理部１２ｅの詳細については後述する。
【００６９】
ＳＳＤドライバ１３は、階層ドライバ１２からの指示に基づいてＳＳＤ２０へのアクセスを制御する。ＨＤＤドライバ１４は、階層ドライバ１２からの指示に基づいてＨＤＤ３０へのアクセスを制御する。
【００７０】
〔１−３〕予測移動制御の説明
次に、図５〜図１０を参照して、予測移動制御の詳細について説明する。
【００７１】
Ｓａｍｂａ等のソフトウェアを実装したファイルシステムにおける一部のストレージワークロードの分析を行なうと、全ＩＯの半数以上が全記憶容量の数％未満の領域に１０〜５０分程度発生し、その後、別の領域に移動することが分かる。
【００７２】
図５は全容量が４．４ＴＢのシステムにおけるストレージワークロードの分析例を示す図である。図５に示すように、数ＧＢの範囲に全ＩＯの半数以上が１０〜５０分程度集中し、別の領域（ボリュームオフセット、ＬＢＡ；Logical Block Address）にそのＩＯ集中が移動することが分かる。
【００７３】
上述したワークロード分析部１１ｃを含むＩＯ分析では、図５に示すようなＩＯ集中をその都度抽出し、ＳＳＤ２０等の高速ストレージに移動することで性能向上を図ることができる。
【００７４】
図６は図５とは異なるストレージワークロードの分析例を示す図である。図６から、ＩＯ集中の発生するＬＢＡが時間経過とともに移動することが容易に読み取れる。また、このＬＢＡの移動速度は略等速度であることが分かる。
【００７５】
そこで、予測移動制御では、ＩＯ数の増加する（ＩＯの集中する）領域が時間とともに移動（遷移）することに着目し、当該領域の遷移速度及び成長時間に基づき近い将来ＩＯ集中が移動する領域を求め、ＩＯ集中が発生する前にＳＳＤ２０へ移動を行なうことができる。なお、以下では、ＩＯ集中をアクセス集中という場合がある。
【００７６】
このとき、ＩＯ分析による移動と予測移動制御による移動とを同時に行なうと、かえってユーザＩＯのレスポンスが悪化する可能性がある。そこで、ＩＯ分析による移動がないタイミングで予測移動制御を行なうことで、ＩＯレスポンスの悪化を回避することができる。
【００７７】
上述したように、予測移動は、現在アクセス集中の発生している領域がごく近い将来どのセグメント（sub_LUN）に遷移するのかを予測し、予測した遷移先セグメントのデータを、当該セグメントがアクセス集中状態になる前にＨＤＤ３０からＳＳＤ２０へ移動する機能である。当該機能により、遷移先セグメントでアクセス集中が発生する前に、当該遷移先セグメントのデータのＳＳＤ２０への移動が完了する。このため、セグメントの移動に伴うＩＯアクセス性能の低下はほとんど発生せず、遷移先セグメントに対するＩＯアクセスの発生当初からＳＳＤ２０でヒットする。したがって、予測移動によれば、大幅な性能向上を期待することができる。
【００７８】
本実施形態において、遷移先となるセグメント（sub_LUN）の予測は、図７に示すように、アクセス集中の発生する領域の遷移速度（pm_speed）と、当該領域に対する単位時間あたりのＩＯ数が所定値以下の状態からアクセス集中状態になるまでに要する成長時間（pm_growth）とを用いて行なわれる。これらの遷移速度pm_speed及び成長時間pm_growthは、ＩＯ集中領域（遷移先セグメント）を予測するために用いられるパラメータである。なお、図７は、図６に示すワークロードの分析例の要部を拡大して、遷移速度pm_speed及び成長時間pm_growthを説明する図である。
【００７９】
このとき、データ収集部１１ａは、アクセス集中領域に対応する各セグメントのアクセス数（ＩＯ数）を一定時間間隔（抽出間隔）で算出集計し、集計した各セグメントのＩＯ数をタイムスタンプとともに、ＩＯＤＢ１１ｂに格納する。
【００８０】
ワークロード分析部１１ｃ（遷移速度算出部１１ｈ）は、アクセス集中領域を構成するセグメント群（sub_LUN group）の中で最もＩＯ数の多いセグメントを、抽出間隔毎に抽出する。そして、ワークロード分析部１１ｃ（遷移速度算出部１１ｈ）は、抽出間隔毎に抽出されたセグメントについての、経過時間の差分とセグメントの遷移距離（移動距離；セグメントＩＤの差分）とに基づき、遷移速度pm_speedを算出する（図７参照）。
【００８１】
また、ワークロード分析部１１ｃ（成長時間算出部１１ｉ）は、あるタイミングで抽出された最もＩＯ数の多いセグメントについて、過去のＩＯ数（過去のアクセスログ；アクセスログの履歴）を参照する。これにより、ワークロード分析部１１ｃ（成長時間算出部１１ｉ）は、当該セグメントが、当該セグメントに対する単位時間あたりのＩＯ数が所定値以下の状態から前記セグメント群の中で最もＩＯ数が多くなるまでに要する時間を、成長時間pm_growthとして算出する（図７参照）。
【００８２】
ワークロード分析部１１ｃは、上述のごとく図示しないメモリ等に登録設定される遷移速度pm_speed及び成長時間pm_growthを、それぞれ、アクセス集中領域の検出に伴って算出された遷移速度pm_speed及び成長時間pm_growthに更新する。
【００８３】
次に、図８および図９を参照して、移動制御部１１ｅによる予測移動制御の処理手順の一例について説明する。図８は、図７に示すワークロードの分析例に対する予測移動制御の処理手順の一例を説明する図である。図９は、移動制御部による予測移動制御の処理手順の一例を説明する図である。
【００８４】
ワークロード分析部１１ｃは、ＩＯアクセス集中を検出すると（図８の（ｉ）参照）、当該ＩＯアクセス集中の発生したセグメントを抽出し、移動指示部１１ｄに対し、抽出したセグメントのＳＳＤ２０への移動を依頼する。これに伴い、第１タイミングで、ＩＯアクセス集中に対応するセグメントのデータは、ＳＳＤ２０へ移動される（図８の（ii）及び図９の上段参照）。このとき、図９の（ｉ）に示すように、移動制御部１１ｅは、ワークロード分析部１１ｃから、抽出したセグメントのセグメントＩＤを受け取る。そして、移動制御部１１ｅは、受け取ったセグメントＩＤを、現在時刻（timestamp；ＳＳＤ２０への移動時刻に対応）とともに、予測セグメントＤＢ１１ｆ（図１参照）に格納し保存することができる。
【００８５】
図９の（ｉ）の処理は、ＩＯ分析によりＨＤＤ３０からＳＳＤ２０への移動対象として選択された（指示された）セグメントの情報（例えばセグメントＩＤ(sub_LUN_ID)）をワークロード分析部１１ｃから受信したことを契機に実行されてよい。このとき、移動制御部１１ｅは、ワークロード分析部１１ｃから指示されたセグメントのセグメントＩＤを現在時刻とともに予測セグメントＤＢ１１ｆに保存する。
【００８６】
予測セグメントＤＢ１１ｆは、ワークロード分析部１１ｃから指示されたセグメントに関する情報を記憶するものであり、例えば図示しないメモリ等により実現される。
【００８７】
予測セグメントＤＢ１１ｆのデータ構造の一例を図１０に示す。予測セグメントＤＢ１１ｆは、例示的に、セグメントを特定する情報及びタイムスタンプを記憶することができる。セグメントを特定する情報は、ＩＯＤＢ１１ｂと同様に、例えばセグメントＩＤであってもよいし、セグメントの先頭オフセット等であってもよい。タイムスタンプは、時刻を識別する識別子であり、例えば時刻そのものが設定される。一例として、予測セグメントＤＢ１１ｆには、セグメント“１０”を予測したときの時刻（タイムスタンプ）として“xxxxxx...x”が設定されている。
【００８８】
また、図９の（ii）に示すように、移動制御部１１ｅは、予測移動制御において、ワークロード分析部１１ｃによる移動指示がないタイミング（上記第１タイミングとは異なる第２タイミング）で、移動指示部１１ｄに対してセグメントの移動を指示することができる（図８の（iii）参照）。
【００８９】
図９の（ii）の処理において、移動制御部１１ｅは、予測セグメントＤＢ１１ｆからセグメントの情報、つまりsub_LUN_IDおよびtimestampを取り出す。そして、移動制御部１１ｅは、現在時刻current_time、遷移速度pm_speed及び成長時間pm_growthに基づき、遷移先セグメントのセグメントＩＤの予測を行なった上で、予測された遷移先セグメントの移動指示を発行することができる。
【００９０】
ここで、遷移先セグメントのセグメントＩＤ（遷移先単位領域の識別情報の数値new_sub_LUN_ID）は、下記計算式（１）によって算出され予測決定される。
【００９１】
new_sub_LUN_ID 
＝sub_LUN_ID + ((current_time - timestamp) + pm_growth) * pm_speed   （１）
【００９２】
上記計算式（１）によって、移動制御部１１ｅは、sub_LUN_IDを保存した時刻timestampと現在時刻current_timeとの差分に成長時間pm_growthを加算することで、ＩＯ集中が発生する前のsub_LUN_IDを求めることができる。
【００９３】
この後、移動制御部１１ｅは、ワークロード分析部１１ｃによる移動指示がない第２タイミングで、移動指示部１１ｄに対し、予測した遷移先セグメントのＳＳＤ２０への移動を依頼することで、移動処理部１２ｄによって当該遷移先セグメントのＳＳＤ２０への移動が実行される。これに伴い、第２タイミングで、遷移先セグメントのデータは、ＳＳＤ２０へ移動される（図８の（iii）及び図９の下段参照）。
【００９４】
このように、移動指示部１１ｄと当該移動指示部１１ｄからのセグメント移動指示を受けて動作する移動処理部１２ｄとは、下記移動部の一例である。当該移動部は、第１タイミングで、ワークロード分析部１１ｃのＩＯ分析で決定された移動対象のセグメントのデータをＨＤＤ３０からＳＳＤ２０へ移動する。一方、当該移動部は、第１タイミングとは異なる第２タイミングで、移動制御部１１ｅによって予測された遷移先セグメントのデータをＨＤＤ３０からＳＳＤ２０へ移動する。
【００９５】
上述したように、例えば、移動制御部１１ｅは、図９の（ｉ）の処理が行なわれた時刻から現在時刻までの間に進んだ（移動した）セグメントを、予測セグメントＤＢ１１ｆから取り出したセグメントＩＤに反映することができる。さらに、移動制御部１１ｅは、成長時間pm_growthを算出して用いることで、遷移先セグメントでアクセス集中が発生する前に、当該遷移先セグメントのデータのＳＳＤ２０への移動を確実に完了させることができる。このため、セグメントの移動に伴うＩＯアクセス性能の低下はほとんど発生せず、遷移先セグメントに対するＩＯアクセスの発生当初からＳＳＤ２０でヒットする。
【００９６】
また、本実施形態では、ワークロード分析部１１ｃによって、ＩＯ集中領域を予測するために用いられるパラメータである遷移速度pm_speed及び成長時間pm_growthが、一定時間間隔毎に、アクセスログに基づいて自律的に設定することができる。これにより、オペレータがパラメータを設定する必要が無くなるだけでなく、遷移するＩＯ集中領域を精度よく予測して追従することができる。これに伴い、ＩＯが集中する前にＩＯ集中領域のデータをＳＳＤに適切に移動することができ、予測移動による性能向上を実現することができる。
【００９７】
なお、ＩＯ分析による移動と予測移動制御による移動とを同時に行なうと、かえってユーザＩＯのレスポンスが悪化する可能性がある。ワークロード分析部１１ｃにおいては、上述のように１分間隔等の所定の周期で移動するセグメントの選択が行なわれる。しかし、直前の周期からＩＯが集中するセグメントに変化がないような場合には、図９のワークロード分析部１１ｃの処理において「移動無し」とラベルを付した破線矢印の周期のように、移動するセグメントが選択されない場合もある。
【００９８】
そこで、移動制御部１１ｅは、ワークロード分析部１１ｃからセグメントの移動指示がない（セグメントの情報を通知されない又はセグメントを選択しなかったことを通知された）周期で、図９の（ii）の処理を行なうことができる。
【００９９】
以上のように、移動制御部１１ｅによる予測移動制御によれば、近い将来ＩＯの集中が見込まれるセグメントを、ＨＤＤ３０から性能の良いＳＳＤ２０へ事前に移動することができる。従って、ＨＤＤ３０からＳＳＤ２０へのセグメントの移動中におけるユーザＩＯレスポンスの劣化を抑制することができる。
【０１００】
〔１−４〕観測移動制御の説明
次に、図１１〜図１４を参照して、観測移動制御について説明する。
【０１０１】
観測移動制御では、予測移動制御とは逆に、ＳＳＤ２０からＨＤＤ３０へのセグメントの移動中におけるユーザＩＯレスポンスの劣化を抑制することができる。
【０１０２】
動的階層移動では、上述のように移動の最小単位としてセグメントが用いられる。セグメントは１ＧＢ程度の比較的大きな単位であるため、ＨＤＤ３０の負荷が高いときに階層移動を実行してしまうと、大量のユーザＩＯのレスポンスが悪化する可能性がある。
【０１０３】
そこで、観測移動制御では、セグメントサイズよりも十分小さなサイズ（以下、観測移動サイズと表記する）での観測移動をＳＳＤ２０及びＨＤＤ３０の空き領域間で実行し、そのときのユーザＩＯレスポンスが悪化しなければ引き続き本来の（指示された）階層移動を実行することができる。
【０１０４】
なお、観測移動サイズとしては、セグメントサイズが１ＧＢである場合、例えば２００ＭＢ（セグメントサイズの１／５）以下、好ましくは５０ＭＢ（セグメントサイズの１／２０）程度のサイズとすることができる。
【０１０５】
但し、観測移動サイズが小さ過ぎる場合、ＨＤＤ３０において負荷が生じる前に移動が完了してしまい、ユーザＩＯレスポンスの観測が正しく行なわれない可能性がある。従って、観測移動サイズは、ＨＤＤ３０に負荷を生じさせ、且つ階層ストレージシステム１全体のユーザＩＯレスポンスに大きな影響を与えない範囲で決定されることが好ましい。
【０１０６】
図１１を参照して、移動制御部１１ｅ及び観測処理部１２ｅによる観測移動制御の処理手順の一例について説明する。図１１の（Ｉ）に示すように、移動制御部１１ｅは、観測移動制御において、ＳＳＤ２０からＨＤＤ３０へのセグメントの移動前に、階層ドライバ１２（観測処理部１２ｅ）へ観測移動を指示することができる（図１４の（１）参照）。
【０１０７】
図１１の（Ｉ）の処理は、ＩＯ分析によりＳＳＤ２０からＨＤＤ３０への移動対象として選択された（指示された）セグメントの情報（例えばセグメントＩＤ）をワークロード分析部１１ｃから受信したことを契機に実行されてよい。このとき、移動制御部１１ｅは、ワークロード分析部１１ｃから指示されたセグメントの情報を、移動キュー１１ｇ（図１参照）に格納することができる。
【０１０８】
移動キュー１１ｇは、ワークロード分析部１１ｃによりＳＳＤ２０からＨＤＤ３０への移動対象として指示されたセグメントを示す情報を一時的に記憶するＦＩＦＯ構造の記憶領域であり、例えば図示しないメモリ等により実現される。移動キュー１１ｇによって、階層移動に係るセグメントの情報をキューイングすることにより、階層移動のタイミングを調整することができる。
【０１０９】
一例として、移動制御部１１ｅは、ＨＤＤ３０へ移動するセグメントの情報をワークロード分析部１１ｃから受信すると、受信順に当該セグメントの情報を移動キュー１１ｇに格納する。また、移動制御部１１ｅは、移動キュー１１ｇにセグメントの情報が１つでも格納されている場合、階層ドライバ１２に対して観測移動を指示する。
【０１１０】
階層ドライバ１２（観測処理部１２ｅ）は、移動制御部１１ｅからの観測移動の指示に応じて、ＳＳＤ２０からＨＤＤ３０への空き領域間での観測移動を、例えばｋｃｏｐｙｄへ指示し（図１４の（２）参照）、ｋｃｏｐｙｄに観測移動を行なわせることができる（図１４の（３）参照）。なお、観測処理部１２ｅは、移動指示とともにＩＯ分析による移動対象のセグメントの情報を受信した場合、当該移動対象のセグメントのうちの一部の領域を観測移動サイズとして選択してもよい。観測移動が行なわれる領域としては上述したものに限定されず、任意の領域が選択されてよい。
【０１１１】
観測処理部１２ｅは、ユーザＩＯの応答性能に関する情報を観測するために、カウンタ１２ｆをそなえることができる（図１参照）。カウンタ１２ｆは、観測移動サイズのデータの移動中においてユーザＩＯに対する応答時間が所定の閾値を超えた回数をカウントすることができる。
【０１１２】
例えば観測処理部１２ｅは、移動制御部１１ｅからの観測指示に応じて、観測移動サイズでの移動を行なう。また、観測処理部１２ｅは、図１１の（II）に示すように、所定期間、例えば数秒〜数十秒程度の間、ユーザＩＯへの応答時間を計測し（図１４の（４）参照）、応答時間が所定の閾値を超えた回数をカウンタ１２ｆによりカウントする（図１４の（５）参照）。所定期間を満了すると、観測処理部１２ｅは、カウンタ１２ｆのカウント値を移動制御部１１ｅへ通知することができる（図１４の（６）参照）。なお、所定期間の間、選択した領域の観測移動は繰り返し行なわれてもよい。
【０１１３】
所定の閾値としては、例えば数十ｍｓ〜数百ｍｓ、一例として３００ｍｓ（ミリ秒）程度が挙げられる。
【０１１４】
移動制御部１１ｅは、図１１の（III）に示すように、観測指示を発行してから所定期間経過後、観測処理部１２ｅからカウント値を受信すると、受信したカウント値に基づいてセグメントサイズでの階層移動の実行可否を判定することができる。
【０１１５】
例えば移動制御部１１ｅは、受信したカウント値がレスポンスの劣化を示さない値、一例として０である場合、応答の遅いユーザＩＯが発生しなかったため、セグメントサイズでの階層移動の処理を行なうと判定することができる（図１１の（III−２）参照）。一方、移動制御部１１ｅは、受信したカウント値がレスポンスの劣化を示す値、一例として０よりも大きい値である場合、応答の遅いユーザＩＯが発生したため、現在のインターバル（周期）でのセグメントサイズでの階層移動の処理を行なわないと判定することができる（図１１の（III−１）参照）。
【０１１６】
なお、移動制御部１１ｅは、階層移動の処理を行なうと判定した場合、移動キュー１１ｇに格納されたセグメントの情報を取り出して移動指示部１１ｄへ順次通知し、階層移動を指示することができる（図１４の（７）参照）。指示を受けた移動指示部１１ｄは、上述のように階層ドライバ１２に対して階層移動を指示し（図１４の（８）参照）、移動処理部１２ｄが例えばｋｃｏｐｙｄへ転送を指示して（図１４の（９）参照）、階層移動が実施される（図１４の（１０）参照）。
【０１１７】
一方、移動制御部１１ｅは、階層移動の処理を行なわないと判定した場合、移動キュー１１ｇに格納されたセグメントの情報を取り出さず（階層移動を中止し）、次回の周期まで待機することができる。
【０１１８】
このように、移動制御部１１ｅは、ＳＳＤ２０からＨＤＤ３０への階層移動の指示をワークロード分析部１１ｃから受信すると、階層移動に係るセグメントの情報をキューイングし、観測処理部１２ｅに対してセグメントサイズよりも十分に小さいサイズの移動を空き領域に実行させることができる。そして、移動制御部１１ｅは、ユーザＩＯの悪化が観測された場合には階層移動を中止し、ユーザＩＯの悪化が観測されない場合に、ＩＯ分析で指定されたセグメントの移動を指示することができる。
【０１１９】
従って、ＨＤＤ３０の負荷状況をリアルタイムに検出してＳＳＤ２０からＨＤＤ３０への階層移動の可否を判定し、ユーザＩＯレスポンスに影響を与えないタイミングで階層移動を行なうことができ、ユーザＩＯレスポンスの悪化を抑制することができる。
【０１２０】
なお、上述した観測移動サイズやカウンタ１２ｆの所定の閾値の最適値は、階層ストレージシステム１で使用される機器（例えばＳＳＤ２０やＨＤＤ３０、バス、その他の装置等）やワークロードによって変動することが容易に想像できる。一実施形態に係る構成では、１ＧＢのセグメントサイズに対して観測移動サイズを５０ＭＢとし、カウンタ１２ｆの閾値を３００ｍｓとしているが、使用する機器等の条件に応じて、これらのパラメータは適宜変化させてよい。
【０１２１】
図１２は一実施形態に係る動的階層制御（予測移動制御及び観測移動制御を含む）におけるＳＳＤ２０の消費量（ＧＢ）と平均応答時間（ｍｓ）との関係の一例を、所定の閾値ごとに示す図（表）である。また、図１２においては、ＨＤＤに加えてライトバック方式のキャッシュとしてＳＳＤを実装するＦＡＣＥＢＯＯＫ（登録商標）  ＦｌａｓｈＣａｃｈｅでの評価結果を対比例として示している。
【０１２２】
なお、図１２に示す評価では、以下の構成のシステムを用いている。
・ＰＣ…ＣＰＵ（Central Processing Unit）：Ｉｎｔｅｌ（登録商標）  Ｘｅｏｎ（登録商標）  Ｅ５−２６５０Ｌ×２，メモリ：３２ＧＢ，ＯＳ：Ｃｅｎｔ−ＯＳ  ５．４（６４ｂｉｔ）
・ＨＤＤ３０…ＳＡＳ（Serial Attached SCSI（Small Computer Storage Interface））対応，１０，０００ｒｐｍ，４５０ＧＢ×４，ＲＡＩＤ０構成
・ＳＳＤ２０…２４０ＧＢ
【０１２３】
さらに、対象となるワークロードはリードライト比が５６：４４であり、ワークロード容量が２９３ＧＢである。
【０１２４】
図１２において、「ＳＳＤ消費量」は予測移動制御及び観測移動制御を用いて割り当てられるＳＳＤ２０の最大消費量であり、ＦｌａｓｈＣａｃｈｅにも同じ値がセットされている。「ユーザＩＯ閾値」は観測移動制御での所定の閾値である。
【０１２５】
図１２に示すように、ＳＳＤ消費量が７５ＧＢ以上であると、予測・観測移動制御での平均応答時間はＦｌａｓｈＣａｃｈｅよりも短くなり、特に、ＳＳＤ消費量が９９ＧＢの場合には、予測・観測移動制御での平均応答時間はＦｌａｓｈＣａｃｈｅより４５．９％も高速となることが分かる。
【０１２６】
図１３は図１２に示すワークロードにおけるＳＳＤ消費量の一例を示す図である。図１３に示すように、移動制御部１１ｅによる予測移動制御及び観測移動制御が実施されている場合、ユーザＩＯレスポンスが所定の閾値を下回ると、２０分程度でＳＳＤ消費量が０まで減少することが分かる。また、図１３において、所定の閾値が大きいほどＳＳＤ２０の使用量は減少し、使用量が０になるまでの時間も短くなることが分かる。
【０１２７】
図１２及び図１３に示す評価結果から、所定の閾値を小さくするとＳＳＤ消費量は増加するが応答時間は短くなり、所定の閾値を大きくするとＳＳＤ消費量は減少するが応答時間は長くなることが分かる。
【０１２８】
従って、所定の閾値は、ＳＳＤ２０の容量と要求される応答時間とのトレードオフの関係を考慮して設定されることが好ましい。このため、階層管理部１１及び階層ドライバ１２は、観測移動サイズやカウンタ１２ｆの所定の閾値等のパラメータを最適値に調整する機能をそなえてもよい。
【０１２９】
以上のように、一実施形態に係る階層ストレージシステム１によれば、キャッシングを実装するＦｌａｓｈＣａｃｈｅに対して、平均ユーザＩＯレスポンスを約４０％向上できることが分かる。
【０１３０】
〔１−５〕階層ストレージシステムの動作例
次に、上述の如く構成された階層ストレージシステム１の動作例を、図１５〜図２９を参照して説明する。
【０１３１】
はじめに、図１５を参照してデータ収集部１１ａによるデータ収集処理及びワークロード分析部１１ｃによるパラメータ更新処理の動作例を説明する。なお、データ収集部１１ａは、ｂｌｋｔｒａｃｅコマンドを所定時間（例えば６０秒間）実行して、終了することを条件として起動され、データ収集処理を実行するものとする。
【０１３２】
図１５に示すように、データ収集部１１ａは、ｂｌｋｔｒａｃｅコマンドの実行により得られたトレース結果を取り出す（ステップＳ１）。次いで、データ収集部１１ａは、１ＧＢオフセット単位（セグメント単位）で各セグメントのＩＯ数を集計し（ステップＳ２）、タイムスタンプとともにＩＯＤＢ１１ｂに書き込み（ステップＳ３）、このインターバルでの処理が終了する。
【０１３３】
このように、データ収集部１１ａは、定期的に各セグメントについてＩＯ数を監視することで、流動的に変化するワークロードがユーザＩＯに与える影響をワークロード分析部１１ｃにフィードバックすることができる。
【０１３４】
このとき、一定時間間隔（抽出間隔）で各セグメントについてのＩＯ数が集計されてＩＯＤＢ１１ｂにアクセスログとして格納される都度、ワークロード分析部１１ｃは、最新の遷移速度pm_speed及び成長時間pm_growthを算出する。つまり、ワークロード分析部１１ｃは、今回ＩＯＤＢ１１ｂに格納されたＩＯ数を含む過去のアクセスログに基づき、最新の遷移速度pm_speed及び成長時間pm_growthを以下のように算出して更新する（ステップＳ１００）。
【０１３５】
ここで、まず、図１６〜図１８を参照して遷移速度pm_speedの算出手法について説明する。
【０１３６】
各セグメントには、上述したセグメントＩＤ（sub_LUN ID）が、各セグメントを特定する識別情報として割り当てられている。セグメントＩＤは、セグメントの配置順に対応して変化する昇順または降順の数値である。
【０１３７】
ワークロード分析部１１ｃの遷移速度算出部１１ｈは、ＩＯＤＢ１１ｂのアクセスログから、所定タイミング毎に、複数のセグメントのうちアクセス数が最大のセグメントＩＤ（単位領域の識別情報）を抽出する（図１８参照）。図１６に示す例では、時刻ｔから時刻ｔ＋１までの１分間で最もＩＯ数が多かったセグメントＩＤが、時刻ｔのtop sub_LUNとして示され、時刻ｔ＋１から時刻ｔ＋２までの１分間で最もＩＯ数が多かったセグメントＩＤが、時刻ｔ＋１のtop sub_LUNとして示されている。
【０１３８】
遷移速度算出部１１ｈは、所定タイミング毎に抽出されたセグメントＩＤの数値から、前後する二つのセグメントＩＤの数値の差が所定範囲PM_SIZE（例えば５）内である、連続する二以上のセグメントＩＤの数値を含むグループ（sub_LUN group；セグメント群）を抽出する。このようなグループが抽出された場合、遷移速度算出部１１ｈは、以下のようにして遷移速度pm_speedを算出する。つまり、遷移速度算出部１１ｈは、当該グループの終点におけるセグメントＩＤの数値と当該グループの始点におけるセグメントＩＤの数値との差分を、当該グループの始点から終点までに要する経過時間で除算することで、遷移速度pm_speedを算出する（図１７参照）。
【０１３９】
例えば図１６に示すように、前後する二つのセグメントＩＤの数値の差が所定範囲PM_SIZE（例えば５）内に入っていれば、遷移速度算出部１１ｈは、当該前後する二つのセグメント間でＩＯアクセス集中が継続していると判断する。一方、前後する二つのセグメントＩＤの数値の差が所定範囲PM_SIZE外であれば、遷移速度算出部１１ｈは、当該前後する二つのセグメント間でＩＯアクセス集中が途切れていると判断する。
【０１４０】
例えば図１７に示すように、時刻ｔから時刻ｔ＋５までの経過時間（Elapsed times (min)）６分の間に亘って、ＩＯアクセス集中が継続し、当該経過時間の間にsub_LUN_IDの数値が６増加している場合（6 sub_LUN）、遷移速度算出部１１ｈは、遷移速度pm_speedとして、6 sub_LUN／6 (分)＝＋１ sub_LUN／分を算出する。なお、経過時間６分の間に、sub_LUN_IDの数値が６減少している場合、遷移速度pm_speedとして、−１ sub_LUN／分が算出される。
【０１４１】
ワークロード分析部１１ｃは、最新の遷移速度pm_speed及び成長時間pm_growthを算出するのに先立ち、最新の情報を含む過去のアクセスログを参照し、例えば図１８に示すように、ＩＯ数の大きい上位ｎ個のセグメントＩＤ（sub_LUN_ID）を抽出する。図１８に示す例では、時刻１４〜時刻２５のそれぞれについて、ＩＯ数の大きい上位２０個のセグメントＩＤ（sub_LUN_ID）が、ＩＯ数の大きい順に並べ替えられて示されている。なお、図１８では、紙面の都合上、上位１５個のセグメントＩＤ（sub_LUN_ID）が示されている。
【０１４２】
図１８に示す例について遷移速度pm_speedを算出する場合、時刻１５と時刻１６との間で、前後する二つのtop sub_LUN_IDの差９２−７６＝１６がPM_SIZE＝５を超えているため、遷移速度算出部１１ｈは、ＩＯアクセス集中が時刻１５と時刻１６との間で途切れていると判断する。
【０１４３】
また、時刻１６から時刻２４までの間では、前後する二つのtop sub_LUN_IDの差はいずれもPM_SIZE＝５以下であるため、遷移速度算出部１１ｈは、ＩＯアクセス集中が時刻１６から時刻２４まで継続していると判断する。
【０１４４】
そして、時刻２４と時刻２５との間で、前後する二つのtop sub_LUN_IDの差１０２−３＝９９がPM_SIZE＝５を超えているため、遷移速度算出部１１ｈは、ＩＯアクセス集中が時刻２４と時刻２５との間で途切れていると判断する。
【０１４５】
このとき、終点におけるセグメントＩＤの数値１０２と当該グループの始点におけるセグメントＩＤの数値９２との差分は１０となる。これ伴い、遷移速度算出部１１ｈは、遷移速度pm_speedとして、１０／９＝１．１１sub_LUN／分を算出する。
【０１４６】
ついで、図１９を参照して成長時間pm_growthの算出手法について説明する。
【０１４７】
ワークロード分析部１１ｃの成長時間算出部１１ｉは、ＩＯＤＢ１１ｂのアクセスログから、一定時間間隔の所定タイミング毎に、ＩＯ数の大きい順に全てのセグメントのセグメントＩＤ（sub_LUN_ID）及びＩＯ数を抽出する。
【０１４８】
成長時間算出部１１ｉは、アクセスログから、最新の所定タイミングでＩＯ数が最大のセグメントの最新セグメントＩＤ及びＩＯ数を抽出する。また、成長時間算出部１１ｉは、所定タイミング毎に抽出された全てのセグメントのセグメントＩＤ及びＩＯ数を参照することで、最新の所定タイミングよりも前のタイミングにおいて、前記最新セグメントＩＤのセグメントのＩＯ数が所定値（例えば２０）を超える最古の所定タイミングを求める。そして、成長時間算出部１１ｉは、最新の所定タイミングと最古の所定タイミングとの差分時間に基づき、成長時間pm_growthを算出する。
【０１４９】
例えば、最新の所定タイミングが時刻２０の時点で、図１９に示すように、ＩＯ数の大きい上位ｎ個のセグメントＩＤ（sub_LUN_ID）が抽出されている。図１９に示す例では、時刻１８〜時刻２０のそれぞれについて、ＩＯ数の大きい上位２０個のセグメントＩＤ（sub_LUN_ID）が、ＩＯ数の大きい順に並べ替えられて示されている。なお、図１９でも、紙面の都合上、上位１５個のセグメントＩＤ（sub_LUN_ID）が示されている。
【０１５０】
このとき、成長時間算出部１１ｉによって、最新の所定タイミングである時刻２０の時点でＩＯ数が最大のセグメントの最新セグメントＩＤ“９６”が抽出される。また、成長時間算出部１１ｉによって、過去の所定タイミングである時刻１９および時刻１８の時点で抽出された上位２０個のセグメントＩＤが参照される。これにより、最新の所定タイミング（時刻２０）よりも前のタイミングにおいて、最新セグメントＩＤ“９６”が現れる最古の所定タイミングが求められる。
【０１５１】
図１９に示す例では、最新セグメントＩＤ“９６”は、時刻１９の時点で６位に現れ、最新セグメントＩＤ“９６”のセグメントのＩＯ数は所定値２０を超えているものとする。しかし、時刻１８の時点では、最新セグメントＩＤ“９６”のセグメントのＩＯ数は所定値２０以下であるとする。この場合、最新セグメントＩＤ“９６”のセグメントのＩＯ数が所定値２０を超える最古の所定タイミングは時刻１９であり、最新セグメントＩＤ“９６”のセグメントが、そのＩＯ数が最大になる１分前から、そのＩＯ数は所定値２０を超えている。このため、成長時間pm_growthとして、最新の所定タイミングと最古の所定タイミングとの差分時間である１分に１分を加算して得られる値２分が算出される。
【０１５２】
このように、成長時間算出部１１ｉによれば、図１９に示すように最大ＩＯ数のセグメントＩＤの履歴を辿ることで、当該セグメントＩＤのセグメントに対するＩＯ数が何分前から増加し始めたかを、成長時間pm_growthとして把握することができる。そして、成長時間pm_growthを遷移先セグメントの予測に反映することで、遷移先セグメントでアクセス集中が発生する前に、当該遷移先セグメントのデータのＳＳＤ２０への移動を確実に完了することができる。
【０１５３】
次に、図２０に示すフローチャート（ステップＳ１０１〜Ｓ１０９）を参照して遷移速度算出部１１ｈによる遷移速度の算出手順の一例を説明する。図２０において、PM_SIZE＝５、一定時間間隔(Interval)＝６０秒である。“Start_sub_LUN_ID”は、前記グループの始点におけるセグメントＩＤの数値に対応し、初期値としては−１を設定される。“End_sub_LUN_ID”は、前記グループの終点におけるセグメントＩＤの数値に対応し、初期値としては“−１”を設定される。
【０１５４】
遷移速度算出部１１ｈは、一定時間間隔毎に、ＩＯ数が最も多いセグメントのセグメントＩＤ（sub_LUN_ID）を獲得する（ステップＳ１０１）。以下では、ステップＳ１０１で獲得されたセグメントＩＤ（sub_LUN_ID）を“Ａ”と表記する。
【０１５５】
そして、遷移速度算出部１１ｈは、“Start_sub_LUN_ID”が−１であるか否かを判定する（ステップＳ１０２）。“Start_sub_LUN_ID”が“−１”である場合（ステップＳ１０２のＹｅｓルート）、遷移速度算出部１１ｈは、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”を、いずれも“Ａ”に設定するとともに、経過時間を計数するカウンタによるカウント値“count”を“１”に設定する（ステップＳ１０３）。この後、遷移速度算出部１１ｈは、所定時間、例えば６０秒スリープし（ステップＳ１０９）、ステップＳ１０１の処理に移行する。
【０１５６】
“Start_sub_LUN_ID”が“−１”でない場合（ステップＳ１０２のＮｏルート）、遷移速度算出部１１ｈは、今回獲得されたセグメントＩＤ“Ａ”と“End_sub_LUN_ID”との差がPM_SIZE（例えば５）以内であるか否かを判定する（ステップＳ１０４）。当該差がPM_SIZE（例えば５）以内である場合（ステップＳ１０４のＹｅｓルート）、遷移速度算出部１１ｈは、カウント値“count”に１を加算するとともに、“End_sub_LUN_ID”を、今回獲得されたセグメントＩＤ“Ａ”に設定する（ステップＳ１０５）。この後、遷移速度算出部１１ｈは、所定時間、例えば６０秒スリープし（ステップＳ１０９）、ステップＳ１０１の処理に移行する。
【０１５７】
当該差がPM_SIZE（例えば５）を超える場合（ステップＳ１０４のＮｏルート）、遷移速度算出部１１ｈは、カウント値“count”が“１”であるか否かを判定する（ステップＳ１０６）。カウント値“count”が“１”である場合（ステップＳ１０６のＹｅｓルート）、遷移速度算出部１１ｈは、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”を、いずれも“Ａ”に設定するとともに、カウント値“count”を“１”に設定する（ステップＳ１０８）。この後、遷移速度算出部１１ｈは、所定時間、例えば６０秒スリープし（ステップＳ１０９）、ステップＳ１０１の処理に移行する。
【０１５８】
カウント値“count”が“１”でない場合（ステップＳ１０６のＮｏルート）、遷移速度算出部１１ｈは、遷移速度pm_speedとして（End_sub_LUN_ID − Start_sub_LUN_ID）／countを算出してから、ステップＳ１０８の処理へ移行する。
【０１５９】
図２０に示すフローチャートに、図１８に示す具体的なアクセスログを適用した場合、以下のように動作する。ここでは、例えば、図１８に示すアクセスログの時刻１４に、図２０に示すフローチャートによる処理を開始した場合の動作について説明する。処理の開始時点には、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”に初期値“−１”が設定される。
【０１６０】
まず、時刻１４には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“７６”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”であると判定される（Ｙｅｓルート）。これに伴い、ステップＳ１０３において、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”がいずれも“７６”に設定されるとともに、カウント値“count”が“１”に設定される。
【０１６１】
時刻１５には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“７６”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“７６”と“End_sub_LUN_ID”＝“７６”との差“０”がPM_SIZE＝５以内であると判定される（Ｙｅｓルート）。これに伴い、ステップＳ１０５において、“End_sub_LUN_ID”が“７６”に設定されるとともに、カウント値“count”が“２”に設定される。
【０１６２】
時刻１６には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“９２”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“９２”と“End_sub_LUN_ID”＝“７６”との差“１６”がPM_SIZE＝５を超えると判定される（Ｎｏルート）。さらに、ステップＳ１０６において、カウント値“count”＝“２”が１でないと判定される（Ｎｏルート）。これに伴い、ステップＳ１０７において、遷移速度pm_speed＝（End_sub_LUN_ID − Start_sub_LUN_ID）／count＝（７６−７６）／２＝０sub_LUN／分が算出される。この後、ステップＳ１０８において、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”がいずれも“９２”に設定されるとともに、カウント値“count”が“１”に設定される。
【０１６３】
時刻１７には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“９２”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“９２”と“End_sub_LUN_ID”＝“９２”との差“０”がPM_SIZE＝５以内であると判定される（Ｙｅｓルート）。これに伴い、ステップＳ１０５において、“End_sub_LUN_ID”が“９２”に設定されるとともに、カウント値“count”が“２”に設定される。
【０１６４】
時刻１８には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“９５”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“９５”と“End_sub_LUN_ID”＝“９２”との差“３”がPM_SIZE＝５以内であると判定される（Ｙｅｓルート）。これに伴い、ステップＳ１０５において、“End_sub_LUN_ID”が“９５”に設定されるとともに、カウント値“count”が“３”に設定される。
【０１６５】
以下、同様の動作を繰り返し実行し、時刻２４には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“１０２”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“１０２”と“End_sub_LUN_ID”＝“１０１”との差“１”がPM_SIZE＝５以内であると判定される（Ｙｅｓルート）。これに伴い、ステップＳ１０５において、“End_sub_LUN_ID”が“１０２”に設定されるとともに、カウント値“count”が“９”に設定される。
【０１６６】
時刻２５には、ステップＳ１０１において「IO数が最も多いsub_LUN ID(A)」として“３”が獲得され、ステップＳ１０２において“Start_sub_LUN_ID”が“−１”でないと判定される（Ｎｏルート）。そして、ステップＳ１０４において、Ａ＝“３”と“End_sub_LUN_ID”＝“１０２”との差“８９”がPM_SIZE＝５を超えると判定される（Ｎｏルート）。さらに、ステップＳ１０６において、カウント値“count”＝“９”が１でないと判定される（Ｎｏルート）。これに伴い、ステップＳ１０７において、遷移速度pm_speed＝（End_sub_LUN_ID − Start_sub_LUN_ID）／count＝（１０２−９２）／９＝１０／９＝１．１１sub_LUN／分が算出される。この後、ステップＳ１０８において、“Start_sub_LUN_ID”及び“End_sub_LUN_ID”がいずれも“３”に設定されるとともに、カウント値“count”が“１”に設定される。
【０１６７】
次に、図２１に示すフローチャート（ステップＳ１１１〜Ｓ１１７）を参照して成長時間算出部１１ｉによる成長時間の算出手順の一例を説明する。
【０１６８】
成長時間算出部１１ｉは、一定時間間隔毎に、ＩＯ数が最も多いセグメントのセグメントＩＤ（sub_LUN_ID）を獲得し（ステップＳ１１１）、ｉ＝１を設定する（ステップＳ１１２）。以下では、ステップＳ１１１で獲得されたセグメントＩＤ（sub_LUN_ID）を“Ａ”と表記する。
【０１６９】
そして、成長時間算出部１１ｉは、ｉ分前の時刻における全てのセグメント（sub_LUN）の履歴（例えば図１９のアクセスログ参照）を参照する。これにより、成長時間算出部１１ｉは、ｉ分前の時刻における全てのセグメントの中から、そのセグメントＩＤ（sub_LUN_ID）がＡと一致するセグメント（sub_LUN）を検索する（ステップＳ１１３）。
【０１７０】
成長時間算出部１１ｉは、ステップＳ１１３で検索したセグメント（sub_LUN）のＩＯ数が所定値２０以下であるか否かを判定する（ステップＳ１１４）。ＩＯ数が所定値２０を超える場合（ステップＳ１１４のＮＯルート）、成長時間算出部１１ｉは、ｉをｉ＋１に置き換えてから（ステップＳ１１５）、ステップＳ１１３の処理に戻る。
【０１７１】
一方、ＩＯ数が所定値２０以下の場合（ステップＳ１１４の“ＹＥＳ”ルート）、成長時間算出部１１ｉは、成長時間pm_growthとして“ｉ”を算出する（ステップＳ１１６）。この後、成長時間算出部１１ｉは、所定時間、例えば６０秒スリープし（ステップＳ１１７）、ステップＳ１１１の処理に移行する。
【０１７２】
図２１に示すフローチャートに、図１９に示す具体的なアクセスログを適用した場合、以下のように動作する。ここでは、例えば、図１９に示すアクセスログの時刻２０に、図２１に示すフローチャートによる処理を開始した場合の動作について説明する。
【０１７３】
時刻２０には、ステップＳ１１１において「IO数が最も多いsub_LUN ID(A)」として“９６”が獲得され、ステップＳ１１２においてｉ＝１が設定される。
【０１７４】
この後、ステップＳ１１３において、１分前の時刻１９における全てのセグメントの履歴を参照する。このとき、１分前の時刻１９における全てのセグメントの中から、“９６”と一致するセグメントＩＤをもつセグメントが検索され、そのＩＯ数は２０を超えると判定される（ステップＳ１１４のＮＯルート）。これに伴い、ステップＳ１１５においてｉ＝１＋１＝２が設定される。
【０１７５】
そして、ステップＳ１１３において、２分前の時刻１８における全てのセグメントの履歴を参照する。このとき、２分前の時刻１８における上位２０個のセグメントの中に、“９６”と一致するセグメントＩＤをもつセグメントが検索され、そのＩＯ数は所定値２０以下であると判定される（ステップＳ１１４のＹＥＳルート）。これに伴い、ステップＳ１１６において、成長時間pm_growthとして“２”が算出される。
【０１７６】
このようにして、最新の所定タイミングである時刻２０の時点でＩＯ数が最大のセグメントの最新セグメントＩＤ“９６”が抽出され、過去の所定タイミングである時刻１９および時刻１８の時点で抽出された全てのセグメントＩＤが参照される。これにより、最新の所定タイミング（時刻２０）よりも前のタイミングにおいて、最新セグメントＩＤ“９６”のセグメントのＩＯ数が所定値２０を超える最古の所定タイミングが求められ、成長時間pm_growthが算出される。
【０１７７】
次に、図２２を参照してワークロード分析部１１ｃによる移動判定処理の動作例を説明する。図２２に示すように、ワークロード分析部１１ｃは、ＩＯＤＢ１１ｂから直近のタイムスタンプのセグメントについてＩＯ数を取り出し（ステップＳ１１）、セグメント数が所定数に達するまで、ＩＯ数が多い順に候補セグメントを抽出する（ステップＳ１２）。
【０１７８】
次いで、ワークロード分析部１１ｃは、予め求められた平均余命時間が全候補セグメントに係る移動時間よりも大きいか否かを判定する（ステップＳ１３）。
【０１７９】
平均余命時間が当該移動時間以下の場合（ステップＳ１３のＮｏルート）、処理がステップＳ１５に移行する。一方、平均余命時間が当該移動時間よりも大きい場合（ステップＳ１３のＹｅｓルート）、ワークロード分析部１１ｃは、候補セグメントの情報を移動指示部１１ｄ及び移動制御部１１ｅへそれぞれ通知し、データの移動（ＨＤＤ３０からＳＳＤ２０）を指示し（ステップＳ１４）、処理がステップＳ１５に移行する。
【０１８０】
ステップＳ１５では、ワークロード分析部１１ｃは、ＳＳＤ２０上のセグメントから候補セグメントに含まれないセグメント、例えばＩＯ数が比較的少ないセグメントを抽出する。そして、ワークロード分析部１１ｃは、抽出したセグメントの情報を移動制御部１１ｅへ通知し、データの移動（ＳＳＤ２０からＨＤＤ３０）を指示する（ステップＳ１６）。
【０１８１】
次いで、ワークロード分析部１１ｃは、所定時間、例えば６０秒スリープし（ステップＳ１７）、処理がステップＳ１１に移行する。
【０１８２】
なお、ワークロード分析部１１ｃは、ステップＳ１２において、ＩＯ数又はアクセスの集中率（全体に対するＩＯ数の割合）が所定の閾値よりも高いセグメントを抽出してもよい。また、ワークロード分析部１１ｃは、ステップＳ１５において、ＨＤＤ３０にデータを移動するセグメントとして、例えばＩＯ数又はアクセスの集中率が所定の閾値以下となったＳＳＤ２０上のセグメントを抽出してもよい。さらに、ワークロード分析部１１ｃは、ステップＳ１２及びＳ１５で抽出するセグメントとして、当該抽出条件に所定回数以上連続して該当したセグメントを選択してもよい。
【０１８３】
このように、ワークロード分析部１１ｃは、ＩＯの集中度が高いセグメントのデータをＨＤＤ３０からＳＳＤ２０に移動するように移動指示部１１ｄ及び移動制御部１１ｅに指示することによって、ユーザはＨＤＤ３０のデータに高速にアクセスすることができる。
【０１８４】
また、ワークロード分析部１１ｃは、ＩＯの集中度が低くなったセグメントのデータをＳＳＤ２０からＨＤＤ３０に移動するように移動制御部１１ｅに指示することによって、比較的高価格、低容量のＳＳＤ２０を有効利用することができる。
【０１８５】
次に、図２３を参照して移動制御部１１ｅによる予測移動制御処理の動作例を説明する。図２３に示すように、移動制御部１１ｅは、ワークロード分析部１１ｃから移動指示（ＨＤＤ３０からＳＳＤ２０）を受信したか否かを判定し（ステップＳ２１）、移動指示を受信している場合（ステップＳ２１のＹｅｓルート）、処理がステップＳ２２に移行する。
【０１８６】
ステップＳ２２では、移動制御部１１ｅは、ワークロード分析部１１ｃから移動を指示されたセグメントのＩＤ“seg_id”（＝sub_LUN_ID）を、タイムスタンプ（timestamp）とともに予測セグメントＤＢ１１ｆに格納する。この後、移動制御部１１ｅは、ワークロード分析部１１ｃが次の移動判定を行なうまでスリープして（ステップＳ２６）、処理がステップＳ２１に移行する。
【０１８７】
一方、ステップＳ２１において、ワークロード分析部１１ｃから移動指示を受信していない場合（ステップＳ２１のＮｏルート）、移動制御部１１ｅは、予測セグメントＤＢ１１ｆ内に予測移動待ちのセグメントが存在するか否かを判定する（ステップＳ２３）。
【０１８８】
予測移動待ちのセグメントが存在しない場合（ステップＳ２３のＮｏルート）、処理がステップＳ２６に移行する。一方、予測移動待ちのセグメントが存在する場合（ステップＳ２３のＹｅｓルート）、移動制御部１１ｅは、予測移動待ちの“seg_id”を予測セグメントＤＢ１１ｆから一つ取り出し、上記計算式（１）によって、遷移先セグメントのＩＤ“new_seg_id”（＝new_sub_LUN_ID）を算出する（ステップＳ２４）。
【０１８９】
そして、移動制御部１１ｅは、算出した“new_seg_id”を移動指示部１１ｄへ通知し、データの移動（ＨＤＤ３０からＳＳＤ２０）を指示して（ステップＳ２５）、処理がステップＳ２３に移行する。
【０１９０】
このように、移動制御部１１ｅは、ＨＤＤ３０からＳＳＤ２０への移動を指示されたセグメントの情報に基づき予測移動を行なう予測セグメントを算出し、移動指示の無いタイミングで、予測セグメント（遷移先セグメント）に基づくセグメントの移動を移動指示部１１ｄへ指示することができる。従って、ワークロード分析部１１ｃの分析による階層移動の動作には影響を与えずに、近い将来ＩＯが集中するセグメントについて効果的な階層移動を行なうことができる。
【０１９１】
次に、図２４を参照して移動制御部１１ｅによる観測移動制御処理の動作例を説明する。図２４に示すように、移動制御部１１ｅは、ワークロード分析部１１ｃから移動指示（ＳＳＤ２０からＨＤＤ３０）を受信したか否かを判定し（ステップＳ３１）、移動指示を受信していない場合（ステップＳ３１のＮｏルート）、処理がステップＳ３３に移行する。
【０１９２】
一方、移動指示を受信している場合（ステップＳ３１のＹｅｓルート）、移動制御部１１ｅは、ワークロード分析部１１ｃから移動を指示されたセグメントのＩＤ“seg_id”を全て移動キュー１１ｇへ挿入し（ステップＳ３２）、処理がステップＳ３３に移行する。
【０１９３】
ステップＳ３３では、移動制御部１１ｅは、移動キュー１１ｇにＨＤＤ３０への移動待ちの“seg_id”が存在するか否かを判定する。移動待ちの“seg_id”が存在しない場合（ステップＳ３３のＮｏルート）、移動制御部１１ｅは、ワークロード分析部１１ｃが次の移動判定を行なうまでスリープし（ステップＳ３７）、処理がステップＳ３１に移行する。
【０１９４】
ステップＳ３３において、移動待ちの“seg_id”が存在する場合（ステップＳ３３のＹｅｓルート）、移動制御部１１ｅは、階層ドライバ１２の観測処理部１２ｅに対して、ＳＳＤ２０及びＨＤＤ３０の空き領域間の移動を指示し、所定時間、例えばＭ秒（Ｍは０以上の実数）スリープする（ステップＳ３４）。
【０１９５】
なお、ステップＳ３４において、移動制御部１１ｅは、移動待ちの“seg_id”の少なくとも１つの情報を観測処理部１２ｅへ通知し、通知したセグメントにおける観測サイズの領域について観測移動を指示してもよい。また、移動制御部１１ｅは、ＳＳＤ２０の空き領域のボリューム上のオフセットをＨＤＤ３０上のオフセットに変換し、変換したオフセットを観測移動の指示に含めてもよい。
【０１９６】
次いで、移動制御部１１ｅは、観測処理部１２ｅから通知されたカウンタ１２ｆのカウント値が０であるか否かを判定する（ステップＳ３５）。カウント値が０ではない場合（ステップＳ３５のＮｏルート）、処理がステップＳ３７に移行する。一方、カウント値が０である場合（ステップＳ３５のＹｅｓルート）、移動制御部１１ｅは、移動キュー１１ｇ内の“seg_id”を順番に取り出して移動指示部１１ｄへ通知し、データの移動（ＳＳＤ２０からＨＤＤ３０）を指示して（ステップＳ３６）、処理がステップＳ３７に移行する。
【０１９７】
なお、ステップＳ３５におけるカウント値の判定閾値は０に限定されるものではなく、観測処理部１２ｅでのカウンタ１２ｆの所定の閾値との関係で他の値が設定されてもよい。
【０１９８】
このように、移動制御部１１ｅは、ＳＳＤ２０からＨＤＤ３０へのセグメントの移動前に、観測処理部１２ｅに対して観測サイズでの観測移動を指示し、観測移動中のユーザＩＯの応答性能に関する情報に応じてセグメントの移動を行なうことができる。従って、ワークロード分析部１１ｃの分析による階層移動の動作を、ユーザＩＯレスポンスへの影響が無い（小さい）タイミングで実施することができる。
【０１９９】
次に、図２５を参照して移動指示部１１ｄによる移動指示通知処理の動作例を説明する。図２５に示すように、移動指示部１１ｄは、ワークロード分析部１１ｃ又は移動制御部１１ｅからの移動指示を待ち受け（ステップＳ４１）、移動指示を受け取ると、各セグメントのボリューム上のオフセットをＨＤＤ３０上のオフセットに変換する（ステップＳ４２）。
【０２００】
そして、移動指示部１１ｄは、セグメントごとに、ＨＤＤ３０上のオフセットと、データの移動方向とを階層ドライバ１２（移動処理部１２ｄ）へ通知し（ステップＳ４３）、処理がステップＳ４１に移行する。このとき移動処理部１２ｄへ通知されるデータの移動方向は、ＨＤＤ３０からＳＳＤ２０、又は、ＳＳＤ２０からＨＤＤ３０となる。
【０２０１】
このように、移動指示部１１ｄが各セグメントのボリューム上のオフセットをＨＤＤ３０上のオフセットに変換することによって、階層ドライバ１２はＳＳＤ２０とＨＤＤ３０との間でデータを移動することができる。
【０２０２】
次に、図２６を参照して観測処理部１２ｅによる観測処理の動作例を説明する。図２６に示すように、観測処理部１２ｅは、移動制御部１１ｅからのＳＳＤ２０及びＨＤＤ３０の空き領域間の移動指示（観測移動指示）を待ち受け（ステップＳ５１）、観測移動指示を受け取ると、カウンタ１２ｆを初期化する（ステップＳ５２）。
【０２０３】
次いで、観測処理部１２ｅは、ＳＳＤ２０の空き領域からＨＤＤ３０の空き領域へのデータの転送指示をｋｃｏｐｙｄに対して行なう（ステップＳ５３）。このとき、観測処理部１２ｅは、所定時間、例えばＭ秒のカウントを行なう。なお、観測処理部１２ｅは、移動する対象領域の特定に移動制御部１１ｅから通知されたオフセットの情報を用いてもよく、階層テーブル１２ｃを参照してもよい。また、観測移動の観測サイズはセグメントサイズよりも十分小さいサイズであり、一実施形態の例では、１ＧＢのセグメントサイズに対して、観測サイズは２００〜５０ＭＢ程度となる。
【０２０４】
そして、観測処理部１２ｅは、観測移動中のユーザＩＯレスポンスを監視し、所定の閾値を超えたユーザＩＯレスポンスをカウンタ１２ｆにより計数して（ステップＳ５４）、Ｍ秒が経過したか否かを判定する（ステップＳ５５）。
【０２０５】
Ｍ秒経過していない場合（ステップＳ５５のＮｏルート）、処理がステップＳ５４に移行する。一方、Ｍ秒経過した場合（ステップＳ５５のＹｅｓルート）、観測処理部１２ｅは、カウント値を移動制御部１１ｅへ通知し（ステップＳ５６）、処理がステップＳ５１に移行する。
【０２０６】
このように、観測処理部１２ｅは、観測移動中のユーザＩＯレスポンスをリアルタイムに観測することができるため、階層移動（ＳＳＤ２０からＨＤＤ３０）を行なう最適なタイミングを精度よく検出することができる。
【０２０７】
次に、図２７を参照して階層ドライバ１２の移動処理部１２ｄによる転送開始処理の動作例を説明する。図２７に示すように、移動処理部１２ｄは、移動指示部１１ｄからの移動指示を待ち受け（ステップＳ６１）、移動指示を受け取ると、ＨＤＤ３０からＳＳＤ２０へのデータの移動であるか否かを判定する（ステップＳ６２）。
【０２０８】
ＨＤＤ３０からＳＳＤ２０へのデータの移動である場合（ステップＳ６２のＹｅｓルート）、移動処理部１２ｄは、移動を指示されたセグメントがＳＳＤ２０へ移動済みであるか否かを判定する（ステップＳ６３）。移動済みである場合（ステップＳ６３のＹｅｓルート）、処理がステップＳ６１に移行する。
【０２０９】
一方、移動済みでない場合（ステップＳ６３のＮｏルート）、移動処理部１２ｄは、階層テーブル１２ｃ内のＨＤＤオフセットより“NULL”となっているエントリを探索し、ＨＤＤオフセット情報と状態とを登録する。このとき移動処理部１２ｄが登録する状態は“Moving（HDD→SSD）”となる。そして、移動処理部１２ｄは、ＨＤＤ３０からＳＳＤ２０へのデータの転送指示をｋｃｏｐｙｄへ発行し（ステップＳ６４）、処理がステップＳ６１に移行する。
【０２１０】
ステップＳ６２において、移動指示がＨＤＤ３０からＳＳＤ２０へのデータの移動ではない場合（ステップＳ６２のＮｏルート）、移動処理部１２ｄは、階層テーブル１２ｃ内のＨＤＤオフセットよりセグメントを探索し、ＨＤＤオフセット情報と状態とを登録する。このとき移動処理部１２ｄが登録する状態は“Moving（SSD→HDD）”となる。そして、移動処理部１２ｄは、ＳＳＤ２０からＨＤＤ３０へのデータの転送指示をｋｃｏｐｙｄへ発行し（ステップＳ６５）、処理がステップＳ６１に移行する。
【０２１１】
次に、図２８を参照して階層ドライバ１２の移動処理部１２ｄによる転送完了処理の動作例を説明する。図２８に示すように、移動処理部１２ｄは、ｋｃｏｐｙｄによる転送の完了を待ち（ステップＳ７１）、転送が完了すると、転送が完了した階層テーブル１２ｃのエントリをＨＤＤオフセットを用いて探索する（ステップＳ７２）。
【０２１２】
そして、移動処理部１２ｄは、探索したエントリについて、状態が“Moving（HDD→SSD）”であるか否かを判定する（ステップＳ７３）。状態が“Moving（HDD→SSD）”である場合（ステップＳ７３のＹｅｓルート）、移動処理部１２ｄは、状態を“allocated”に変更し（ステップＳ７４）、処理がステップＳ７１に移行する。
【０２１３】
一方、状態が“Moving（HDD→SSD）”ではない（“Moving（SSD→HDD）”である）場合（ステップＳ７３のＮｏルート）、移動処理部１２ｄは、状態を“free”に変更し、且つ、対応するＨＤＤオフセットを“NULL”に設定して（ステップＳ７５）、処理がステップＳ７１に移行する。
【０２１４】
このように、階層ドライバ１２（移動処理部１２ｄ）が階層テーブル１２ｃを用いてＳＳＤ２０とＨＤＤ３０との間でデータを転送することにより、ワークロード分析部１１ｃ及び移動制御部１１ｅによる動的階層制御が実現される。
【０２１５】
最後に、図２９を参照してＩＯマップ部１２ａによるＩＯ受信処理の動作例を説明する。図２９に示すように、ＩＯマップ部１２ａは、ユーザＩＯの受信を待ち受け（ステップＳ８１）、ユーザＩＯを受け取ると、ユーザＩＯで指定されるオフセットと階層テーブル１２ｃに登録されている各オフセット＋セグメントサイズとを比較する（ステップＳ８２）。
【０２１６】
そして、ＩＯマップ部１２ａは、比較結果に基づき、階層テーブル１２ｃに一致するオフセットが存在し、且つ状態が“allocated”であるか否かを判定する（ステップＳ８３）。一致するオフセットが存在し、且つ状態が“allocated”である場合（ステップＳ８３のＹｅｓルート）、ＩＯマップ部１２ａは、ＳＳＤドライバ１３へＩＯ要求を送付し（ステップＳ８４）、処理がステップＳ８１に移行する。
【０２１７】
一方、一致するオフセットが存在せず、又は状態が“allocated”ではない場合（ステップＳ８３のＮｏルート）、ＩＯマップ部１２ａは、状態が“Moving(HDD→SSD)”又は“Moving(SSD→HDD)”であるか否かを判定する（ステップＳ８５）。状態が“Moving(HDD→SSD)”及び“Moving(SSD→HDD)”以外の状態である場合（ステップＳ８５のＮｏルート）、ＩＯマップ部１２ａは、ＨＤＤドライバ１４へＩＯ要求を送付し（ステップＳ８６）、処理がステップＳ８１に移行する。
【０２１８】
また、ステップＳ８５において、状態が“Moving(HDD→SSD)”又は“Moving(SSD→HDD)”である場合（ステップＳ８５のＹｅｓルート）、ＩＯマップ部１２ａは、当該状態が“free”又は“allocated”に変化するまでＩＯ要求をＩＯキュー１２ｂに格納する。すなわち、ＩＯマップ部１２ａは、ＩＯ要求に係るセグメントの階層移動が完了するまで、ＩＯ要求を保留する（ステップＳ８７）。階層移動が完了すると、ＩＯマップ部１２ａは、ＩＯキュー１２ｂに格納したＩＯ要求を取り出し、処理がステップＳ８３に移行する。
【０２１９】
〔１−６〕階層ストレージ制御装置のハードウェア構成例
次に、図３０を参照して、図１に示す階層ストレージ制御装置１０のハードウェア構成例について説明する。図３０に示すように、階層ストレージ制御装置１０は、例示的に、ＣＰＵ１０ａ、メモリ１０ｂ、記憶部１０ｃ、インタフェース部１０ｄ、及び入出力部１０ｅをそなえることができる。
【０２２０】
ＣＰＵ１０ａは、種々の制御や演算を行なうプロセッサの一例である。ＣＰＵ１０ａは、階層ストレージ制御装置１０内の各ブロックとバスで相互に通信可能に接続されてよい。なお、プロセッサとしては、ＣＰＵ１０ａに代えて、電子回路、例えばＭＰＵ（Micro Processing Unit）等の集積回路（ＩＣ；Integrated Circuit）が用いられてもよい。
【０２２１】
メモリ１０ｂは、種々のデータやプログラムを格納するハードウェアの一例である。図１に示すＩＯＤＢ１１ｂ、予測セグメントＤＢ１１ｆ、移動キュー１１ｇ、及びＩＯキュー１２ｂの少なくとも１つは、メモリ１０ｂの記憶領域によって実現されてもよい。メモリ１０ｂとしては、例えばＲＡＭ（Random Access Memory）等の揮発性メモリが挙げられる。
【０２２２】
記憶部１０ｃは、種々のデータやプログラム等を格納するハードウェアの一例である。記憶部１０ｃとしては、例えばＨＤＤ等の磁気ディスク装置、ＳＳＤ等の半導体ドライブ装置、フラッシュメモリやＲＯＭ（Read Only Memory）等の不揮発性メモリ等の各種記憶装置が挙げられる。
【０２２３】
例えば記憶部１０ｃは、階層ストレージ制御装置１０の各種機能の全部若しくは一部を実現するストレージ制御プログラム１００を格納してもよい。この場合、ＣＰＵ１０ａは、記憶部１０ｃに格納されたストレージ制御プログラム１００をメモリ１０ｂに展開して実行することにより、階層ストレージ制御装置１０の機能を実現することができる。
【０２２４】
インタフェース部１０ｄは、ＳＳＤ２０、ＨＤＤ３０、図示しないホスト装置、又は作業者の作業端末等との間の接続及び通信の制御等を行なう通信インタフェースの一例である。例えばインタフェース部１０ｄは、各種コントローラ、デバイスを接続するアダプタ、及び記録媒体１０ｆに記録されたデータやプログラムを読み出す読取部をそなえてよい。コントローラは、例えばＳＳＤ２０及びＨＤＤ３０との間の通信を制御するＩＯＣ（I/O Controller）を含んでよく、アダプタは、例えばＳＳＤ２０及びＨＤＤ３０を接続するＤＡ（Device Adapter）、及びホスト装置を接続するＣＡ（Channel Adapter）等を含んでよい。なお、ＣＡとしては、例えばＬＡＮ（Local Area Network）、ＳＡＮ（Storage Area Network）、ＦＣ（Fibre Channel）、インフィニバンド（InfiniBand）等に準拠したＣＡが挙げられる。
【０２２５】
読取部は、コンピュータ読取可能な記録媒体１０ｆを接続又は挿入可能な接続端子又は装置を含んでよい。読取部としては、例えばＵＳＢ（Universal Serial Bus）等に準拠したアダプタ、記録ディスクへのアクセスを行なうドライブ装置、ＳＤカード等のフラッシュメモリへのアクセスを行なうカードリーダ等が挙げられる。なお、記録媒体１０ｆにはストレージ制御プログラム１００が格納されてもよい。
【０２２６】
入出力部１０ｅは、マウス、キーボード、操作ボタン等の入力部、並びにディスプレイ等の出力部の少なくとも一部を含むことができる。例えば入力部は、使用者又はオペレータ等による設定の登録や変更、システムのモード選択（切替）等の各種操作やデータの入力等の作業に用いられてもよく、出力部は、作業者等による設定の確認や各種通知等の出力に用いられてもよい。
【０２２７】
なお、上述した階層ストレージ制御装置１０のハードウェア構成は例示である。従って、階層ストレージ制御装置１０内でのハードウェアの増減（例えば任意のブロックの追加や省略）、分割、任意の組み合わせでの統合、バスの追加又は省略等は適宜行なわれてもよい。
【０２２８】
〔２〕その他
上述した一実施形態に係る技術は、以下のように変形、変更して実施することができる。
【０２２９】
例えば、図１に示す階層ストレージ制御装置１０の各機能ブロックは、それぞれ任意の組み合わせで併合してもよく、分割してもよい。
【０２３０】
また、ワークロード分析部１１ｃ及び移動処理部１２ｄは、移動対象の領域をセグメント単位で決定し、移動指示部１１ｄへ階層移動を指示するものとして説明したが、これに限定されるものではない。
【０２３１】
例えばワークロード分析部１１ｃにより特定される移動対象の領域は、高負荷領域の近傍の領域を繋ぎ合わせた領域であってもよい。この場合、ワークロード分析部１１ｃは、移動対象のセグメントの情報として、例えばセグメントＩＤ又はオフセットの範囲を表す情報を移動制御部１１ｅ又は移動指示部１１ｄへ通知してもよい。
【０２３２】
移動制御部１１ｅは、予測移動制御においては、通知された範囲に含まれる複数のセグメントの情報及び当該範囲の領域サイズに基づいて、将来ＩＯが集中する同じサイズの領域を予測すればよい。
【０２３３】
この予測の手法としては、例えば通知された範囲の先頭オフセット、中間のオフセット、又は最終オフセット等の任意のセグメントを代表セグメントとし、代表セグメントについて、移動制御部１１ｅが予測セグメントを算出することが挙げられる。この場合、移動制御部１１ｅは、通知された範囲に含まれるセグメントの数に基づき、補正後の予測セグメントの範囲を求めて移動指示部１１ｄへ通知すればよい。
【０２３４】
或いは、移動制御部１１ｅは、通知された範囲に含まれる複数のセグメントの各々について、それぞれ予測セグメントを求めてもよい。
【０２３５】
また、観測移動制御においては、通知された範囲に含まれる複数のセグメントの各々の情報が移動キュー１１ｇに格納される。従って、移動制御部１１ｅは、ＩＯレスポンスの悪化を検出しない場合には、一実施形態で説明したように、移動キュー１１ｇ内の各セグメントを順番に読み出して移動指示部１１ｄへ階層移動を指示すればよい。
【０２３６】
なお、移動指示部１１ｄは、通知された範囲に含まれる複数のセグメントの各々について、階層ドライバ１２へ移動指示を発行すればよい。
【０２３７】
上述した実施形態では、遷移速度算出部１１ｈ及び成長時間算出部１１ｉとしての機能をワークロード分析部１１ｃにそなえた場合について説明したが、これに限定されるものではない。遷移速度算出部１１ｈ及び成長時間算出部１１ｉとしての機能は、階層管理部１１内（例えば移動制御部１１ｅ等）にそなえられていればよい。
【０２３８】
また、上述した実施形態では、本発明を階層ストレージに適用した場合について説明したが、これに限定されるものでなく、本発明は、ＳＳＤ等の第１の記憶装置がキャッシュメモリである場合についても上述した実施形態と同様に適用され、上述した実施形態と同様の作用効果を得ることができる。
【０２３９】
〔３〕付記
以上の実施形態に関し、更に以下の付記を開示する。
【０２４０】
（付記１）
第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させる情報処理装置であって、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集する収集部と、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定する決定部と、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出する遷移速度算出部と、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出する成長時間算出部と、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、前記決定部によって決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する予測部と、をそなえる、情報処理装置。
【０２４１】
（付記２）
第１タイミングで、前記決定部によって決定された前記移動対象の単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する一方、前記第１タイミングとは異なる第２タイミングで、前記予測部によって予測された前記遷移先単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する移動部をそなえる、付記１に記載の情報処理装置。
【０２４２】
（付記３）
前記複数の単位領域のそれぞれには、前記複数の単位領域の配置順に対応して変化する昇順または降順の数値が、各単位領域を特定する識別情報として割り当てられ、
前記遷移速度算出部は、
前記アクセスログから、前記所定タイミング毎に、前記複数の単位領域のうちアクセス数が最大の単位領域の識別情報を抽出し、
前記所定タイミング毎に抽出された複数の識別情報の数値から、前後する二つの識別情報の数値の差が所定範囲内である、連続する二以上の識別情報の数値を含むグループが抽出された場合、前記グループの終点における前記識別情報の数値と前記グループの始点における前記識別情報の数値との差分と、前記グループの始点から終点までに要する経過時間と、に基づき、前記遷移速度を算出する、付記１または付記２に記載の情報処理装置。
【０２４３】
（付記４）
前記成長時間算出部は、
前記アクセスログから、前記所定タイミング毎に、ＩＯ数の大きい上位ｎ個の単位領域の識別情報及びアクセス数を抽出し、
前記アクセスログから、最新の所定タイミングでアクセス数が最大の単位領域の最新識別情報を抽出し、
前記所定タイミング毎に抽出された前記上位ｎ個の単位領域の識別情報及びアクセス数を参照することで、前記最新の所定タイミングよりも前のタイミングにおいて、前記最新識別情報の単位領域のアクセス数が前記所定値を超える最古の所定タイミングを求め、
前記最新の所定タイミングと前記最古の所定タイミングとの差分時間に基づき、前記成長時間を算出する、付記３に記載の情報処理装置。
【０２４４】
（付記５）
前記予測部は、下記計算式によって、前記遷移先単位領域の識別情報の数値を算出し、前記遷移先単位領域を予測する、付記４に記載の情報処理装置。
[前記遷移先単位領域の識別情報の数値]
＝[前記移動対象の単位領域の識別情報の数値]
+([現在時刻]-[前記移動対象の単位領域の移動時刻]+[前記成長時間])*[前記遷移速度]
【０２４５】
（付記６）
第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させるコンピュータに、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集し、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定し、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出し、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出し、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する、
処理を実行させる、ストレージ制御プログラム。
【０２４６】
（付記７）
第１タイミングで、決定された前記移動対象の単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する一方、前記第１タイミングとは異なる第２タイミングで、予測された前記遷移先単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する、
処理を、前記コンピュータに実行させる、付記６に記載のストレージ制御プログラム。
【０２４７】
（付記８）
前記複数の単位領域のそれぞれには、前記複数の単位領域の配置順に対応して変化する昇順または降順の数値が、各単位領域を特定する識別情報として割り当てられ、
前記遷移速度の算出に際し、
前記アクセスログから、前記所定タイミング毎に、前記複数の単位領域のうちアクセス数が最大の単位領域の識別情報を抽出し、
前記所定タイミング毎に抽出された複数の識別情報の数値から、前後する二つの識別情報の数値の差が所定範囲内である、連続する二以上の識別情報の数値を含むグループが抽出された場合、前記グループの終点における前記識別情報の数値と前記グループの始点における前記識別情報の数値との差分と、前記グループの始点から終点までに要する経過時間と、に基づき、前記遷移速度を算出する、
処理を、前記コンピュータに実行させる、付記６または付記７に記載のストレージ制御プログラム。
【０２４８】
（付記９）
前記成長時間の算出に際し、
前記アクセスログから、全ての単位領域の識別情報及びアクセス数を抽出し、
前記アクセスログから、最新の所定タイミングでアクセス数が最大の単位領域の最新識別情報を抽出し、
前記所定タイミング毎に抽出された前記全ての識別情報及びアクセス数を参照することで、前記最新の所定タイミングよりも前のタイミングにおいて、前記最新識別情報の単位領域のアクセス数が前記所定値を超える最古の所定タイミングを求め、
前記最新の所定タイミングと前記最古の所定タイミングとの差分時間に基づき、前記成長時間を算出する、
処理を、前記コンピュータに実行させる、付記８に記載のストレージ制御プログラム。
【０２４９】
（付記１０）
下記計算式によって、前記遷移先単位領域の識別情報の数値を算出し、前記遷移先単位領域を予測する、
処理を、前記コンピュータに実行させる、付記９に記載のストレージ制御プログラム。
[前記遷移先単位領域の識別情報の数値]
＝[前記移動対象の単位領域の識別情報の数値]
+([現在時刻]-[前記移動対象の単位領域の移動時刻]+[前記成長時間])*[前記遷移速度]
【０２５０】
（付記１１）
第１の記憶装置と、前記第１の記憶装置とは異なる性能の第２の記憶装置との間で、複数の単位領域におけるデータを移動させるストレージ制御方法であって、
前記複数の単位領域のそれぞれについてのアクセスログを、一定時間間隔の所定タイミング毎に収集し、
前記アクセスログに基づき、前記複数の単位領域の中から、アクセスが集中する集中状態の単位領域を、前記第２の記憶装置から前記第１の記憶装置への移動対象の単位領域として決定し、
前記アクセスログに基づき、前記複数の単位領域における、前記集中状態の単位領域の遷移速度を算出し、
前記アクセスログに基づき、前記所定タイミングで前記集中状態の単位領域が、当該単位領域に対する単位時間あたりのアクセス数が所定値以下の状態から前記集中状態になるまでに要する成長時間を算出し、
前記遷移速度および前記成長時間に基づき、前記集中状態の単位領域が、決定された前記移動対象の単位領域から遷移する遷移先単位領域を予測する、ストレージ制御方法。
【０２５１】
（付記１２）
第１タイミングで、決定された前記移動対象の単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する一方、前記第１タイミングとは異なる第２タイミングで、予測された前記遷移先単位領域の前記データを前記第２の記憶装置から前記第１の記憶装置へ移動する、付記１１に記載のストレージ制御方法。
【０２５２】
（付記１３）
前記複数の単位領域のそれぞれには、前記複数の単位領域の配置順に対応して変化する昇順または降順の数値が、各単位領域を特定する識別情報として割り当てられ、
前記遷移速度の算出に際し、
前記アクセスログから、前記所定タイミング毎に、前記複数の単位領域のうちアクセス数が最大の単位領域の識別情報を抽出し、
前記所定タイミング毎に抽出された複数の識別情報の数値から、前後する二つの識別情報の数値の差が所定範囲内である、連続する二以上の識別情報の数値を含むグループが抽出された場合、前記グループの終点における前記識別情報の数値と前記グループの始点における前記識別情報の数値との差分と、前記グループの始点から終点までに要する経過時間と、に基づき、前記遷移速度を算出する、付記１１または付記１２に記載のストレージ制御方法。
【０２５３】
（付記１４）
前記成長時間の算出に際し、
前記アクセスログから、前記所定タイミング毎に、ＩＯ数の大きい上位ｎ個の単位領域の識別情報及びアクセス数を抽出し、
前記アクセスログから、最新の所定タイミングでアクセス数が最大の単位領域の最新識別情報を抽出し、
前記所定タイミング毎に抽出された前記上位ｎ個の単位領域の識別情報及びアクセス数を参照することで、前記最新の所定タイミングよりも前のタイミングにおいて、前記最新識別情報の単位領域のアクセス数が前記所定値を超える最古の所定タイミングを求め、
前記最新の所定タイミングと前記最古の所定タイミングとの差分時間に基づき、前記成長時間を算出する、付記１３に記載のストレージ制御方法。
【０２５４】
（付記１５）
下記計算式によって、前記遷移先単位領域の識別情報の数値を算出し、前記遷移先単位領域を予測する、付記１４に記載のストレージ制御方法。
[前記遷移先単位領域の識別情報の数値]
＝[前記移動対象の単位領域の識別情報の数値]
+([現在時刻]-[前記移動対象の単位領域の移動時刻]+[前記成長時間])*[前記遷移速度]
【符号の説明】
【０２５５】
１    階層ストレージシステム
１０    階層ストレージ制御装置（情報処理装置）
１０ａ    ＣＰＵ
１０ｂ    メモリ
１０ｃ    記憶部
１０ｄ    インタフェース部
１０ｅ    入出力部
１０ｆ    記録媒体
１１    階層管理部
１１ａ    データ収集部（収集部）
１１ｂ    ＩＯＤＢ
１１ｃ    ワークロード分析部（決定部）
１１ｄ    移動指示部（移動部）
１１ｅ    移動制御部（予測部）
１１ｆ    予測セグメントＤＢ
１１ｇ    移動キュー
１１ｈ    遷移速度算出部
１１ｉ    成長時間算出部
１２    階層ドライバ
１２ａ    ＩＯマップ部
１２ｂ    ＩＯキュー
１２ｃ    階層テーブル
１２ｄ    移動処理部（移動部）
１２ｅ    観測処理部
１２ｆ    カウンタ
１３    ＳＳＤドライバ
１４    ＨＤＤドライバ
１００    ストレージ制御プログラム
２０    ＳＳＤ（第１の記憶装置）
３０    ＨＤＤ（第２の記憶装置）
【図１】
0006572756.tif 000002
【図２】
0006572756.tif 000003
【図３】
0006572756.tif 000004
【図４】
0006572756.tif 000005
【図５】
0006572756.tif 000006
【図６】
0006572756.tif 000007
【図７】
0006572756.tif 000008
【図８】
0006572756.tif 000009
【図９】
0006572756.tif 000010
【図１０】
0006572756.tif 000011
【図１１】
0006572756.tif 000012
【図１２】
0006572756.tif 000013
【図１３】
0006572756.tif 000014
【図１４】
0006572756.tif 000015
【図１５】
0006572756.tif 000016
【図１６】
0006572756.tif 000017
【図１７】
0006572756.tif 000018
【図１８】
0006572756.tif 000019
【図１９】
0006572756.tif 000020
【図２０】
0006572756.tif 000021
【図２１】
0006572756.tif 000022
【図２２】
0006572756.tif 000023
【図２３】
0006572756.tif 000024
【図２４】
0006572756.tif 000025
【図２５】
0006572756.tif 000026
【図２６】
0006572756.tif 000027
【図２７】
0006572756.tif 000028
【図２８】
0006572756.tif 000029
【図２９】
0006572756.tif 000030
【図３０】
0006572756.tif 000031