以下、図面を参照して実施の形態を説明する。
〔1〕概要
〔1−1〕ハイパバイザを利用するFTサーバ
フォルトトレラントサーバ(FTサーバ)とは、同じ構成の二組のハードウェアをそなえ、一方のハードウェアが故障しても、ユーザに故障の発生を気づかせることなく、他方のハードウェアによって動作を継続することが可能なコンピュータシステムである。このようなFTサーバを実現する手法の一つとして、ハイパバイザを利用する手法があり、当該手法は、ハイパバイザ上の仮想マシン(VM)をフォルトトレラント対象としている。図1は、ハイパバイザを利用するFTサーバの概念を示すブロック図である。
図1に示すFTサーバ100では、同じ構成の二組のハードウェア101,101が、イーサネットなどのインタコネクト102を介して接続されている。ここでは、一方のハードウェア101をプライマリと呼び、他方のハードウェア101をセカンダリと呼ぶ。プライマリおよびセカンダリのそれぞれにおいてはハイパバイザ103が構築され、ハイパバイザ103によって管理VM104とVM105とが構築され管理される。ここで、VM105が保護対象つまりフォールトトレラント対象であり、VM105を対象とするFT機能110がハイパバイザ103に備えられている。なお、以下では、プライマリ側の機能,構成および動作について説明するが、セカンダリ側の機能,構成および動作はプライマリ側と同様であり、その説明や図示は省略する。
FT機能110は、プライマリハードウェア101で故障が発生した場合、プライマリ側のVM105の処理をセカンダリ側のVM105に引き継がせるように機能する。FT機能110は、例えば、プライマリ側のVM105の状態(CPUコンテキストやメモリの内容など)をセカンダリ側に定期的にコピーする。これにより、FT機能110は、コピーした時点の状態をセカンダリ側に保持させ、プライマリが故障してもセカンダリが故障の発生直後から処理を再開できるようにしている。
〔1−2〕ハイパバイザによるI/Oデバイスの仮想化
上述のごとくハイパバイザを利用してFTサーバを実現する手法では、I/Oデバイス(入出力デバイス,物理デバイス)120が、ハイパバイザ103によって、仮想デバイス130として仮想化され、VM105内のOSからはI/Oデバイス120に直接アクセスすることはできない。I/Oデバイス120は、例えばイーサネットカード,ファイバチャネルカードである。I/Oデバイス120を仮想化することにより、ハイパバイザ103は、I/Oデバイス120による入出力アクセス(I/O)を監視することができる。
ここで、フォルトトレラント性を維持するためには、プライマリのI/Oデバイス120から外部へ何らかの出力を行なった直後にプライマリで故障が発生してもセカンダリが処理を引き継げなくてはならないという要件を満たす必要がある。当該要件は、一般に、“output commit”問題と呼ばれる。“output commit”問題に対応するためには、プライマリのVM105が外部へ何らかの出力を行なう際、セカンダリのVM105はプライマリと同じ状態になっている、つまり同期している必要がある。
そのため、ハイパバイザ103がI/Oを監視し、プライマリの状態とセカンダリの状態とが同期するまでI/Oデバイス120による出力を停止するという処理を行なう。当該処理を実現すべく、ハイパバイザ103は、I/Oデバイス120を仮想デバイス130として仮想化し、VM105上のOSが必ずハイパバイザ103の仮想デバイス130にアクセスするように制御する。これにより、ハイパバイザ103は、I/Oデバイス120による出力を把握することができる。
なお、図1に示す例では、ハードウェア101に、物理的なI/Oデバイス(物理デバイス)120が備えられ、ハイパバイザ103は、物理デバイス120を仮想デバイス130として仮想化する。VM105上のOSは、仮想デバイスドライバ140によって仮想デバイス130にアクセスする(図1の矢印A1参照)。仮想デバイス130へのアクセスは、管理VM104上の物理デバイスドライバ150によって物理デバイス120へのアクセスに変換される(図1の矢印A2,A3参照)。このような二段階処理により、I/Oデバイス120からの出力性能は、通常のサーバに比べて劣化する。
〔1−3〕I/Oデバイス(物理デバイス)の仮想化による性能劣化
性能劣化に特に影響するのは、上述した二段階処理に伴うデータのコピー処理である。以下、図1および図2(A)を参照しながら、例えば、ネットワークパケットをI/Oデバイス120から外部へ出力する場合の処理手順(c1)〜(c4)について説明する。なお、図2(A)は、ハイパバイザ103を利用する場合のメモリマップを示す図である。
(c1) 図2(A)に示すように、ネットワークパケットは、VM105のメモリ空間に仮想デバイスドライバ140によって用意される。
(c2) 仮想デバイスドライバ140がネットワークパケットの送信を仮想デバイス130に指示すると(図1の矢印A1参照)、ハイパバイザ103は、その指示を捉え、ネットワークパケットを、管理VM104がアクセス可能な管理VM104のメモリ空間(VM105からの受信領域)にコピーする(図2(A)の矢印A4参照)。その後、ハイパバイザ103は、管理VM104にネットワークパケットの送信の指示があったことを通知する(図1の矢印A2参照)。
(c3) 管理VM104は、ネットワークパケットを、物理デバイス120が送信可能な形式に整形してから、物理デバイス120への送信領域にコピーする(図2(A)の矢印A5参照)。その後、管理VM104は、物理デバイス120にパケットの送信指示を行なう(図1の矢印A3参照)。
(c4) 物理デバイス120は、管理VM104からの送信指示を受け、物理デバイス120への送信領域からパケットデータをDMA転送して物理デバイス120内に取り込む(図2(A)の矢印A6参照)。
なお、図1では、物理デバイスドライバ150が管理VM104に備えられている場合について説明しているが、物理デバイスドライバ150は、管理VM104ではなく、ハイパバイザ103に備えられてもよい。
一方、ハイパバイザのない、通常のサーバ環境では、図2(B)に示すように、物理デバイスは、OSのメモリ空間から、直接、DMA転送を行なう(矢印A7参照)。これに対し、図1に示すようにハイパバイザ103による物理デバイス120の仮想化を行なうと、通常のサーバ環境よりも多くの処理つまり上述した二段階処理が必要となるため、物理デバイス120による出力性能が、ハイパバイザを利用しない通常のサーバよりも劣化する。なお、図2(B)は、ハイパバイザを利用しない場合のメモリマップを示す図である。
また、物理デバイスを仮想化することによるデメリットとしては、上述した性能劣化のほかに、使用可能な物理デバイスの種類が制限されるというデメリットもある。VM内のOSが使用可能なデバイスは、仮想デバイスとしてエミュレートしている機能がサポートしている物理デバイスのみである。したがって、広く採用されていないデバイスや最新技術のデバイスをVM内のOSで使用するためには、これらのデバイスに対応するエミュレーション機能を作り込む必要があり、コストと時間がかかる。
〔1−4〕DMAリマップ機能
ところで、近年のプロセッサやチップセットには、VMによる物理デバイス利用の高速化を支援する機能が存在する。当該機能を有する技術として、例えばIntel社のVT-d(Virtualization Technology for Directed I/O)やAMD社のIOMMU(Input/Output Memory Management Unit)が挙げられる。当該機能のうち、DMAリマップ機能は、VM上のOS内のドライバが物理デバイスを直接制御できるようにする機能である。DMAリマップ機能は、具体的には以下の処理手順(d1)〜(d4)に従って動作する。
なお、図3は、DMAリマップ機能170の概要を説明する図である。図3に示す例では、保護対象のVM105に物理デバイスドライバ150が備えられるほか、ハードウェア101には、物理デバイス120,CPUサブシステム160およびDMAリマップ機能170が備えられている。CPUサブシステム160は、CPUとメモリからなるシステムである。
(d1) 物理デバイスドライバ150は、物理デバイス120から外部へデータを送出するために、VM105のメモリ空間にデータを用意し、用意したデータのあるVM105のメモリ空間のアドレスを物理デバイス120に通知する(図3の矢印A8参照)。しかし、物理デバイス120は物理メモリ空間のアドレスにしかアクセスできないため、VM105のメモリ空間のアドレスを何らかの方法で物理メモリ空間のアドレスに変換する必要がある。
(d2) 物理デバイス120は、データを送出するために、VM105のメモリ空間のアドレスからデータ転送するためのDMA転送リクエストを、DMAリマップ機能170経由でCPUサブシステム160へ発行する(図3の矢印A9,A10参照)。
(d3) このとき、DMAリマップ機能170は、物理デバイス120からのDMA転送リクエストを監視する(図3の矢印A9参照)。そして、DMAリマップ機能170は、当該リクエストを受けると、当該リクエストに含まれるVM105のメモリ空間のアドレスを、物理メモリ空間のアドレスに変換してCPUサブシステム160へ送り出す(図3の矢印A10参照)。
(d4) これにより、CPUサブシステム160は、物理メモリ空間から送出に必要なデータを物理デバイス120に送出し(図3の矢印A11参照)、物理デバイス120は、VM105のメモリ空間から、直接、DMA転送を行なうことができる(図3の矢印A12参照)。
上述したDMAリマップ機能170により、ハイパバイザ103による二段階処理がなくなり、VM105上のOSは通常のサーバと同じように物理デバイス120にアクセスできるため、性能劣化がほとんど生じない。
しかしながら、DMAリマップ機能170をFTサーバ100で利用しようとすると、ハイパバイザ103がI/Oを把握できなくなるため、上述した“output commit”問題に対応することができない。
〔1−5〕基本構成
以下に説明する実施形態では、“output commit”問題に対応しながら、つまりプライマリとセカンダリとの同期をとりながら、ハイパバイザを利用するFTサーバにおいて仮想化のオーバヘッドによる入出力アクセス性能の劣化を防ぐため、仮想マシン(VM)から物理デバイスを直接操作することを可能にする仕組みが提供される。当該仕組みは、下記手段(e1)〜(e5)によって実現される。これらの手段(e1)〜(e5)は、図4や図9を参照しながら後述するごとく、ハードウェア上にハイパバイザおよび仮想計算機(VM)を構築されたFTサーバ(情報処理装置)に適用される。ここで、VMは、入出力デバイス(I/Oデバイス,物理デバイス)を用いてデータ入出力を行なうドライバ(物理デバイスドライバ)を含む。また、ハイパバイザは、当該VMを管理するとともに、プライマリ(本情報処理装置)とセカンダリ(他の情報処理装置)との同期処理を行なう機能を果たす。
なお、以下の説明において、CPUサブシステムは、CPUおよび当該CPUに接続されるメモリを示す。また、CPUサブシステムは、図4や図9を参照しながら後述するごとく、主として、CPUコアと、メモリコントローラと、メモリと、CPUに物理デバイス(I/Oデバイス)を接続するインタフェース(例えばPCI-Express Root Complex)とを含む。
(e1) FTサーバのCPUサブシステム内においてDMAを監視する手段、つまり、FTサーバ外部へのデータ出力を検出することを可能にする手段。この手段(e1)は、主に、後述するDMAreadリクエスト監視部12およびDMAreadデータ監視部14によって実現される。つまり、手段(e1)は、CPUサブシステム内のメモリと入出力デバイスとの間で行なわれるアクセスを監視する監視部として機能する。特に、前記監視部(手段(e1))は、メモリから入出力デバイスへのデータ出力に係る読出アクセスを検出する。読出アクセスとしては、入出力デバイスからメモリへの読出リクエスト(DMAreadリクエスト)の発行、または、メモリから入出力デバイスへのデータ出力の対象データ(DMAreadデータ)の読出が検出される。
(e2) FTサーバのCPUサブシステム内において外部へのデータ出力を検出した場合に当該データ出力を検出した旨をハイパバイザに通知する手段、つまり、ハイパバイザが外部へのデータ出力を検出することを可能にする手段。この手段(e2)は、後述するDMA割込み制御部16がハイパバイザに「DMAreadリクエスト検出割込み」または「DMAreadデータ検出割込み」を通知することによって実現される。つまり、手段(e2)は、前記監視部(手段(e1))が読出アクセスを検出した場合、読出アクセスを検出した旨をハイパバイザに通知する通知部として機能する。
(e3) ハイパバイザが外部へのデータ出力を検出したことに伴いFTサーバ内の同期処理を行なっているときに、外部へのデータ出力を抑止する手段。この手段(e3)をFTサーバのCPUサブシステム内に備えることで、同期処理中に外部へデータを出力してしまいプライマリとセカンダリとの同期状態が壊れてしまうことが防止される。手段(e3)は、主に、後述するDMAreadリクエストバッファ部13およびDMAreadデータバッファ部15によって実現される。つまり、手段(e3)は、ハイパバイザが前記通知部(手段(e2))からの通知を受けるときに同期処理の実行中である場合、データ出力を抑止する抑止部として機能する。また、前記抑止部(手段(e3))は、ハイパバイザが同期処理を終了すると、データ出力の抑止を解除する。特に、前記抑止部(手段(e3))は、前記読出リクエストまたは前記対象データをバッファ部13または15に一時的に保持することによりデータ出力を抑止する。そして、前記抑止部(手段(e3))は、ハイパバイザが同期処理を終了すると、前記読出リクエストをバッファ部13からメモリ側へ送信、または、前記対象データをバッファ部15から入出力デバイスへ送信する。
(e4) I/Oデバイスからハイパバイザが提供するVMのメモリへのDMAを監視して記録する手段。この手段(e4)をFTサーバのCPUサブシステム内に備えることで、同期処理を実行するために必要なメモリの情報をハイパバイザが把握することができる。手段(e4)は、主に、後述するDMAwrite監視部11aによって実現される。手段(e4)としての機能は前記監視部に含まれる。前記監視部(手段(e4))は、入出力デバイスからメモリへのデータ書込に係る書込アクセスを検出した場合、前記メモリを管理するテーブル(後述するVMメモリ管理テーブル22)に、前記データ書込に係るアドレスに対応するデータに変更が生じたことを記録する。ハイパバイザは、前記テーブルに従って同期処理を行なう。特に、前記監視部(手段(e4))は、前記テーブルにおいて変更ビット(後述するDirtyビット)を設定することにより前記変更が生じたことを記録し、ハイパバイザは、同期処理を終了すると、変更ビットをクリアする。
(e5) 同期処理が必要ないときには、外部へのデータ出力をハイパバイザに通知しない手段。この手段(e5)をFTサーバのCPUサブシステム内に備えることで、不要な同期処理が抑制され、FTサーバの全体の性能が向上する。手段(e5)は、主に、後述するDMAreadリクエスト監視部12,DMAreadデータ監視部14,Dirtyカウンタ17aおよび保存領域17bによって実現される。ここで、カウンタ17aは、メモリにおいてデータの変更が発生した箇所の数を計数する。保存領域17bは、前回の同期処理時に参照されたカウンタ17aの計数値を保存する。そして、ハイパバイザが前記通知部(手段(e2))からの通知を受けたときに同期処理の実行中でない場合、前記監視部(手段(e1))は、カウンタ17aの値と保存領域17bの計数値とを比較する。カウンタ17aの値と保存領域17bの計数値とが不一致であれば、前記監視部(手段(e1))は、前記抑止部(手段(e3))にデータ出力を抑止させ、ハイパバイザに同期処理を実行させる。カウンタ17aの値と保存領域17bの計数値とが一致していれば、前記監視部(手段(e1))は、前記抑止部(手段(e3))にデータ出力を抑止させることなく、データ出力を実行させる。
なお、前記手段(e2)を実現する、後述のDMA割込み制御部16には、割込み要因フラグ16aが備えられている。割込み要因フラグ16aは、前記監視部(手段(e1))が、ハイパバイザに同期処理を実行させるべく、前記読出アクセスを検出したことを要因とする割込みを発生させた場合に設定される。一方、割込み要因フラグ16aは、ハイパバイザが同期処理を終了するとクリアされる。そして、前記監視部(手段(e1)は、割込み要因フラグ16aが設定されている場合にハイパバイザが同期処理の実行中であると判断する一方、割込み要因フラグ16aが未設定の場合にハイパバイザが同期処理の実行中ではないと判断する。
上述した手段(e1)〜(e5)を備えることにより、ハイパバイザがI/Oデバイスを仮想デバイスとしてエミュレートすることなく、外部へのデータの出力を検出することが可能になる。したがって、ハイパバイザはI/Oデバイスを仮想デバイスとしてエミュレートする必要がなくなり、ハイパバイザが提供するVM内の物理デバイスドライバがI/Oデバイスを直接操作できるので、外部へのデータ出力のパフォーマンスが改善される。これにより、VMの入出力アクセス性能が改善される。
また、上述した手段(e1)〜(e5)を備えることにより、FTサーバで使用する物理デバイスに対応するエミュレーション機能を作り込むことなく、広く採用されていないデバイスや最新技術のデバイスであっても、VM内のOSで使用することが可能になる。したがって、ハイパバイザを利用するFTサーバにおいて、通常のサーバで採用される物理デバイスの種類と同じ種類の物理デバイスを、容易に扱うことができる。
さらに、本実施形態(後述する第1実施形態および第2実施形態)のFTサーバは、CPUサブシステム内にI/Oデバイスが備えられた構成にも適用できる。つまり、本実施形態のFTサーバは、SoC化されたCPUを採用した構成にも適用され、高性能なFTサーバを実現することができる。
〔2〕第1実施形態のFTサーバ
以下、図4〜図8を参照しながら第1実施形態のFTサーバ(情報処理装置)1について説明する。
〔2−1〕第1実施形態のFTサーバの構成
まず、図4を参照しながら第1実施形態のFTサーバ1の構成について説明する。図4は、第1実施形態のFTサーバ1のハードウェア構成および機能構成を示すブロック図である。
図4に示す第1実施形態のFTサーバ1では、同じ構成の二組のハードウェア10,10が、イーサネットなどのインタコネクト50を介して接続されている。ここでは、一方のハードウェア10をプライマリと呼び、他方のハードウェア10をセカンダリと呼ぶ。プライマリおよびセカンダリのそれぞれにおいてはハイパバイザ20が構築され、ハイパバイザ20によって管理VM30とVM40とが構築され管理される。なお、以下では、プライマリ側の機能,構成および動作について説明するが、セカンダリ側の機能,構成および動作はプライマリ側と同様であるので、その説明や図示は省略する。
ここで、VM40が、保護対象つまりフォールトトレラント対象であり、VM40上のOS内には、後述する物理デバイス10cを制御する物理デバイスドライバ41が備えられ、VM40から物理デバイス10cを直接制御できるようになっている。また、ハイパバイザ20には、VM40を対象とするFTの制御を行なうFT制御部21と、VMメモリ空間(メモリ10b)を管理するVMメモリ管理テーブル22とが備えられている。
FT制御部21は、プライマリハードウェア10で故障が発生した場合、プライマリ側のVM40の処理をセカンダリ側のVM40に引き継がせるように機能する。FT制御部21は、例えば、プライマリ側のVM40の状態(CPUコンテキストやメモリの内容など)をセカンダリ側に定期的にコピーすることで、プライマリとセカンダリとの同期処理を行なう。これにより、FT制御部21は、コピーした時点の状態をセカンダリ側に保持させ、プライマリが故障してもセカンダリが故障の発生直後から処理を再開できるようにしている。
ハードウェア10には、CPUとメモリからなるCPUサブシステム10Aが備えられている。CPUサブシステム10Aは、CPUコア10aと、メモリおよびメモリコントローラ10bと、物理デバイス10cとを含んでいる。つまり、第1実施形態のFTサーバ1は、SoC化されたCPUを採用した構成に適用されている。さらに、CPUサブシステム10Aは、DMA制御部11,DMAreadリクエスト監視部12,DMAreadリクエストバッファ部13,DMAreadデータ監視部14,DMAreadデータバッファ部15,DMA割込み制御部16およびメモリアクセス監視部17を含む。
物理デバイス10cは、イーサネットなどの外部ネットワークへデータを出力するI/Oデバイスで、例えばイーサネットカード,ファイバチャネルカードである。なお、本実施形態において、物理デバイス10cは、上述した通りCPUサブシステム10A内に備えられているが、CPUサブシステム10A外に備えられていてもよい。
DMA制御部11は、物理デバイス10cとCPUサブシステム10A内のメモリ10bとの間で行なわれるDMAを制御するもので、DMAwrite監視部11aおよびDMAリマップ機能11bを有している。
DMAwrite監視部(監視部)11aは、前述した手段(e4)としての機能を果たすもので、DMAwrite(つまり物理デバイス10cからメモリ10bへの書込み)を監視し、VMメモリ管理テーブル22にメモリ10bの内容が変更されたことを記録する。より具体的に、DMAwrite監視部11aは、物理デバイス10cからメモリ10bへのデータ書込に係る書込アクセスを検出した場合、VMメモリ管理テーブル(例えばIntel Extended Page Table)22に、前記データ書込に係るアドレスに対応するデータに変更が生じたことを記録する。このとき、DMAwrite監視部11aは、VMメモリ管理テーブル22において、前記アドレスに対応するDirtyビット(変更ビット;図20参照)に“1”を設定することにより前記変更が生じたことを記録する。ハイパバイザ20のFT制御部21は、VMメモリ管理テーブル22に従って、変更の生じたデータをプライマリからセカンダリに転送しコピーすることで同期処理を行ない、同期処理を終了すると、Dirtyビットを“0”にクリアする。
DMAリマップ機能11bは、図3を参照しながら前述したDMAリマップ機能170と同様(上述した処理手順(d1)〜(d4)参照)、VM40上のOS内の物理デバイスドライバ41が物理デバイス10cを直接制御できるようにする機能である。
DMAreadリクエスト監視部(監視部)12は、前述した手段(e1)および(e5)としての機能を果たす。DMAreadリクエスト監視部12は、物理デバイス10cが外部へのデータ出力を行なう際に、物理デバイス10cからDMA制御部11へ発行されるDMAreadリクエスト(物理デバイス10cからメモリ10bへの読出リクエスト)を監視する。また、DMAreadリクエスト監視部12は、保存領域17b(後述)に保存される、前回の同期処理時に参照されたカウンタ17aの計数値と、Dirtyカウンタ17a(後述)の現在値とを比較する。カウンタ17aの現在値と保存領域17bの計数値とが不一致であれば、DMAreadリクエスト監視部12は、メモリ10bのデータ変更が行なわれプライマリとセカンダリとの同期がとれていない状態であると判断する。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13(後述)にDMAreadリクエストを保存させることで外部へのデータ出力を抑止させる。さらに、DMAreadリクエスト監視部12は、ハイパバイザ20のFT制御部21に同期処理を実行させるべく、DMA割込み制御部16を介してハイパバイザ20にDMAreadリクエスト(読出アクセス)を検出したこと(DMAreadリクエスト検出割込み)を通知する。一方、カウンタ17aの現在値と保存領域17bの計数値とが一致していれば、DMAreadリクエスト監視部12は、プライマリとセカンダリとの同期がとれている状態であると判断する。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13(後述)にDMAreadリクエストを保存させることなく、外部へのデータ出力を実行させる。なお、DMAreadリクエスト監視部12は、項目〔2−2−2〕で後述するごとく、物理デバイス10cからメモリ10bへデータを転送するDMAwriteリクエストを監視し検出する機能も有している。
DMAreadリクエストバッファ部(抑止部,バッファ)13は、前述した手段(e3)としての機能を果たすもので、物理デバイス10cからDMA制御部11へ発行されるDMAreadリクエストを留めておくバッファである。つまり、ハイパバイザ20がDMA割込み制御部16から「DMAreadリクエスト検出割込み」の通知を受けるときに同期処理の実行中である場合、DMAreadリクエストバッファ部13は、DMAreadリクエストを一時的に保持することにより外部へのデータ出力を抑止する。そして、DMAreadリクエストバッファ部13は、ハイパバイザ20(FT制御部21)が同期処理を終了したことに伴うDMA割込み制御部16(後述)からの指示により、保持していたDMAreadリクエストをDMA制御部11(メモリ10b側)へ送出する。
DMAreadデータ監視部(監視部)14は、前述した手段(e1)および(e5)としての機能を果たす。DMAreadデータ監視部14は、メモリコントローラ(メモリ)10bから物理デバイス10cへ読み出されるDMAreadデータ(メモリ10bから物理デバイス10cへのデータ出力の対象データ)の読出を監視する。また、DMAreadデータ監視部14は、DMAreadリクエスト監視部12と同様、保存領域17b(後述)に保存される、前回の同期処理時に参照されたカウンタ17aの計数値と、Dirtyカウンタ17a(後述)の現在値とを比較する。カウンタ17aの現在値と保存領域17bの計数値とが不一致であれば、DMAreadデータ監視部14は、メモリ10bのデータ変更が行なわれプライマリとセカンダリとの同期がとれていない状態であると判断する。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15(後述)にDMAreadデータを保存させることで外部へのデータ出力を抑止させる。さらに、DMAreadデータ監視部14は、ハイパバイザ20のFT制御部21に同期処理を実行させるべく、DMA割込み制御部16を介してハイパバイザ20にDMAreadデータ(読出アクセス)を検出したこと(DMAreadデータ検出割込み)を通知する。一方、カウンタ17aの現在値と保存領域17bの計数値とが一致していれば、DMAreadデータ監視部14は、プライマリとセカンダリとの同期がとれている状態であると判断する。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15(後述)にDMAreadデータを保存させることなく、外部へのデータ出力を実行させる。
DMAreadデータバッファ部(抑止部,バッファ)15は、前述した手段(e3)としての機能を果たすもので、メモリコントローラ(メモリ)10bから物理デバイス10cへ読み出されるDMAreadデータを留めておくバッファである。つまり、ハイパバイザ20がDMA割込み制御部16から「DMAreadデータ検出割込み」の通知を受けるときに同期処理の実行中である場合、DMAreadデータバッファ部15は、DMAreadデータを一時的に保持することにより外部へのデータ出力を抑止する。そして、DMAreadデータバッファ部15は、ハイパバイザ20(FT制御部21)が同期処理を終了したことに伴うDMA割込み制御部16(後述)からの指示により、保持していたDMAreadデータを物理デバイス10cへ送出する。
DMA割込み制御部(通知部)16は、前述した手段(e2)としての機能を果たす。DMA割込み制御部16は、ハイパバイザ20へDMAreadリクエストが検出されたことを通知するための割込みを発生させる。また、DMA割込み制御部16は、ハイパバイザ20へDMAreadデータが検出されたことを通知するための割込みを発生させる。つまり、DMA割込み制御部16は、監視部12または14がDMAreadリクエストまたはDMAreadデータを検出した場合、外部へのデータ出力を行なう読出アクセスを検出したものと判断し、読出アクセスを検出した旨を「DMAreadリクエスト検出割込み」または「DMAreadデータ検出割込み」としてハイパバイザ20に通知する。
なお、DMA割込み制御部16は、割込み要因フラグ16aを有している。割込み要因フラグ16aは、監視部12または14がハイパバイザ20(FT制御部21)に同期処理を実行させるべくDMA割込み制御部16に割込みを発生させた場合に設定される。一方、割込み要因フラグ16aは、ハイパバイザ20(FT制御部21)が同期処理を終了するとクリアされる。割込み要因フラグ16aがクリアされると、DMA割込み制御部16は、バッファ部13,15に対し、保持しているDMAreadリクエストやDMAreadデータを送出するように指示する。監視部12および14は、割込み要因フラグ16aが設定されている場合にハイパバイザ20が同期処理の実行中であると判断する一方、割込み要因フラグ16aが未設定(クリア状態)の場合にハイパバイザ20が同期処理の実行中ではないと判断する。
メモリアクセス監視部17は、CPU(CPUコア10a)のメモリ10bに対するアクセスを監視し、メモリ10bの内容が変更されたときに、VMメモリ管理テーブル22にメモリ10bの内容が変更されたことを記録する。このとき、メモリアクセス監視部17は、上述したDMAwrite監視部11aと同様、メモリ10bの内容が変更されると、VMメモリ管理テーブル22において、前記内容変更に係るアドレスに対応するDirtyビット(変更ビット;図20参照)に“1”を設定することにより変更が生じたことを記録する。ハイパバイザ20のFT制御部21は、VMメモリ管理テーブル22に従って、変更の生じたデータをプライマリからセカンダリに転送しコピーすることで同期処理を行ない、同期処理を終了すると、Dirtyビットを“0”にクリアする。
なお、メモリアクセス監視部17は、Dirtyカウンタ17aおよび保存領域17bを有している。Dirtyカウンタ17aは、メモリ10bにおいてデータの変更が発生した箇所の数を計数する。保存領域17bは、前回の同期処理時に監視部12または14によって参照されたカウンタ17aの計数値を保存する。そして、ハイパバイザ20がDMA割込み制御部16からの通知を受けたときに同期処理の実行中でない場合、監視部12または14は、Dirtyカウンタ17aの現在値と保存領域17bの計数値とを比較する。Dirtyカウンタ17aの値と保存領域17bの計数値とが不一致であれば、監視部12または14は、バッファ部13または15にデータ出力を抑止させ、ハイパバイザ20に同期処理を実行させる。一方、Dirtyカウンタ17aの現在値と保存領域17bの計数値とが一致していれば、監視部12または14は、バッファ部13または15にDMAreadリクエストまたはDMAreadデータを保存させることなく、外部へのデータ出力を実行させる。
〔2−2〕第1実施形態のFTサーバの動作
次に、図4〜図8を参照しながら、上述した第1実施形態のFTサーバ1の動作について説明する。
〔2−2−1〕外部へのデータ出力の把握動作
ここでは、まず、図4に示すFTサーバ1において、メモリ10bから物理デバイス10cへデータを転送する処理に際し、外部へのデータ出力を把握する動作(下記手順1〜手順15)について説明する。上記処理は、例えば、ネットワークパケットをネットワークカードである物理デバイス10cから外部へ出力するために、メモリ10b上のネットワークパケットをネットワークカード10cに転送する処理に該当する。
第1実施形態では、以下に説明する手順1〜手順15により、次の2点(f1)および(f2)が両立される。
(f1) VM40内の物理デバイスドライバ41が、物理デバイス10cを直接操作すること。
(f2) ハイパバイザ20のFT制御部21が、上述した“output commit”問題に対応するために外部へのデータ出力に係る読出アクセス(DMAreadリクエストの発行やDMAreadデータの読出)を把握すること。
手順1: 物理デバイスドライバ41は、物理デバイス10cを通して外部へ送出するデータをネットワークパケットとしてメモリ10b上に用意し、物理デバイス10cにデータの送出を指示する。
手順2: 物理デバイス10cは、DMA制御部11に、メモリ10bからデータを取得するためのDMAreadリクエストを送信する。
手順3: 物理デバイス10cとDMA制御部11との間に備えられるDMAreadリクエスト監視部12は、物理デバイス10cからのDMAreadリクエストを検出する。ここで、FT制御部21が同期処理を実行する必要がある場合、DMAreadリクエスト監視部12は、FT制御部21に同期制御開始を指示する必要がある。そのために、DMAreadリクエスト監視部12は、まず、FT制御部21が既に同期処理中か否かを確認する。具体的に、DMAreadリクエスト監視部12は、DMA割込み制御部16において割込み要因フラグ16aがクリアされずに残っているか否かを確認する。割込み要因フラグ16aがクリアされずに残っているとき、つまり割込み要因フラグ16aが設定されているときには、FT制御部21が同期処理中とみなすことができるので、“output commit”問題に対応すべくDMA処理を保留する必要がある。このため、DMAreadリクエスト監視部12は、DMAreadリクエストをDMAreadリクエストバッファ部13に送出して保持させる。これにより、物理デバイス10cから外部へのデータ出力が抑止される。一方、割込み要因フラグ16aがクリアされているときは、FT制御部21が同期処理を実行していないとみなせる。その場合、DMAreadリクエスト監視部12は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する。Dirtyカウンタ17aの現在値と保存領域17bの値とが異なっている場合、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなすことができる。そこで、DMAreadリクエスト監視部12は、FT制御部21に同期処理を実行させるべく、DMA割込み制御部16にDMAreadリクエスト検出割込みをハイパバイザ20に対して発生させるように要請する。このとき、DMA割込み制御部16の割込み要因フラグ16aが設定される。この後、DMAreadリクエスト監視部12は、DMAreadリクエストをDMAreadリクエストバッファ部13に送出して保持させる。これにより、物理デバイス10cから外部へのデータ出力が抑止される。なお、Dirtyカウンタ17aの現在値と保存領域17bの値とが同じ場合、プライマリとセカンダリとの同期がとれているとみなすことができる。そこで、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13にDMAreadリクエストを保存させることなくDMA制御部11へ送信し、外部へのデータ出力を実行させる。
手順4: DMA割込み制御部16は、予めハイパバイザ20のFT制御部21により設定された割込み送信先に、DMAreadリクエスト検出割込みを送信する。なお、DMA割込み制御部16は、例えば、図15(A)〜図15(C)を参照しながら後述する、FT制御部21によって設定される監視対象PCIeデバイス管理テーブル16bを参照して、割込み送信先を判断する。
手順5: DMAreadリクエスト検出割込みを受けたCPUは、制御をVM40からハイパバイザ20に移す。ハイパバイザ20のFT制御部21は、割込み要因がDMAreadリクエスト検出割込みであることが判明すると、同期処理を実行する。つまり、FT制御部21は、VMメモリ管理テーブル22に記録されているメモリ変更記録を参照し、変更されたメモリ内容(前回同期処理を行なってから今回同期処理を行なうまでの間のメモリ差分)を全てプライマリからセカンダリへインタコネクト50を通じて送信する。また、CPUのコンテキストもプライマリからセカンダリに送信する。
手順6: セカンダリのハイパバイザ20のFT制御部21は、プライマリからメモリ差分とCPUコンテキスト情報とを受けとり、セカンダリのVM40のメモリおよびCPUに反映する。その後、セカンダリのハイパバイザ20のFT制御部21は、インタコネクト50を通じてプライマリへ応答を返す。同期処理の高速化のため、プライマリへの応答は、メモリ差分とCPUコンテキスト情報とを受け取った直後に行なってもよい。
手順7: プライマリのハイパバイザ20のFT制御部21は、セカンダリからの応答を受け取ると、同期処理が完了したとみなし、DMA割込み制御部16の割込み要因フラグ16aをクリアする。
手順8: DMAread リクエストバッファ部13は、外部へのデータ出力を抑止すべきときに、DMAreadリクエストを保存して留めておく。留めておいたDMAreadリクエストをDMAreadリクエストバッファ部13からDMA制御部11へ送出する契機は、FT制御部21が同期処理を完了してDMA割込み制御部16に割込み要因フラグ16aのクリアを指示したときである。このとき、DMAreadリクエストバッファ部13は、FT制御部21が同期処理を終了したことに伴うDMA割込み制御部16からの指示により、DMAreadリクエストをDMA制御部11へ送信する。
手順9: DMA制御部11は、DMAリマップ機能11bを用いて、DMAreadリクエスト内に含まれるアドレスをVMアドレス空間から物理アドレス空間に変換する。つまり、DMA制御部11は、予めハイパバイザ20のFT制御部21が用意した、VMメモリアドレスと物理メモリアドレスとの変換テーブル(例えばIntel VT-d DMA remapping table)を参照し、DMAreadリクエスト内に含まれるアドレスの変換を行なう。そして、DMA制御部11は、メモリコントローラ(メモリ)10bへメモリアクセスリクエストを送信し、メモリコントローラ(メモリ)10bからデータを受信する。
手順10: DMA制御部11は、手順9でメモリ10bから受信したデータを、DMAreadデータとして物理デバイス10cへ送信する。実際には、DMAreadデータは、DMAreadデータ監視部14へ送出される。
手順11: DMAreadデータ監視部14は、DMAreadデータを1つ受ける毎にDMA割込み制御部16に割込み要因フラグがクリアされずに残っているか否かを確認する。割込み要因フラグ16aがクリアされずに残っているとき、FT制御部21が同期処理中であるので、“output commit”問題に対応すべくDMA処理を保留する必要がある。このため、DMAreadデータ監視部14は、DMAreadデータをDMAreadデータバッファ部15に送出して保持させる。これにより、物理デバイス10cから外部へのデータ出力が抑止される。一方、割込み要因フラグ16aがクリアされているときは、FT制御部21が同期処理を実行していないとみなせる。その場合、DMAreadデータ監視部14は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する。Dirtyカウンタ17aの現在値と保存領域17bの値とが異なっている場合、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなすことができる。そこで、DMAreadデータ監視部14は、FT制御部21に同期処理を実行させるべく、DMA割込み制御部16にDMAreadデータ検出割込みをハイパバイザ20に対して発生させるように要請する。このとき、DMA割込み制御部16の割込み要因フラグ16aが設定される。この後、DMAreadデータ監視部14は、DMAreadデータをDMAreadデータバッファ部15に送出して保持させる。これにより、物理デバイス10cから外部へのデータ出力が抑止される。なお、Dirtyカウンタ17aの現在値と保存領域17bの値とが同じ場合、プライマリとセカンダリとの同期がとれているとみなすことができる。そこで、DMAreadデータ監視部14は、DMAreadデータバッファ部15にDMAreadデータを保存させることなく物理デバイス10cへ送信し、外部へのデータ出力を実行させる。
手順12: DMA割込み制御部16は、予めハイパバイザ20のFT制御部21により設定された割込み送信先に、DMAreadデータ検出割込みを送信する。このときも、手順4と同様、DMA割込み制御部16は、例えば、図15(A)〜図15(C)を参照しながら後述する、FT制御部21によって設定される監視対象PCIeデバイス管理テーブル16bを参照して、割込み送信先を判断する。
手順13: DMAreadデータ検出割込みを受けたCPUは、制御をVM40からハイパバイザ20に移す。以後、ハイパバイザ20のFT制御部21は、上述した手順5〜手順7と同様の手順で同期処理を実行する。
手順14: DMAreadデータバッファ部15は、外部へのデータ出力を抑止すべきときに、DMAreadデータを保存して留めておく。留めておいたDMAreadデータをDMAreadデータバッファ部15から物理デバイス10cへ送出する契機は、FT制御部21が同期処理を完了してDMA割込み制御部16に割込み要因フラグ16aのクリアを指示したときである。このとき、DMAreadデータバッファ部15は、FT制御部21が同期処理を終了したことに伴うDMA割込み制御部16からの指示により、DMAreadデータを物理デバイス10cへ送信する。
手順15: 物理デバイス10cは、DMAreadデータを受け取って、DMAreadデータの転送を行なうことにより、DMA転送を完了する。
以上の手順1〜手順15により、VM40上の物理デバイスドライバ41が物理デバイス10cを直接操作しながら、外部へのデータ出力に係る読出アクセスが検出され、外部へのデータ出力が実行される前に必要な同期処理を行なうことができる。
〔2−2−2〕DMAwrite転送によるメモリ差分の把握動作
次に、図4に示すFTサーバ1において、物理デバイス10cからメモリ10bへデータを転送する処理に際し、DMAwrite転送によるメモリ差分を把握する動作(下記手順21〜手順24)について説明する。上記処理は、例えば、外部からのネットワークパケットをネットワークカードである物理デバイス10cが受信し、ネットワークカード10cからメモリ10b上へネットワークパケットを転送する処理に該当する。
第1実施形態では、以下に説明する手順21〜手順24により、ハイパバイザ20のFT制御部21は、物理デバイス10cからVM40のメモリにDMA転送されたデータを、メモリ差分として把握することができる。
既存の技術では、物理デバイス10cからハイパバイザ20がデータを受け取り、ハイパバイザ20が、受け取ったデータをVM40のメモリに書き込んでいたので、ハイパバイザ20は、前回の同期処理後に変更されたメモリ差分を把握することができていた。しかし、本実施形態では、ハイパバイザ20を介さずに物理デバイス10cからVM40のメモリにデータが直接書き込まれるため、以下の手順21〜手順24により書き込まれたデータの位置(アドレス)および量を、後からハイパバイザ20が把握できるようにする必要がある。
手順21: 物理デバイス10cは、VM40のメモリアドレスに対してDMAwriteリクエストを送信する。
手順22: DMAreadリクエスト監視部12は、DMAwriteリクエストをDMA制御部11に送信する。
手順23: DMA制御部11のDMAリマップ機能11bは、予めハイパバイザ20のFT制御部21が用意した、VMメモリアドレスと物理メモリアドレスとの変換テーブルを参照し、DMAwriteリクエスト内に含まれるアドレスの変換を行なう。つまり、DMAリマップ機能11bは、DMAwriteリクエスト内の物理メモリアドレスをVMメモリアドレスに変換する。
手順24: DMAwrite監視部11aは、ハイパバイザ20のVMメモリ管理テーブル22を参照し、当該テーブル22において、DMAwriteリクエスト内のアドレスに対応するDirtyビット(変更ビット;図20参照)に“1”を設定する。これにより、DMAwriteリクエスト内のアドレスに対応するデータに変更が生じたことが、VMメモリ管理テーブル22に記録される。その後、DMAwrite監視部11aは、メモリコントローラ(メモリ)10bへメモリアクセスリクエストを送信する。
以上の手順21〜手順24により、VMメモリ管理テーブル22にメモリの変更があったことが記録されるので、ハイパバイザ20のFT制御部21は、同期処理時に、プライマリからセカンダリに転送すべきメモリ変更差分を確実に把握することができる。
〔2−2−3〕DMAreadリクエスト監視部の動作
次に、図5に示すフローチャート(ステップS101〜S109)に従って、図4に示すFTサーバ1におけるDMAreadリクエスト監視部12の処理(動作)について説明する。ここで説明するDMAreadリクエスト監視部12の処理(動作)は、上述した手順3で実行される。
DMAreadリクエスト監視部12は、物理デバイス10cからのDMAパケットを待機し(ステップS101)、DMAパケットが来ない場合(ステップS102のNOルート)、ステップS101の処理に戻る。DMAパケットが来た場合(ステップS102のYESルート)、DMAreadリクエスト監視部12は、受信したDMAパケットがDMAreadリクエストであるか否かを判断する(ステップS103)。
DMAパケットがDMAreadリクエストでない場合(ステップS103のNOルート)、DMAreadリクエスト監視部12は、受信したDMAパケットをDMA制御部11に出力し(ステップS109)、処理を終了する。
一方、DMAパケットがDMAreadリクエストである場合(ステップS103のYESルート)、DMAreadリクエスト監視部12は、DMA割込み制御部16に、DMAreadリクエストを検出したことによる割込み要因フラグ16aがセットされているか否かを判断する(ステップS104)。割込み要因フラグ16aがセットされている場合(ステップS104のYESルート)、DMAreadリクエスト監視部12は、FT制御部21が同期処理中であるとみなし、受信したDMAパケットつまりDMAreadリクエストをDMAreadリクエストバッファ部13に送出して保持させ(ステップS105)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が抑止される。
また、割込み要因フラグ16aがセットされていない場合(ステップS104のNOルート)、DMAreadリクエスト監視部12は、FT制御部21が同期処理を実行していないとみなす。そして、DMAreadリクエスト監視部12は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する(ステップS106)。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致しない場合(ステップS107のNOルート)、DMAreadリクエスト監視部12は、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなす。そして、DMAreadリクエスト監視部12は、どのデバイス(物理デバイス10c)からのDMAreadリクエストを検出したのかをDMA割込み制御部16に通知し、割込み要因フラグ16aをセットする(ステップS108)。これにより、DMA割込み制御部16からハイパバイザ20に対してDMAreadリクエスト検出割込みが発生され、FT制御部21が同期処理を実行する。なお、DMAreadリクエスト監視部12は、Dirtyカウンタ17aの現在値と保存領域17bの値との比較の終了後、保存領域17bの値をDirtyカウンタ17aの現在値に置き換えるようメモリアクセス監視部17に対して指示する。
この後、DMAreadリクエスト監視部12は、受信したDMAパケットつまりDMAreadリクエストをDMAreadリクエストバッファ部13に送出して保持させ(ステップS105)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が抑止される。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致する場合(ステップS107のYESルート)、DMAreadリクエスト監視部12は、プライマリとセカンダリとの同期がとれているとみなす。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13にDMAreadリクエストを保存させることなくDMA制御部11へ送出し(ステップS109)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が実行される。
〔2−2−4〕DMAreadデータ監視部の動作
次に、図6に示すフローチャート(ステップS111〜S119)に従って、図4に示すFTサーバ1におけるDMAreadデータ監視部14の処理(動作)について説明する。ここで説明するDMAreadデータ監視部14の処理(動作)は、上述した手順11で実行される。
DMAreadデータ監視部14は、DMA制御部11からのDMAパケットを待機し(ステップS111)、DMAパケットが来ない場合(ステップS112のNOルート)、ステップS111の処理に戻る。DMAパケットが来た場合(ステップS112のYESルート)、DMAreadデータ監視部14は、受信したDMAパケットがDMAreadデータであるか否かを判断する(ステップS113)。
DMAパケットがDMAreadデータでない場合(ステップS113のNOルート)、DMAreadデータ監視部14は、受信したDMAパケットを物理デバイス10cに出力し(ステップS119)、処理を終了する。
一方、DMAパケットがDMAreadデータである場合(ステップS113のYESルート)、DMAreadデータ監視部14は、DMA割込み制御部16に、DMAreadデータを検出したことによる割込み要因フラグ16aがセットされているか否かを判断する(ステップS114)。割込み要因フラグ16aがセットされている場合(ステップS114のYESルート)、DMAreadデータ監視部14は、FT制御部21が同期処理中であるとみなし、受信したDMAパケットつまりDMAreadデータをDMAreadデータバッファ部15に送出して保持させ(ステップS115)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が抑止される。
また、割込み要因フラグ16aがセットされていない場合(ステップS114のNOルート)、DMAreadデータ監視部14は、FT制御部21が同期処理を実行していないとみなす。そして、DMAreadデータ監視部14は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する(ステップS116)。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致しない場合(ステップS117のNOルート)、DMAreadデータ監視部14は、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなす。そして、DMAreadデータ監視部14は、どのデバイス(物理デバイス10c)へのDMAreadデータを検出したのかをDMA割込み制御部16に通知し、割込み要因フラグ16aをセットする(ステップS118)。これにより、DMA割込み制御部16からハイパバイザ20に対してDMAreadデータ検出割込みが発生され、FT制御部21が同期処理を実行する。なお、DMAreadデータ監視部14は、Dirtyカウンタ17aの現在値と保存領域17bの値との比較の終了後、保存領域17bの値をDirtyカウンタ17aの現在値に置き換えるようメモリアクセス監視部17に対して指示する。
この後、DMAreadデータ監視部14は、受信したDMAパケットつまりDMAreadデータをDMAreadデータバッファ部15に送出して保持させ(ステップS115)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が抑止される。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致する場合(ステップS117のYESルート)、DMAreadデータ監視部14は、プライマリとセカンダリとの同期がとれているとみなす。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15にDMAreadデータを保存させることなく物理デバイス10cへ送出し(ステップS119)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が実行される。
〔2−2−5〕DMA割込み制御部の動作
次に、図7および図8に示すフローチャート(ステップS121〜S132)に従って、図4に示すFTサーバ1におけるDMA割込み制御部16の処理(動作)について説明する。ここで説明するDMA割込み制御部16の処理(動作)は、上述した手順3,手順4,手順7,手順8,手順11〜手順14に係る。
DMA割込み制御部16は、DMAreadリクエスト監視部12,DMAreadデータ監視部14,FT制御部21のいずれかからの指示を待機し(ステップS121)、指示が来ない場合(ステップS122のNOルート)、ステップS121の処理に戻る。指示が来た場合(ステップS122のYESルート)、DMA割込み制御部16は、受信した指示がDMAreadリクエスト監視部12からの指示であるか否かを判断する(ステップS123)。
受信した指示がDMAreadリクエスト監視部12からの指示である場合(ステップS123のYESルート)、DMA割込み制御部16は、予めFT制御部21により設定された割込み送信先に、DMAreadリクエスト検出割込みを送信し(ステップS124)、ステップS121の処理に戻る。
受信した指示がDMAreadリクエスト監視部12からの指示でない場合(ステップS123のNOルート)、DMA割込み制御部16は、受信した指示がDMAreadデータ監視部14からの指示であるか否かを判断する(ステップS125)。
受信した指示がDMAreadデータ監視部14からの指示である場合(ステップS125のYESルート)、DMA割込み制御部16は、予めFT制御部21により設定された割込み送信先に、DMAreadデータ検出割込みを送信し(ステップS126)、ステップS121の処理に戻る。
受信した指示がDMAreadデータ監視部14からの指示でない場合(ステップS125のNOルート)、DMA割込み制御部16は、受信した指示がFT制御部21からの指示であるか否かを判断する(ステップS127)。
受信した指示がFT制御部21からの指示でない場合(ステップS127のNOルート)、DMA割込み制御部16は、ステップS121の処理に戻る。一方、受信した指示がFT制御部21からの指示である場合(ステップS127のYESルート)、DMA割込み制御部16は、受信した指示がDMAreadリクエスト検出割込みフラグ16aのクリア指示(上記手順7,手順8参照)であるか否かを判断する(ステップS128)。
受信した指示がDMAreadリクエスト検出割込みフラグ16aのクリア指示である場合(ステップS128のYESルート)、DMA割込み制御部16は、DMAreadリクエストバッファ部13に対し、パケット(DMAreadリクエスト)をDMA制御部11へ送信するよう指示する(ステップS129;上記手順8参照)。この後、DMA割込み制御部16は、ステップS121の処理に戻る。
受信した指示がDMAreadリクエスト検出割込みフラグ16aのクリア指示でない場合(ステップS128のNOルート)、DMA割込み制御部16は、受信した指示がDMAreadデータ検出割込みフラグ16aのクリア指示(上記手順14参照)であるか否かを判断する(ステップS130)。
受信した指示がDMAreadデータ検出割込みフラグ16aのクリア指示である場合(ステップS130のYESルート)、DMA割込み制御部16は、DMAreadデータバッファ部15に対し、パケット(DMAreadデータ)を物理デバイス10cへ送信するよう指示する(ステップS131;上記手順14参照)。この後、DMA割込み制御部16は、ステップS121の処理に戻る。
受信した指示がDMAreadデータ検出割込みフラグ16aのクリア指示でない場合(ステップS130のNOルート)、受信した指示は、FT制御部21からのその他の指示であるので、DMA割込み制御部16は、当該指示に応じた適切な処理を実行する(ステップS132)。この後、DMA割込み制御部16は、ステップS121の処理に戻る。
〔2−3〕第1実施形態のFTサーバの効果
このように、第1実施形態のFTサーバ1によれば、以下のような作用効果(g1)〜(g6)を得ることができる。
(g1) ハイパバイザ20が物理デバイス10cを仮想デバイスとしてエミュレートすることなく外部へのデータの出力を検出することが可能になる。したがって、ハイパバイザ20は物理デバイス10cを仮想デバイスとしてエミュレートする必要がなくなり、ハイパバイザ20が提供するVM40内の物理デバイスドライバ41が物理デバイス10cを直接操作できるので、外部へのデータ出力のパフォーマンスが改善される。これにより、VMの入出力アクセス性能が改善される。
(g2) その際、ハイパバイザ20が外部へのデータ出力を検出したことに伴って同期処理実行中である場合には、外部へのデータ出力が抑止される。したがって、同期処理中に外部へデータを出力してしまいプライマリとセカンダリとの同期状態が壊れてしまうことが確実に防止される。
(g3) 物理デバイス10cからハイパバイザ20が提供するVM40のメモリへのDMAを監視してVMメモリ管理テーブル22に記録する機能が備えられているので、同期処理を実行するために必要なメモリ10bの情報をハイパバイザ20が確実に把握することができる。
(g4) FTサーバ1で使用する物理デバイス10cに対応するエミュレーション機能を作り込むことなく、広く採用されていないデバイスや最新技術のデバイスであっても、VM40内のOSで使用することが可能になる。したがって、ハイパバイザ20を利用するFTサーバ1において、通常のサーバで採用される物理デバイスの種類と同じ種類の物理デバイスを、容易に扱うことができる。
(g5) FTサーバ1は、CPUサブシステム10A内に物理デバイス10cが備えられた構成にも適用できる。つまり、FTサーバ1は、SoC化されたCPUを採用した構成にも適用され、高性能なFTサーバ1を実現することができる。
(g6) 本実施形態では、同期処理が必要ないときには外部へのデータ出力をハイパバイザに通知しない手段が備えられている。つまり、本実施形態では、Dirtyカウンタ17aの現在値と保存領域17bの値とが一致する場合にはプライマリとセカンダリとの同期がとれているとみなして、FT制御部21による同期処理が回避されている。したがって、不要な同期処理が抑制され、FTサーバ1の全体の性能が向上する。
〔3〕第2実施形態のFTサーバ
以下、図9〜図20を参照しながら第2実施形態のFTサーバ(情報処理装置)1′について説明する。
〔3−1〕第2実施形態のFTサーバの構成
まず、図9を参照しながら第2実施形態のFTサーバ1′の構成について説明する。図9は、第2実施形態のFTサーバ1′のハードウェア構成および機能構成を示すブロック図である。なお、既述の符号と同一の符号は、同一またはほぼ同一の部分を示している。
図9に示す第2実施形態のFTサーバ1′においても、図4に示す第1実施形態のFTサーバ1と同様、同じ構成の二組のハードウェア10′,10′が、イーサネットなどのインタコネクト50を介して接続されている。第2実施形態でも、一方のハードウェア10′をプライマリと呼び、他方のハードウェア10′をセカンダリと呼ぶ。プライマリおよびセカンダリのそれぞれにおいてはハイパバイザ20が構築され、ハイパバイザ20によって管理VM30とVM40とが構築され管理される。なお、以下では、プライマリ側の機能,構成および動作について説明するが、セカンダリ側の機能,構成および動作はプライマリ側と同様であるので、その説明や図示は省略する。
第2実施形態でも、VM40が、保護対象つまりフォールトトレラント対象であり、VM40上のOS内には、物理デバイス(I/Oデバイス)としてのPCIeデバイス10eを制御するドライバ42が備えられ、VM40からPCIeデバイス10eを直接制御できるようになっている。また、ハイパバイザ20には、第1実施形態と同様、VM40を対象とするFTの制御を行なうFT制御部21と、VMメモリ空間(メモリ10b)を管理するVMメモリ管理テーブル22とが備えられている。
ハードウェア10′には、CPUとメモリからなるCPUサブシステム10Bが備えられている。CPUサブシステム10Bは、CPUコア10aと、メモリおよびメモリコントローラ10bと、PCIeルートコンプレクス10dと、物理デバイスとしての二つのPCIeデバイス10e,10fと、メモリアクセス監視部17とを、構成要素として含んでいる。また、第2実施形態のFTサーバ1′も、SoC化されたCPUを採用した構成に適用されている。さらに、PCIeルートコンプレクス10dは、DMA制御部11,DMAreadリクエスト監視部12,DMAreadリクエストバッファ部13,DMAreadデータ監視部14,DMAreadデータバッファ部15およびDMA割込み制御部16を、構成要素として含む。
以下、各構成要素について説明する。なお、各構成要素の数については特に規定していないが、それぞれ1以上備えられている。
PCIeルートコンプレクス10dは、PCIe規格に規定されているコンポーネントであり、CPUコア10aおよびメモリコントローラ10bとPCIeデバイス10eおよび10fとを接続するコンポーネント(インタフェース)である。
DMA制御部11は、PCIeデバイス10eとCPUサブシステム10B内のメモリ10bとの間で行なわれるDMAを制御するもので、DMAwrite監視部11aおよびDMAリマップ機能11bを有している。より具体的に、DMA制御部11は、PCIeデバイス10e側から到着するPCIeトランザクションパケットを、メモリコントローラ10bへのメモリアクセス命令に変換する処理と、メモリコントローラ側から到着するメモリアクセス命令をPCIeデバイス10eへのPCIeトランザクションパケットに変換処理とを行なう。このとき、DMAリマップ機能11bによって、PCIeデバイス10e側の指定するアドレスがメモリコントローラ10b側のアドレスに変換される。このようなDMAリマップ機能11bは、例えば、Intel社のXeon E5シリーズのCPUなどに搭載されている。なお、DMAリマップ機能11bは、図3を参照しながら前述したDMAリマップ機能170と同様(上述した処理手順(d1)〜(d4)参照)、VM40上のOS内の物理デバイスドライバ41が物理デバイス10cを直接制御できるようにする機能である。
DMAwrite監視部(監視部)11aは、前述した手段(e4)としての機能を果たすもので、Memory Write Requestトランザクション(MWr;PCIeデバイス10eからメモリ10bへの書込み)を監視し、VMメモリ管理テーブル22にメモリ10bの内容が変更されたことを記録する。より具体的に、DMAwrite監視部11aは、PCIeデバイス10eからメモリ10bへのデータ書込に係る書込アクセスであるMemory Write Requestトランザクション(MWr)を検出した場合、VMメモリ管理テーブル22に、前記データ書込に係るアドレスに対応するデータに変更が生じたことを記録する。なお、第2実施形態のDMAwrite監視部11aも、第1実施形態のDMAwrite監視部11aと同様の機能を果たすので、その詳細な説明は省略する。
DMAreadリクエスト監視部(監視部)12は、前述した手段(e1)および(e5)としての機能を果たす。DMAreadリクエスト監視部12は、PCIeデバイス10eからPCIeルートコンプレクス10dへ送信されるPCIeトランザクションパケットを監視する。DMAreadリクエスト監視部12は、Memory Read Requestトランザクション(MRd;PCIeデバイス10eからPCIeルートコンプレクス10dへの読出リクエスト)を検出すると、保存領域17bに保存される、前回の同期処理時に参照されたカウンタ17aの計数値と、Dirtyカウンタ17aの現在値とを比較する。カウンタ17aの現在値と保存領域17bの計数値とが不一致であれば、DMAreadリクエスト監視部12は、メモリ10bのデータ変更が行なわれプライマリとセカンダリとの同期がとれていない状態であると判断する。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13にMemory Read Requestトランザクション(MRd)を保存させることで外部へのデータ出力を抑止させる。さらに、DMAreadリクエスト監視部12は、FT制御部21に同期処理を実行させるべく、DMA割込み制御部16を介してハイパバイザ20にMemory Read Requestトランザクション(MRd)を検出したことをMemory Read Request割込みとして通知する。一方、カウンタ17aの現在値と保存領域17bの計数値とが一致していれば、DMAreadリクエスト監視部12は、プライマリとセカンダリとの同期がとれている状態であると判断する。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13にMemory Read Requestトランザクション(MRd)を保存させることなく、外部へのデータ出力を実行させる。なお、DMAreadリクエスト監視部12は、後述するごとく、PCIeデバイス10eからメモリ10bへデータを転送するMemory Write Requestパケットを監視し検出する機能も有している。
DMAreadリクエストバッファ部(抑止部,バッファ)13は、前述した手段(e3)としての機能を果たすもので、PCIeデバイス10eからPCIeルートコンプレクス10dへ送信されるMemory Read Requestトランザクション(MRd)を留めておくバッファである。つまり、ハイパバイザ20がDMA割込み制御部16からMemory Read Request割込みの通知を受けるときに同期処理の実行中である場合、DMAreadリクエストバッファ部13は、Memory Read Requestトランザクション(MRd)を一時的に保持することにより外部へのデータ出力を抑止する。そして、DMAreadリクエストバッファ部13は、FT制御部21が同期処理を終了したことに伴うDMA割込み制御部16からの指示により、保持していたMemory Read Requestトランザクション(MRd)をDMA制御部11(メモリ10b側)へ送出する。
DMAreadデータ監視部(監視部)14は、前述した手段(e1)および(e5)としての機能を果たす。DMAreadデータ監視部14は、メモリコントローラ(メモリ)10bからPCIeデバイス10eへ送信されるPCIeトランザクションパケットを監視する。DMAreadデータ監視部14は、Completion with Dataトランザクション(CplD;メモリ10bからPCIeデバイス10eへのデータ出力の対象データの読出)を検出すると、前回の同期処理時に参照されたカウンタ17aの計数値と、Dirtyカウンタ17aの現在値とを比較する。カウンタ17aの現在値と保存領域17bの計数値とが不一致であれば、DMAreadデータ監視部14は、メモリ10bのデータ変更が行なわれプライマリとセカンダリとの同期がとれていない状態であると判断する。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15にCompletion with Dataトランザクション(CplD)を保存させることで外部へのデータ出力を抑止させる。さらに、DMAreadデータ監視部14は、FT制御部21に同期処理を実行させるべく、DMA割込み制御部16を介してハイパバイザ20にCompletion with Dataトランザクション(CplD)を検出したことをCompletion with Data割込みとして通知する。一方、カウンタ17aの現在値と保存領域17bの計数値とが一致していれば、DMAreadデータ監視部14は、プライマリとセカンダリとの同期がとれている状態であると判断する。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15にCompletion with Dataトランザクション(CplD)を保存させることなく、外部へのデータ出力を実行させる。
DMAreadデータバッファ部(抑止部,バッファ)15は、前述した手段(e3)としての機能を果たすもので、メモリコントローラ(メモリ)10bからPCIeデバイス10eへ送信されるCompletion with Dataトランザクション(CplD)を留めておくバッファである。つまり、ハイパバイザ20がDMA割込み制御部16からCompletion with Data割込みの通知を受けるときに同期処理の実行中である場合、DMAreadデータバッファ部15は、Completion with Dataトランザクション(CplD)を一時的に保持することにより外部へのデータ出力を抑止する。そして、DMAreadデータバッファ部15は、FT制御部21が同期処理を終了したことに伴うDMA割込み制御部16からの指示により、保持していたCompletion with Dataトランザクション(CplD)をPCIeデバイス10eへ送出する。
DMA割込み制御部(通知部)16は、前述した手段(e2)としての機能を果たす。DMA割込み制御部16は、ハイパバイザ20へMemory Read Requestトランザクション(MRd)が検出されたことを通知するための割込み(Intel CPUであればVMexit)を発生させる。また、DMA割込み制御部16は、ハイパバイザ20へCompletion with Dataトランザクション(CplD)が検出されたことを通知するための割込み(Intel CPUであればVMexit)を発生させる。つまり、DMA割込み制御部16は、監視部12または14がMemory Read Requestトランザクション(MRd)またはCompletion with Dataトランザクション(CplD)を検出した場合、外部へのデータ出力を行なう読出アクセスを検出したものと判断し、読出アクセスを検出した旨を「Memory Read Request割込み」または「Completion with Data割込み」としてハイパバイザ20に通知する。
なお、DMA割込み制御部16は、割込み要因フラグ16aおよび監視対象PCIeデバイス管理テーブル16bを有している。割込み要因フラグ16aは、監視部12または14がFT制御部21に同期処理を実行させるべくDMA割込み制御部16に割込みを発生させた場合に設定される。一方、割込み要因フラグ16aは、FT制御部21が同期処理を終了するとクリアされる。割込み要因フラグ16aがクリアされると、DMA割込み制御部16は、バッファ部13,15に対し、保持しているMemory Read Requestトランザクション(MRd)やCompletion with Dataトランザクション(CplD)を送出するように指示する。監視部12および14は、割込み要因フラグ16aが設定されている場合にFT制御部21が同期処理の実行中であると判断する一方、割込み要因フラグ16aが未設定(クリア状態)の場合にFT制御部21が同期処理の実行中ではないと判断する。なお、監視対象PCIeデバイス管理テーブル16bについては、図15(A)〜図15(C)を参照しながら後述する。
メモリアクセス監視部17は、第1実施形態のメモリアクセス監視部17と同様、CPU(CPUコア10a)のメモリ10bに対するアクセスを監視し、メモリ10bの内容が変更されたときに、VMメモリ管理テーブル22にメモリ10bの内容が変更されたことを記録する。また、第2実施形態のメモリアクセス監視部17もDirtyカウンタ17aおよび保存領域17bを有している。なお、第2実施形態のメモリアクセス監視部17,Dirtyカウンタ17aおよび保存領域17bも、第1実施形態のメモリアクセス監視部17,Dirtyカウンタ17aおよび保存領域17bと同様の機能を果たすので、その詳細な説明は省略する。
PCIeデバイス10eは、イーサネットやファイバチャネルなど、システムの外部との間でデータをやり取りする機能を有する物理デバイスである。PCIeデバイス10eは、CPUサブシステムに内蔵されている場合もあるし、CPUサブシステム外に存在しCPUサブシステムとはPCIeリンクによって接続されている場合もある。第2実施形態では、図9に示すように、PCIeデバイス10eは、CPUサブシステム10Bに内蔵されている場合について説明している。PCIeデバイス10eは、DMAリマップ機能11bによりVM40上のPCIeデバイス10eのドライバ42からアクセス可能に構成されている。
PCIeデバイス10fは、プライマリとセカンダリとが通信するための機能を有する物理デバイスで、イーサネットやインフィニバンドなどのインタコネクト50に接続される。PCIeデバイス10fは、CPUサブシステムに内蔵されている場合もあるし、CPUサブシステム外に存在しCPUサブシステムとはPCIeリンクによって接続されている場合もある。第2実施形態では、図9に示すように、PCIeデバイス10fは、CPUサブシステム10Bに内蔵されている場合について説明している。
ハイパバイザ20は、管理VM30およびVM40を構築し管理するもので、前述の通り、FT制御部21およびVMメモリ管理テーブル22を有している。
VMメモリ管理テーブル22は、VM40に割り当てるメモリを管理するためのテーブルであり、VMメモリ管理テーブル22としては、例えばIntel社のExtended Page Tableが用いられる。また、VMメモリ管理テーブル22は、VM40の物理メモリアドレスとシステムの物理アドレスとの対応情報を保持する。さらに、VMメモリ管理テーブル22は、CPU(CPUコア10a)から書込アクセスがあったメモリの情報を保持する。なお、VMメモリ管理テーブル22の詳細な構成については、図20を参照しながら後述する。
FT制御部21は、第1実施形態のFT制御部21と同様、フォールトトレラント機能を実現するために、以下の「同期処理」を実行する。FT制御部21は、DMA割込み制御部16からの割込み(例えばVMexit)を契機として、VM40のCPUコンテキストとVMのメモリ内容とをセカンダリにPCIeデバイス10fを利用して送信する。当該契機となる割込み要因は、PCIeデバイス10eからPCIeルートコンプレクス10dへのMemory Read Requestトランザクション(MRd)の検出、または、PCIeルートコンプレクス10dからPCIeデバイス10eへのCompletion with Dataトランザクション(CplD)の検出である。VM40のCPUコンテキストは、例えばVMexitにおいてはメモリ10b上にCPUによって退避される。また、プライマリからセカンダリへ送信されるVM40のメモリ内容は、前回VM40のメモリ変更部分を送付してから今回送付するまでの間に、VM40のメモリ内容について変更された部分だけとする。これにより、同期処理に伴う送信時間を短縮することができる。上述のごとくVM40のメモリ内容について変更された部分だけを送信可能にすべく、FT制御部21は、VMメモリ管理テーブル22を検索し、CPUから書込アクセスがあったメモリ変更部分(Dirtyビットに“1”が設定されているアドレスに対応するデータ)をセカンダリに送信する。FT制御部21は、メモリ変更部分をセカンダリに送信すると、VMメモリ管理テーブル22においてメモリ変更部分に対応するアドレスに設定されているDirtyビットを“0”にクリアする。このようなDirtyビットを用いることで、次回のセカンダリへのメモリ変更部分の送信時に、FT制御部21は、今回との差分を確実に検出することができる。
VM40は、前述した通り、ハイパバイザ20によって構築される仮想マシンである。VM40内で動作するOSは、PCIeデバイス10eのドライバ42により、PCIeデバイス10eを使用して外部とデータのやり取りを実施する。
〔3−2〕第2実施形態のFTサーバの動作
次に、図10〜図20を参照しながら、上述した第2実施形態のFTサーバ1′の動作について説明する。
〔3−2−1〕PCIeトランザクション
まず、図10における符号(1)〜(9)と、図11に示すフローチャート(ステップS201〜S209)とに従って、図12および図13を参照しながら、図9に示すFTサーバ1′の動作について説明する。以下の説明における項目(1)〜(9)の手順は、それぞれ図10における符号(1)〜(9)に対応している。また、図11のステップS201〜S209は、それぞれ項目(1)〜(9)の手順に対応している。
なお、図10は、図9に示すFTサーバ1′におけるPCIeトランザクションの例を説明する図であり、特に、本システムがPCIeデバイス10eを経由して外部にデータを送出するときのPCIeトランザクションに注目した図である。また、図11は、図9に示すFTサーバ1′におけるシステム外へのデータ送出処理の概要を説明するフローチャートである。図12は、図9に示すFTサーバ1′におけるデータ転送時のメモリマップ例を示す図である。図13は、図9に示すFTサーバ1′におけるVMアドレスと物理アドレスとのメモリマッピング例を示す図である。
(1) VM40上のPCIeデバイス10eのドライバ42は、図12に示すように、外部にデータを送出するために、VM40に割り当てられたメモリ上に、送出したいデータ(data)を書き込む。また、同ドライバ42は、当該データのVM40のメモリ上のアドレス(address)と長さ(length)をVM40のメモリ上の領域に書き込む(図10の(1)および図11のステップS201参照)。このアドレスと長さを書き込むメモリ領域のアドレスは、事前にPCIeデバイス10eのドライバ42により、PCIeデバイス10eに通知されている。
(2) VM40上のPCIeデバイス10eのドライバ42は、PCIeデバイス10eにデータの送出を指示するために、PCIeデバイス10eのレジスタにデータ送出指示(データ転送指示)を書き込む。PCIeデバイス10eのレジスタは、図13に示すように、VM40のメモリにメモリマップされているので、メモリマップされたレジスタへの書込みは、メモリコントローラ10bによってPCIeルートコンプレクス10dに送られる。そして、PCIeルートコンプレクス10dは、上記レジスタへの書込みに応じて、Memory Write Requestトランザクションパケット(MWr)を生成してPCIeデバイス10eへ送信する(図10の(2) Request DMA transfer,図10の矢印A21および図11のステップS202参照)。
(3) PCIeデバイス10eは、Memory Write Requestトランザクションパケットの内容に基づきデータ送出指示が与えられたことを知る。このデータ送出指示に応じて、PCIeデバイス10eは、PCIeルートコンプレクス10dにMemory Read Requestトランザクションパケット(MRd)を送信する(図10の(3) Request address/length,図10の矢印A22および図11のステップS203参照)。ここでPCIeルートコンプレクス10dに送信されるパケットの内容は、address/length情報の取得指示である。
(4) Memory Read RequestトランザクションパケットがPCIeルートコンプレクス10dに到着すると、DMAreadリクエスト監視部12がMemory Read Requestトランザクションパケットを検出し、以下の項目(4-1)〜(4-5)の処理が実行される(図10の(4) Syncおよび図11のステップS204参照)。
(4-1) DMAreadリクエスト監視部12は、PCIeルートコンプレクス10dに到着するPCIeトランザクションパケットを監視する。到着したパケットがVM40に割り合てられていないPCIeデバイス(例えば図9に示すPCIeデバイス10f)からのパケットである場合、DMAreadリクエスト監視部12は、単にDMA制御部11にそのパケットを送付する。この送付処理は、後述する図14のステップS213のNOルートからステップS219の処理に相当する。どのPCIeデバイスからのPCIeトランザクションパケットであるかは、パケットのヘッダを参照することで判別することができる。その判別方法は、PCI-Express仕様の範囲内である。
(4-2) さて、PCIeデバイス10eからのMemory Read Requestトランザクションパケット(MRd)を検出したDMAreadリクエスト監視部12は、FT制御部21が同期処理中か否かを判断するために、DMA割込み制御部16においてMemory Read Request割込またはCompletion with Data割込みの要因フラグ16aがセットされているか否かを確認する。もしセットされていれば、DMAreadリクエスト監視部12は、FT制御部21が同期処理中とみなせるので、検出したMemory Read RequestトランザクションパケットをDMAreadリクエストバッファ部13へ送信する。DMAreadリクエストバッファ部13は、送信されたパケットをFIFO(First-in First-out)バッファに入れる。これにより、PCIeデバイス10eから外部へのデータ出力が抑止される。
(4-3) DMA割込み制御部16において割込み要因フラグ16aがセットされていなければ、DMAreadリクエスト監視部12は、FT制御部21が同期処理中ではないとみなせる。ここで、DMAreadリクエスト監視部12は、Dirtyカウンタ17aの現在値(現在の計数値)を参照する。また、保存領域17bには、前回Dirtyカウンタ17aを参照したときの計数値が保存されている。DMAreadリクエスト監視部12は、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する。カウンタ17aの現在値と保存領域17bの値とが異なる場合、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなせる。そこで、DMAreadリクエスト監視部12は、FT制御部21に同期処理を実行させるべく、DMA割込み制御部16に、Memory Read Requestトランザクションパケットを検出したことを要因とする割込み(VMexit)を発生させる。このとき、DMA割込み制御部16の割込み要因フラグ16aが設定される。
(4-4) 上記項目(4-3)で発生された割込みを検知したFT制御部21は、同期処理を行なう。同期処理を完了したFT制御部21は、割込み要因フラグ16aをクリアし、VM40に処理を移す。割込み要因フラグ16aをクリアしたとき、DMA割込み制御部16は、DMAreadリクエストバッファ部13に対し、留めているMemory Read RequestトランザクションパケットをDMA制御部11へ送信する指示を出す。この指示を受けたDMAreadリクエストバッファ部13は、留めている全てのMemory Read RequestトランザクションパケットをDMA制御部11へ送信する。なお、FT制御部21の同期処理は、第1実施形態の手順5および手順6と同様にして実行されるので、ここでは、その説明を省略する。
(4-5) DMA割込み制御部16において割込み要因フラグ16aがセットされておらず、カウンタ17aの現在値と保存領域17bの値とが一致していた場合、プライマリとセカンダリとの同期がとれており同期処理すべきメモリ差分が存在しない。したがって、DMAreadリクエスト監視部12は、Memory Read RequestトランザクションパケットをDMA制御部11へ送信する。この送信処理は、後述する図14のステップS217のYESルートからステップS219の処理に相当する。以上の処理により、不要な割込みを削減することができるので、システム全体の処理が高速化する。
(5) DMA制御部11は、Memory Read Requestトランザクションパケットを受信すると、DMAリマップ機能11bを用いて、当該パケットの内容をメモリコントローラ10bへの指示に変換し、メモリの内容(ここではaddress/length)を読み出す(図10の矢印A23参照)。そして、DMA制御部11は、メモリ10bから読み出した内容をCompletion with Dataトランザクションパケット(CplD)に格納してPCIeデバイス10eに送信する(図10の矢印A24/(5) Get address/lengthおよび図11のステップS205参照)。
(6) Completion with Dataトランザクションパケットを取得したPCIeデバイス10eは、当該パケットに格納されているaddress/lengthを参照する。そして、PCIeデバイス10eは、参照したアドレスからデータ(data)を読み出すべく、Memory Read Requestトランザクションパケット(MRd)をPCIeルートコンプレクス10dへ送信する(図10の(6) Request data/矢印A25および図11のステップS206参照)。なお、データの長さが長ければ、複数のMemory Read Requestトランザクションパケットが送信される場合もある。
(7) Memory Read Requestトランザクションパケットを受信したPCIeルートコンプレクス10dでは、上記項目(4)および(4-1)〜(4-5)と同様の処理が実行される(図10の(7) Syncおよび図11のステップS207参照)。なお、本項目(7)の処理を実行するのは、上記項目(4)および(4-1)〜(4-5)の処理で同期処理を実行した後であるため、同期処理すべきメモリ差分が存在しない場合が多い。
(8) DMA制御部11は、Memory Read Requestトランザクションパケットを受信すると、DMAリマップ機能11bを用いて、当該パケットの内容をメモリコントローラ10bへの指示に変換し、メモリの内容(ここではdata)を読み出す(図10の矢印A26参照)。そして、DMA制御部11は、メモリ10bから読み出した内容をCompletion with Dataトランザクションパケット(CplD)に格納してPCIeデバイス10eに送信する(図10の矢印A27/(8) Get dataおよび図11のステップS208参照)。
(9) Completion with Dataトランザクションパケットによってデータを受信したPCIeデバイス10eは、転送すべきデータ(data)を受け取って、当該データの転送を行なうことにより、DMA転送を完了する。そして、PCIeデバイスは、DMA転送が完了したことをVM40上のOSのドライバ42に知らせるために、PCI-Express仕様で規定されているMSI割込みを発行する(図10の矢印A28/(9) Completion with MSIおよび図11のステップS209参照)。MSI割込みは、具体的には、Memory Write Requestトランザクションパケット(MWr)である。
〔3−2−2〕
次に、図9に示すFTサーバ1′において、PCIeデバイス10eからVM40のメモリへデータを転送する処理に際し、FT制御部21が、DMA転送されたデータをメモリ差分として把握する動作(下記手順(11)〜手順(14))について説明する。なお、下記手順(11)〜手順(14)は、それぞれ、第1実施形態で説明した手順21〜手順24に対応している。
(11) PCIeデバイス10eは、VM40のメモリアドレスにデータを書き込むためにMemory Write Requestトランザクションパケット(MWr)を送信する。
(12) DMAreadリクエスト監視部12は、Memory Write Requestトランザクションパケット(DMAwriteリクエスト)をDMA制御部11に送信する。
(13) DMA制御部11のDMAリマップ機能11bは、予めハイパバイザ20のFT制御部21が用意した、VMメモリアドレスと物理メモリアドレスとの変換テーブルを参照し、Memory Write Requestトランザクションパケット内に含まれるアドレスの変換を行なう。つまり、DMAリマップ機能11bは、Memory Write Requestトランザクションパケット内の物理メモリアドレスをVMメモリアドレスに変換する。
(14) DMAwrite監視部11aは、ハイパバイザ20が用意したVMメモリ管理テーブル22を参照し、当該テーブル22において、Memory Write Requestトランザクションパケット内のアドレスに対応するDirtyビット(変更ビット;図20参照)に“1”を設定する。これにより、Memory Write Requestトランザクションパケット内のアドレスに対応するデータに変更が生じたことが、VMメモリ管理テーブル22に記録される。その後、DMAwrite監視部11aは、メモリコントローラ(メモリ)10bへメモリアクセスリクエストを送信する。
以上の手順(11)〜(14)により、VMメモリ管理テーブル22にメモリの変更があったことが記録されるので、ハイパバイザ20のFT制御部21は、同期処理時に、プライマリからセカンダリに転送すべきメモリ変更差分を確実に把握することができる。
〔3−2−3〕DMAreadリクエスト監視部の動作
次に、図15(A)〜図15(C)を参照しながら、図14に示すフローチャート(ステップS211〜S219)に従って、図9に示すFTサーバ1′におけるDMAreadリクエスト監視部12の処理(動作)について説明する。ここで説明するDMAreadリクエスト監視部12の処理(動作)は、上述した項目(4-1)〜(4-3)の手順で実行される。
なお、図15(A)は、PCIeトランザクションリクエストヘッダのフォーマット例を示す図、図15(B)は、PCIeトランザクション完了ヘッダのフォーマット例を示す図である。また、図15(C)は、図9に示すFTサーバ1′におけるDMA割込み制御部16の監視対象PCIeデバイス管理テーブル16bを示す図である。
DMAreadリクエスト監視部12は、PCIeデバイス10eからのPCIeトランザクションパケットを待機し(ステップS211)、パケットが来ない場合(ステップS212のNOルート)、ステップS211の処理に戻る。パケットが来た場合(ステップS212のYESルート)、DMAreadリクエスト監視部12は、受信したパケットが、監視対象PCIeデバイス10eからのMemory Read Requestトランザクションパケット(DMAreadリクエスト)であるか否かを判断する(ステップS213)。
このとき、DMAreadリクエスト監視部12は、FT制御部21によって作成された、DMA割込み制御部16における監視対象PCIeデバイス管理テーブル16b(図9および図15(C)参照)を参照することにより、監視対象PCIeデバイスを把握し、ステップS213の判断処理を行なう。さらに、DMAreadリクエスト監視部12は、図15(A)や図15(B)に示すようなPCIeトランザクションパケットのヘッダのRequesterIDを参照することで、当該パケットが監視対象PCIeデバイスに該当するか否かを判断することができる。
ハイパバイザ20がDMAリマップ機能11bを用いてVM40にPCIeデバイスを割り当てる際、FT制御部21は、図15(C)に示すように、監視対象PCIeデバイス管理テーブル16bにおいて、当該PCIeデバイスに相当するRequester IDを、当該PCIeデバイスを使用するVM40の識別子(VMID)に対応付けて設定する。DMA割込み制御部16は、本テーブル16bを参照することで、割込みを発生させるべきVM40を判断することができる(図7のステップS124,S126および図17のステップS234,S236参照)。
受信したパケットがMemory Read Requestトランザクションパケットでない場合(ステップS213のNOルート)、DMAreadリクエスト監視部12は、受信したパケットをDMA制御部11に出力し(ステップS219)、処理を終了する。
一方、受信したパケットがMemory Read Requestトランザクションパケットである場合(ステップS213のYESルート)、DMAreadリクエスト監視部12は、DMA割込み制御部16に、Memory Read Requestトランザクションパケットを検出したことによる割込み要因フラグ16aがセットされているか否かを判断する(ステップS214)。割込み要因フラグ16aがセットされている場合(ステップS214のYESルート)、DMAreadリクエスト監視部12は、FT制御部21が同期処理中であるとみなし、受信したパケットをDMAreadリクエストバッファ部13に送出して保持させ(ステップS215)、処理を終了する。これにより、PCIeデバイス10eから外部へのデータ出力が抑止される。
また、割込み要因フラグ16aがセットされていない場合(ステップS214のNOルート)、DMAreadリクエスト監視部12は、FT制御部21が同期処理を実行していないとみなす。そして、DMAreadリクエスト監視部12は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する(ステップS216)。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致しない場合(ステップS217のNOルート)、DMAreadリクエスト監視部12は、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなす。そして、DMAreadリクエスト監視部12は、どのデバイス(PCIeデバイス10e)からのMemory Read Requestトランザクションパケットを検出したのかをDMA割込み制御部16に通知し、割込み要因フラグ16aをセットする(ステップS218)。これにより、DMA割込み制御部16からハイパバイザ20に対して割込みが発生され、FT制御部21が同期処理を実行する。なお、DMAreadリクエスト監視部12は、Dirtyカウンタ17aの現在値と保存領域17bの値との比較の終了後、保存領域17bの値をDirtyカウンタ17aの現在値に置き換えるようメモリアクセス監視部17に対して指示する。
この後、DMAreadリクエスト監視部12は、受信したパケットつまりMemory Read RequestトランザクションパケットをDMAreadリクエストバッファ部13に送出して保持させ(ステップS215)、処理を終了する。これにより、PCIeデバイス10eから外部へのデータ出力が抑止される。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致する場合(ステップS217のYESルート)、DMAreadリクエスト監視部12は、プライマリとセカンダリとの同期がとれているとみなす。そして、DMAreadリクエスト監視部12は、DMAreadリクエストバッファ部13にMemory Read Requestトランザクションパケットを保存させることなくDMA制御部11へ送出し(ステップS219)、処理を終了する。これにより、物理デバイス10cから外部へのデータ出力が実行される。
〔3−2−4〕DMAreadデータ監視部の動作
次に、図16に示すフローチャート(ステップS221〜S229)に従って、図9に示すFTサーバ1′におけるDMAreadデータ監視部14の処理(動作)について説明する。ここで説明するDMAreadデータ監視部14の処理(動作)は、上述した項目(7)の手順で実行される。
DMAreadデータ監視部14は、DMA制御部11からのPCIeトランザクションパケットを待機し(ステップS221)、パケットが来ない場合(ステップS222のNOルート)、ステップS221の処理に戻る。パケットが来た場合(ステップS222のYESルート)、DMAreadデータ監視部14は、受信したパケットがCompletion with Dataトランザクションパケット(DMAreadデータ)であるか否かを判断する(ステップS223)。
このとき、DMAreadデータ監視部14は、FT制御部21によって作成された、DMA割込み制御部16における監視対象PCIeデバイス管理テーブル16b(図9および図15(C)参照)を参照することにより、監視対象PCIeデバイスを把握し、ステップS223の判断処理を行なう。さらに、DMAreadデータ監視部14は、図15(A)や図15(B)に示すようなPCIeトランザクションパケットのヘッダのRequesterIDを参照することで、当該パケットが監視対象PCIeデバイスに該当するか否かを判断することができる。
受信したパケットがCompletion with Dataトランザクションパケットでない場合(ステップS223のNOルート)、DMAreadデータ監視部14は、受信したパケットをPCIeデバイス10eに出力し(ステップS229)、処理を終了する。
一方、受信したパケットがCompletion with Dataトランザクションパケットである場合(ステップS223のYESルート)、DMAreadデータ監視部14は、DMA割込み制御部16に、Completion with Dataトランザクションパケットを検出したことによる割込み要因フラグ16aがセットされているか否かを判断する(ステップS224)。割込み要因フラグ16aがセットされている場合(ステップS224のYESルート)、DMAreadデータ監視部14は、FT制御部21が同期処理中であるとみなし、受信したパケットをDMAreadデータバッファ部15に送出して保持させ(ステップS225)、処理を終了する。これにより、PCIeデバイス10eから外部へのデータ出力が抑止される。
また、割込み要因フラグ16aがセットされていない場合(ステップS224のNOルート)、DMAreadデータ監視部14は、FT制御部21が同期処理を実行していないとみなす。そして、DMAreadデータ監視部14は、同期処理を実行する必要があるか否かを確認するために、Dirtyカウンタ17aを参照し、Dirtyカウンタ17aの現在値と、前回参照したときのDirtyカウンタ17aの値(保存領域17bの値)とを比較する(ステップS226)。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致しない場合(ステップS227のNOルート)、DMAreadデータ監視部14は、FT制御部21による同期処理が必要なメモリ差分がVMメモリ10b上に存在しているとみなす。そして、DMAreadデータ監視部14は、どのデバイス(PCIeデバイス10e)へのCompletion with Dataトランザクションパケットを検出したのかをDMA割込み制御部16に通知し、割込み要因フラグ16aをセットする(ステップS228)。これにより、DMA割込み制御部16からハイパバイザ20に対して割込みが発生され、FT制御部21が同期処理を実行する。なお、DMAreadデータ監視部14は、Dirtyカウンタ17aの現在値と保存領域17bの値との比較の終了後、保存領域17bの値をDirtyカウンタ17aの現在値に置き換えるようメモリアクセス監視部17に対して指示する。
この後、DMAreadデータ監視部14は、受信したDMAパケットつまりCompletion with DataトランザクションパケットをDMAreadデータバッファ部15に送出して保持させ(ステップS225)、処理を終了する。これにより、PCIeデバイス10eから外部へのデータ出力が抑止される。
Dirtyカウンタ17aの現在値と保存領域17bの値とが一致する場合(ステップS227のYESルート)、DMAreadデータ監視部14は、プライマリとセカンダリとの同期がとれているとみなす。そして、DMAreadデータ監視部14は、DMAreadデータバッファ部15にCompletion with Dataトランザクションパケットを保存させることなくPCIeデバイス10eへ送出し(ステップS229)、処理を終了する。これにより、PCIeデバイス10eから外部へのデータ出力が実行される。
〔3−2−5〕DMA割込み制御部の動作
次に、図17および図18に示すフローチャート(ステップS231〜S242)に従って、図9に示すFTサーバ1′におけるDMA割込み制御部16の処理(動作)について説明する。ここで説明するDMA割込み制御部16の処理(動作)は、上述した項目(4-4), (4-5), (7)の手順で実行される。
DMA割込み制御部16は、DMAreadリクエスト監視部12,DMAreadデータ監視部14,FT制御部21のいずれかからの指示を待機し(ステップS231)、指示が来ない場合(ステップS232のNOルート)、ステップS231の処理に戻る。指示が来た場合(ステップS232のYESルート)、DMA割込み制御部16は、受信した指示がDMAreadリクエスト監視部12からの指示であるか否かを判断する(ステップS233)。
受信した指示がDMAreadリクエスト監視部12からの指示である場合(ステップS233のYESルート)、DMA割込み制御部16は、予めFT制御部21により設定された割込み送信先に、Memory Read Requestトランザクションパケット検出割込みを送信し(ステップS234)、ステップS231の処理に戻る。このとき、DMA割込み制御部16は、監視対象PCIeデバイス管理テーブル16bや、Memory Read RequestトランザクションパケットのヘッダのRequesterIDを参照することで、割込み送信先を判断する。
受信した指示がDMAreadリクエスト監視部12からの指示でない場合(ステップS233のNOルート)、DMA割込み制御部16は、受信した指示がDMAreadデータ監視部14からの指示であるか否かを判断する(ステップS235)。
受信した指示がDMAreadデータ監視部14からの指示である場合(ステップS235のYESルート)、DMA割込み制御部16は、予めFT制御部21により設定された割込み送信先に、DMAreadデータ検出割込みを送信し(ステップS236)、ステップS231の処理に戻る。このときも、DMA割込み制御部16は、監視対象PCIeデバイス管理テーブル16bや、Completion with DataトランザクションパケットのヘッダのRequesterIDを参照することで、割込み送信先を判断する。
受信した指示がDMAreadデータ監視部14からの指示でない場合(ステップS235のNOルート)、DMA割込み制御部16は、受信した指示がFT制御部21からの指示であるか否かを判断する(ステップS237)。
受信した指示がFT制御部21からの指示でない場合(ステップS237のNOルート)、DMA割込み制御部16は、ステップS231の処理に戻る。一方、受信した指示がFT制御部21からの指示である場合(ステップS237のYESルート)、DMA割込み制御部16は、受信した指示がMemory Read Request検出割込みフラグ16aのクリア指示であるか否かを判断する(ステップS238)。
受信した指示がMemory Read Request検出割込みフラグ16aのクリア指示である場合(ステップS238のYESルート)、DMA割込み制御部16は、DMAreadリクエストバッファ部13に対し、Memory Read RequestトランザクションパケットをDMA制御部11へ送信するよう指示する(ステップS239)。この後、DMA割込み制御部16は、ステップS231の処理に戻る。
受信した指示がMemory Read Request検出割込みフラグ16aのクリア指示でない場合(ステップS238のNOルート)、DMA割込み制御部16は、受信した指示がCompletion with Data検出割込みフラグ16aのクリア指示であるか否かを判断する(ステップS240)。
受信した指示がCompletion with Data検出割込みフラグ16aのクリア指示である場合(ステップS240のYESルート)、DMA割込み制御部16は、DMAreadデータバッファ部15に対し、Completion with DataトランザクションパケットをPCIeデバイス10eへ送信するよう指示する(ステップS241)。この後、DMA割込み制御部16は、ステップS231の処理に戻る。
受信した指示がCompletion with Data検出割込みフラグ16aのクリア指示でない場合(ステップS240のNOルート)、受信した指示は、FT制御部21からのその他の指示であるので、DMA割込み制御部16は、当該指示に応じた適切な処理を実行し(ステップS242)、ステップS231の処理に戻る。
〔3−2−6〕DMAwrite監視部の動作
次に、図20を参照しながら、図19に示すフローチャート(ステップS251〜S255)にしたがって、図9に示すFTサーバ1′におけるDMAwrite監視部11aの処理(動作)について説明する。ここで説明するDMAwrite監視部11aの処理(動作)は、上述した手順(11)〜(14)の手順で実行される。なお、図20は、図9に示すFTサーバ1′におけるVMメモリ管理テーブル22の例を示す図である。
DMAwrite監視部11aは、PCIeデバイス10eからのMemory Write Requestトランザクションパケット(MWr)を待機し(ステップS251)、パケット(MWr)が来ない場合(ステップS252のNOルート)、ステップS251の処理に戻る。Memory Write Requestトランザクションパケット(MWr)が来た場合(ステップS252のYESルート)、DMAwrite監視部11aは、受信したパケット(MWr)内のaddress(VMアドレス)をキーにして、図20に示すようなVMメモリ管理テーブル22を検索する。これにより、DMAwrite監視部11aは、パケット(MWr)内のVMアドレスにおけるデータが変更されたことを示すDirtyビット(変更ビット)に“1”がセットされているか否かを確認する(ステップS253)。
Dirtyビットに“1”がセットされている場合(ステップS254のYESルート)、つまり受信したパケットによる書込み対象のデータが既に変更されている場合、DMAwrite監視部11aは、ステップS251の処理に戻る。
一方、Dirtyビットに“1”がセットされていない場合、つまりDirtyビットが“0”である場合(ステップS254のNOルート)、DMAwrite監視部11aは、VMメモリ管理テーブル22において、パケット(MWr)内のVMアドレスに対応するDirtyビットに“1”をセットする。そして、DMAwrite監視部11aは、メモリアクセス監視部17に対し、Dirtyカウンタ17aを1だけインクリメントするよう指示してから(ステップS255)、ステップS251の処理に戻る。
なお、VMメモリ管理テーブル22におけるDirtyビットは、通常、CPU(CPUコア10a)上のプログラムによってメモリ10b上のデータを書き換えた場合にセットされている。本実施形態のDirtyビットは、これに加え、ネットワーク側(物理デバイス10cまたはPCIeデバイス10e側)からのアクセス(DMAwriteリクエストまたはMemory Write Request)によってメモリ10b上のデータを書き換えた場合にもセットされるようになっている。
〔3−3〕第2実施形態のFTサーバの効果
このように、物理デバイスとしてPCIeデバイス10eを有する第2実施形態のFTサーバ1′において、PCIeルートコンプレクス10dを、DMA制御部11,DMAreadリクエスト監視部12,DMAreadリクエストバッファ部13,DMAreadデータ監視部14,DMAreadデータバッファ部15およびDMA割込み制御部16として機能させることにより、第1実施形態と同様の作用効果(g1)〜(g6)を得ることができる。
〔4〕その他
以上、本発明の好ましい実施形態について詳述したが、本発明は、係る特定の実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲内において、種々の変形、変更して実施することができる。
上述したDMA制御部11,DMAwrite監視部11a,DMAリマップ機能11b,DMAreadリクエスト監視部12,DMAreadリクエストバッファ部13,DMAreadデータ監視部14,DMAreadデータバッファ部15,DMA割込み制御部16,メモリアクセス監視部17,ハイパバイザ20,FT制御部21,管理VM30およびVM40としての機能を含む、本実施形態のFTサーバ1,1′の機能の全部もしくは一部は、コンピュータ(CPU,各種端末を含む)が所定のプログラムを実行することによって実現される。
そのプログラムは、例えばフレキシブルディスク,CD(CD−ROM,CD−R,CD−RWなど),DVD(DVD−ROM,DVD−RAM,DVD−R,DVD−RW,DVD+R,DVD+RWなど),ブルーレイディスク等のコンピュータ読取可能な記録媒体に記録された形態で提供される。この場合、コンピュータはその記録媒体からプログラムを読み取って内部記憶装置または外部記憶装置に転送し格納して用いる。
〔5〕付記
以上の実施形態に関し、さらに以下の付記を開示する。
(付記1)
入出力デバイスを用いてデータ入出力を行なうドライバを含む仮想計算機と、
前記仮想計算機を管理するとともに、本情報処理装置と対になる他の情報処理装置との同期処理を行なうハイパバイザと、
メモリと前記入出力デバイスとの間で行なわれるアクセスを監視する監視部と、
前記監視部が前記メモリから前記入出力デバイスへのデータ出力に係る読出アクセスを検出した場合、前記読出アクセスを検出した旨を前記ハイパバイザに通知する通知部と、
前記ハイパバイザが前記通知部からの通知を受けるときに前記同期処理の実行中である場合、前記データ出力を抑止する抑止部と、を有する、情報処理装置。
(付記2)
前記抑止部は、前記ハイパバイザが前記同期処理を終了すると、前記データ出力の抑止を解除する、付記1記載の情報処理装置。
(付記3)
前記読出アクセスは、前記入出力デバイスから前記メモリへの読出リクエストの発行、または、前記メモリから前記入出力デバイスへの前記データ出力の対象データの読出である、付記1または付記2に記載の情報処理装置。
(付記4)
前記抑止部は、前記読出リクエストまたは前記対象データをバッファに一時的に保持することにより前記データ出力を抑止し、前記ハイパバイザが前記同期処理を終了すると、前記読出リクエストを前記バッファから前記メモリ側へ送信、または、前記対象データを前記バッファから前記入出力デバイスへ送信する、付記3記載の情報処理装置。
(付記5)
前記監視部は、前記入出力デバイスから前記メモリへのデータ書込に係る書込アクセスを検出した場合、前記メモリを管理するテーブルに、前記データ書込に係るアドレスに対応するデータに変更が生じたことを記録し、
前記ハイパバイザは、前記テーブルに従って前記同期処理を行なう、付記1〜付記4のいずれか一項に記載の情報処理装置。
(付記6)
前記監視部は、前記テーブルにおいて変更ビットを設定することにより前記変更が生じたことを記録し、
前記ハイパバイザは、前記同期処理を終了すると、前記変更ビットをクリアする、付記5記載の情報処理装置。
(付記7)
前記メモリにおいてデータの変更が発生した箇所の数を計数するカウンタと、
前回の同期処理時に参照された前記カウンタによる計数値を保存する保存領域と、を有し、
前記ハイパバイザが前記通知部からの通知を受けたときに前記同期処理の実行中でない場合、前記監視部は、前記カウンタの値と前記保存領域の計数値とを比較し、前記カウンタの値と前記保存領域の計数値とが不一致であれば、前記抑止部に前記データ出力を抑止させ、前記ハイパバイザに前記同期処理を実行させる、付記1〜付記6のいずれか一項に記載の情報処理装置。
(付記8)
前記監視部は、前記カウンタの値と前記保存領域の計数値とが一致していれば、前記抑止部に前記データ出力を抑止させることなく、前記データ出力を実行させる、付記7記載の情報処理装置。
(付記9)
前記監視部が、前記ハイパバイザに前記同期処理を実行させるべく、前記読出アクセスを検出したことを要因とする割込みを発生させた場合に設定される一方、前記ハイパバイザが前記同期処理を終了するとクリアされる割込み要因フラグを有し、
前記監視部は、前記割込み要因フラグが設定されている場合に前記ハイパバイザが前記同期処理の実行中であると判断する一方、前記割込み要因フラグが未設定の場合に前記ハイパバイザが前記同期処理の実行中ではないと判断する、付記1〜付記8のいずれか一項に記載の情報処理装置。
(付記10)
入出力デバイスを用いてデータ入出力を行なうドライバを含む仮想計算機と、前記仮想計算機を管理するとともに本情報処理装置と対になる他の情報処理装置との同期処理を行なうハイパバイザと、を有する情報処理装置の制御方法であって、
メモリと前記入出力デバイスとの間で行なわれるアクセスを監視し、
前記監視によって前記メモリから前記入出力デバイスへのデータ出力に係る読出アクセスを検出した場合、前記読出アクセスを検出した旨を前記ハイパバイザに通知し、
前記ハイパバイザが前記通知を受けるときに前記同期処理の実行中である場合、前記データ出力を抑止する、情報処理装置の制御方法。
(付記11)
前記ハイパバイザが前記同期処理を終了すると、前記データ出力の抑止を解除する、付記10記載の情報処理装置の制御方法。
(付記12)
前記読出アクセスは、前記入出力デバイスから前記メモリへの読出リクエストの発行、または、前記メモリから前記入出力デバイスへの前記データ出力の対象データの読出である、付記10または付記11に記載の情報処理装置の制御方法。
(付記13)
前記読出リクエストまたは前記対象データをバッファに一時的に保持することにより前記データ出力を抑止し、
前記ハイパバイザが前記同期処理を終了すると、前記読出リクエストを前記バッファから前記メモリ側へ送信、または、前記対象データを前記バッファから前記入出力デバイスへ送信する、付記12記載の情報処理装置の制御方法。
(付記14)
前記監視によって前記入出力デバイスから前記メモリへのデータ書込に係る書込アクセスを検出した場合、前記メモリを管理するテーブルに、前記データ書込に係るアドレスに対応するデータに変更が生じたことを記録し、
前記ハイパバイザは、前記テーブルに従って前記同期処理を行なう、付記10〜付記13のいずれか一項に記載の情報処理装置の制御方法。
(付記15)
前記テーブルにおいて変更ビットを設定することにより前記変更が生じたことを記録し、
前記ハイパバイザは、前記同期処理を終了すると、前記変更ビットをクリアする、付記14記載の情報処理装置の制御方法。
(付記16)
前記メモリにおいてデータの変更が発生した箇所の数をカウンタによって計数し、
前回の同期処理時に参照された前記カウンタによる計数値を保存領域に保存し、
前記ハイパバイザが前記通知部からの通知を受けたときに前記同期処理の実行中でない場合、前記カウンタの値と前記保存領域の計数値とを比較し、前記カウンタの値と前記保存領域の計数値とが不一致であれば、前記抑止部に前記データ出力を抑止させ、前記ハイパバイザに前記同期処理を実行させる、付記10〜付記15のいずれか一項に記載の情報処理装置の制御方法。
(付記17)
前記カウンタの値と前記保存領域の計数値とが一致していれば、前記抑止部に前記データ出力を抑止させることなく、前記データ出力を実行させる、付記16記載の情報処理装置の制御方法。
(付記18)
前記情報処理装置は、前記監視部が、前記ハイパバイザに前記同期処理を実行させるべく、前記読出アクセスを検出したことを要因とする割込みを発生させた場合に設定される一方、前記ハイパバイザが前記同期処理を終了するとクリアされる割込み要因フラグを有し、
前記割込み要因フラグが設定されている場合に前記ハイパバイザが前記同期処理の実行中であると判断する一方、前記割込み要因フラグが未設定の場合に前記ハイパバイザが前記同期処理の実行中ではないと判断する、付記10〜付記17のいずれか一項に記載の情報処理装置の制御方法。