JP5960186B2 - 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム - Google Patents

仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム Download PDF

Info

Publication number
JP5960186B2
JP5960186B2 JP2014076807A JP2014076807A JP5960186B2 JP 5960186 B2 JP5960186 B2 JP 5960186B2 JP 2014076807 A JP2014076807 A JP 2014076807A JP 2014076807 A JP2014076807 A JP 2014076807A JP 5960186 B2 JP5960186 B2 JP 5960186B2
Authority
JP
Japan
Prior art keywords
virtual
virtual machine
external process
guest
buffer queue
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2014076807A
Other languages
English (en)
Other versions
JP2015197874A (ja
Inventor
益谷 仁士
仁士 益谷
佳宏 中島
佳宏 中島
健史 木下
健史 木下
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nippon Telegraph and Telephone Corp
Original Assignee
Nippon Telegraph and Telephone Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nippon Telegraph and Telephone Corp filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2014076807A priority Critical patent/JP5960186B2/ja
Publication of JP2015197874A publication Critical patent/JP2015197874A/ja
Application granted granted Critical
Publication of JP5960186B2 publication Critical patent/JP5960186B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Computer And Data Communications (AREA)

Description

仮想マシンが動作可能なホストオペレーティングシステムにおいて、仮想マシン内で動作するゲストOSが自仮想マシン外に存在する、外部プロセスとの専用仮想通信路を構築するシステムおよび、仮想通信路の制御方法に関する。
仮想マシンを構成する技術としてLinux(登録商標)とKVM(kernel−based virtual machine)で構成されたハイパーバイザー環境がよく知られている。この環境では、KVMモジュールが組み込まれたホストOS(物理サーバ上にインストールされたOSをホストOSと呼ぶ)がハイパーバイザーとしてカーネル空間(と呼ばれるユーザ空間とは異なるメモリ領域で)動作し、この環境においてユーザ空間にて仮想マシンが動作し、その仮想マシン内にゲストOS(仮想マシン上にインストールされたOSをゲストOSと呼ぶ)が動作する。
ゲストOSが動作する仮想マシンはホストOSが動作する物理サーバとは異なり、(イーサーネットカードデバイスなどに代表される)ネットワークデバイスを含むすべてのハードウェアが、ハードウェアからゲストOSへの割り込み処理やゲストOSからハードウェアへの書き込みに必要なレジスタ制御といった本来物理ハードウェアが実施すべき通知や処理がソフトウェアで擬似的に模倣されるため、性能がホストOS環境に比べ、低いことが一般的である。
この性能劣化において、特にゲストOSから自仮想マシン外に存在するホストOSや外部プロセスに対して、ハードウェアの模倣を削減し、高速かつ統一的なインタフェースにより通信の性能と汎用性を向上させる技術として、Virtioというデバイスの抽象化技術、つまり準仮想化技術が開発されており、すでにLinux(登録商標)を始め、FreeBSD(登録商標)など多くの汎用OSに組み込まれ、現在利用されている。
<Virtioの仕組み>
Virtioでは、コンソール、ファイル入出力、ネットワーク通信といったデータ入出力に関して、転送データの単一方向の転送用トランスポートとして、リングバッファで設計されたキューによるデータ交換とキューのオペレーションを以て定義している。そして、virtioのキューの仕様を利用して、それぞれのデバイスに適したキューの個数と大きさをゲストOS起動時に用意することにより、ゲストOSと自仮想マシン外部との通信を、ハードウェアエミュレーションを実施せずにキューによるオペレーションだけで実現することができる。詳細な仕様については、非特許文献1に記載されている。
具体的には、PCIデバイスとして仮想マシン内にコンソール、ファイル入出力、ネットワーク通信それぞれに対しVirtioデバイスが存在し(コンソールはvirtio−console、ファイル入出力はvirtio−blk、ネットワークはvirtio−netと呼ばれるデバイスとそれに対応するOSが持つドライバがvirtioキューで定義されている)、ゲストOS起動時に、ゲストOSと相手側とのデータの受け渡し端点(送受信端点)を2つ作り、データ送受信の親子関係を構築する。多くの場合、親子関係は仮想マシン側(子側)とゲストOS(親側)で構成する。
図1に示すように、子側は仮想マシン内のデバイスの構成情報として存在し、それぞれのデータ領域のサイズと必要とする端点の組み合わせの個数、デバイスの種別を親側に要求する。親側は子側の要求に従い、必要な分のデータを貯蓄し受け渡すための共有バッファキューのためのメモリを割り当て確保し、子側がアクセスできるようにそのアドレス番地を子側に返す。データの受け渡しに必要とされる共有バッファキューのオペレーションについては、Virtioではすべて共通であり、親側、子側両方合意済みとして実行される(Virtioキューのオペレーションについては後述の<Virtioキューの操作>を参考にすること)。さらに共有バッファキューの大きさも両方合意済みとする(つまりデバイスごとに決まっている)。これにより、子側にアドレスを伝えるだけで、親側、子側の双方が共有するキューを操作することが可能となる。
Virtioにおいて用意する共有バッファキューは単一方向用として用意されるため、例えば、virtio−netデバイスと呼ばれる仮想ネットワークデバイスでは送信用、受信用、コントロール用の3つのリングバッファで構成される。親と子の通信は、共有バッファキューへの書き込みとバッファ更新通知により実現し、リングバッファに書き込んだ後、相手側に通知する。相手側は通知を受けると、どの共有バッファキューにどの程度新規のデータが入っているのかをVirtioの共通オペレーションを利用して確認し、新規のバッファ領域を取り出す。これにより、親から子または子から親へのデータの受け渡しが成立する。
以上のように、親子でお互いデータ交換用のリングバッファとそれぞれのリングバッファ用のオペレーション方法(Virtioで共通)を共有することにより、ハードウェアエミュレーションを必要としない、ゲストOSと外部との通信を実現する。これにより、従来のハードウェアエミュレーションに比べ、ゲストOSと外部とのデータの送受信を高速に実現することが可能である。
<Virtioキューの操作>
(共有バッファキューの構成)
親側(例:ゲストOS)と子側(例:仮想マシン)が共有する共有バッファキューについて説明する。共有バッファキューは、非特許文献1に記載の仕様の通りであるが、本発明の動作(実施例)を説明するにあたり、キュー構成とキュー操作に関するオペレーションを前提とするため、本節にて説明する。共有バッファキューは既に述べたように親側から子側、または子側から親側への単一方向で利用するものであり、図2の通り次の要素で構成される(本発明はネットワークデバイスに関するものであり、データ転送用のキューを送信用、受信用の2つとする(virtio−netの仕様の通りである))。
・ディスクリプタポインタ列
転送データを保存する各ディスクリプタを参照するためのポインタ。ディスクリプタは転送データの参照アドレスと、その長さ、転送フラグ(本発明では特に重要ではないため説明は省略する)、後続データがある場合のディスクリプタのポインタの4つで構成される(図2)。
・availリング
availリングでは、ヘッダ、availインデックス(availidx)、availリング列、used_event の4つの要素からなる。ヘッダについては本発明では特に重要ではないので省略する。availリング列はそれぞれインデックスが順番に割り振られたリングバッファからなり(図においては0番からインデックスを割り当てている)、それぞれのバッファにはゲストOS側が確保し用意したディスクリプタの番号がインデックスの順番に従って記載される。availインデックスは現在消費済みのavailリング列の最終インデックスをゲストOSが記載する。used_eventについても本発明には特に重要ではないので省略する。
・usedリング
usedリングでは、ヘッダ、usedインデックス(usedidx)、usedリング列、avail_eventの4つの要素から成る。ヘッダは本発明では特に重要ではないので省略する。usedリング列はそれぞれインデックスが順番に振られたリングバッファからなり、ゲストOSが用意したavailリング列より、仮想マシンがインデックス順に取り出したディスクリプタ番号を順番にリングに書き込んだものである。usedインデックスは現在消費済みのusedリング列の最終インデックスを仮想マシンが記載する。avail_eventについても本発明には特に重要ではないので省略する。
・last_avail_idx
このインデックス値は、子側が保持する値であり、最終的に取り出し回収したavailリングのavailインデックス値となる。親側がアップデートしたavail_idxと、last_avail_idxを比較することで、アップデートされたavailリングの個数を子側が知ることができる。
・last_used_idx
このインデックス値は、親側が保持する値であり、最終的に取り出し回収したusedリングのusedインデックス値となる。子側がアップデートしたused_idxと、last_used_idxを比較することで、アップデートされたusedリングの個数を親側が知ることができる。
(親側(例:ゲストOS)から子側(例:仮想マシン)へのデータ転送)
親側から子側へのデータ転送は送信専用のキューを利用する。初期状態では、ディスクリプタ、availリング列、usedリング列が図3の通り初期化された状態である。転送時ゲストOSはデータ1つを仮想マシン側に転送する場合、図4の通り、availリングの先頭に確保したディスクリプタ番号(S−1)を記入する。Sはリング列のサイズとする。ディスクリプタS−1はゲストOSによって転送用データで埋められる。そして、ゲストOSはavailidxを0に進める。その後、ゲストOSは仮想マシン側にavailリング更新通知を送付する。
図5において、仮想マシンは更新通知を受け、availリング列をチェックする。このとき、ゲストOSがどの程度、availリング列に書き込んだのかリングの個数を調べるために、仮想マシン側でlast_avail_idxを管理している。last_avail_idxは初期値であり、availidx とlast_avail_idxを比較して、データ1個がavailリングに入れられていることを仮想マシンが認識する。仮想マシンはインデックス0番のリングからディスクリプタ番号を見つけ(S−1)、ディスクリプタS−1を参照して、ゲストOSが書き込んだ転送データを回収する。availリングからデータを回収した後、回収した分だけ、usedリング列を次のようにアップデートする。
仮想マシン側はavailリングから1つずつ回収するたびに、usedidxの値をインクリメントしながら、availリングに書き込まれていたディスクリプタ番号をusedリングに書き込んでいく。書き込み後、usedidxを1つずつインクリメントする。仮想マシンがusedリング列のアップデートが終了すると、last_avail_idxを0にアップデートして、usedリング更新通知を利用して、ゲストOSに通知する。
図6において、ゲストOSは仮想マシンから通知を受けて、usedidxとゲストOSが管理するlast_used_idxからusedリング0番に記載されているディスクリプタ番号が参照するデータ領域を解放するとともに、last_used_idxを0に変更する。
以上のようにして、availリング列とusedリング列をそれぞれリングバッファとして循環利用しながら、データ転送を実現する。
(子側(例:仮想マシン)から親側(例:ゲストOS)へのデータ転送)
子側から親側へのデータ転送は、受信専用キューを利用する。親側から子側への転送の初期状態とは異なり、子側から親側へ送信する場合は、利用可能なavailリング列に確保済みディスクリプタをできるだけ多く用意する。
図7において、受信専用キューを用意するときに、全ディスクリプタをavailリング列に書き込み、availidxをS−1に進めた状態とする。
図8において、仮想マシンがデータをゲストOSに転送する場合、利用可能なavailリング列から取り出す。例えば、1つのデータを転送する場合、last_avail_idxが初期化されていることからavailリング0番を参照し、ディスクリプタS−1を利用して、転送用データを書き込む。last_avail_idxは0にアップデートする。その後、usedidxが初期化されていることから、usedリング0番に利用したディスクリプタ番号S−1を記載して、usedidxを0にアップデートした後、usedリング更新通知をゲストOSに送信する。
図9において、ゲストOSは仮想マシンからusedリング更新通知を受けて、usedidxとゲストOSが管理するlast_used_idxからusedリング0番に記載されているディスクリプタ番号が参照するデータ領域を転送データとして回収するとともに解放し、last_used_idxを0に変更する。
以上のようにして、あらかじめゲストOS側でディスクリプタが確保された状態でavailリング列とusedリング列をそれぞれリングバッファとして循環利用しながら、仮想マシンからゲストOSへのデータ転送を実現する。
以上のとおり、ゲストOSから仮想マシン側への転送(ゲストOSから見ると送信)、仮想マシン側からゲストOS側への転送(ゲストOSから見ると受信)について、説明した。これらをまとめた図が、図10である。
<Virtioを利用したゲストOSと自仮想マシン外部との通信方法について>
仮想マシン内のゲストOSが外部と通信する場合は、子側が外部と接続し、子側が外部と親側の中継役としてデータを送受信する必要がある。例えば、ゲストOSとホストOS間の通信がその例の1つである。ここで、外部をホストOSとした場合、既存の通信方法として2パターン存在する。
第1の方法(以下、外部通信方式1と呼ぶ)は、仮想マシン内に子側の端点を構築し、ゲストOSと仮想マシン間の通信と、ホストOSが提供する通信端点(通常、tap/tunデバイスと呼ばれる)を、仮想マシン内で接続することにより以下のとおりの接続を構築し、ゲストOSからホストOSへの通信を実現する。
(参1)[構築される接続]
Figure 0005960186
このとき、ゲストOSはtapドライバやホストOSが動作するカーネル空間というメモリ領域とは異なる権限を持つユーザ空間というメモリ領域で動作しているため、ゲストOSからホストOSへの通信には最低1回メモリコピーが発生してしまう(図12)。
第2の方法(以下、外部通信方式2と呼ぶ)は、これを解決する手段として、vhost−netという技術が存在する。vhost−netでは一度仮想マシン内で構築された親側の構成情報(共有バッファキューの大きさ、キューの数、識別子、リングバッファへアクセスするための先頭アドレス情報など)をホストOS内部のvhost−netドライバにコピーし、子側の端点の情報をホスト内部に構築することにより、共有バッファキューの操作をゲストOSとホストOS間で直接実施することを可能とする技術である。これにより、コピーは実質0回で済むようになり、Virtio−netに比べ、コピー回数が1回少ない分、外部通信方式1と比較し、より高速にデータ転送が実現できる。
http://ozlabs.org/〜rusty/virtio−spec/virtio−0.9.5.pdf(2014年3月10日検索) http://www.intel.co.jp/content/www/jp/ja/communications/communications−packet−processing−brief.html(2014年3月10日検索)
Virtioでは、ゲストOSと仮想マシン(またはその先に存在するホストOS)間を結ぶ、同一物理サーバ内の仮想通信路を構築するトランスポートの抽象化技術として考えられた。ただし、外部との通信を考慮する場合は、仮想マシンと外部との接続を考慮する必要がある。
既存の方式では、外部通信方式1と外部通信方式2が開発されており、ホストOSとの通信を基本としている。この場合、データ転送性能向上のためにはホストOSを経由した通信をできるだけ高速にするために、コピー回数を少なくすることが課題として挙げられる。この課題に対し、既に述べたようにvhost−netという実質ゼロコピーを実現する技術が考えられている。
近年、ソフトウェア実装による通信アプリケーションのスループット向上のためにホストOSを経由しないバイパス高速化技術(例えば、非特許文献2のインテルDPDK)が考えられており、これにより物理ホスト内の構成は従来、中継機能を持つ仮想スイッチなどのホストOS側で実装されていたものが、外部プロセスで実装され、仮想マシンとともに同じプロセスで動作するケースが多くなる。しかし、vhost−netはプロセス間通信について考慮されておらず、従来の通り、tapデバイスを利用することにより、実質コピーが最低1回発生することになる(課題1)(図13を参照のこと)。
また、前述のとおり、ホストOSをバイパスするケースでは、仮想マシンと外部プロセス間の通信が多くなると同時に、メンテナンスやエラーによって、各プロセスを接続先へ影響がなく、切り替えや再起動等のユースケースが必ず発生する。しかし、vhost−netはキュー操作のみゲストOSとホストOS間で共有することを目的に設計されており、ホストOS上でモジュールとして動作することから、モジュールエラーやモジュールが削除される等の障害系のイベントに対する対処機能が仮想マシンの通信デバイス側、vhost−netのホストOSモジュール側両方に備わっていない(課題2)(図13を参照のこと)。
そこで、本発明は、上記2つの課題を解決するために、バイパス高速化技術において仮想マシンと外部プロセスとの間の通信のスループットを向上でき、障害系のイベントに対する対処機能を有する仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラムを提供することを目的とする。
上記目的を達成するために、本願発明は、外部プロセス側と仮想マシン側を仮想通信路で直接接続するとともに、接続相手の状態を検知し、相手の状態に応じて再接続する機能を備えることとした。
具体的には、本発明に係る仮想通信路構築システムは、
仮想マシン及び前記仮想マシン外に形成された外部プロセスが動作可能なホストOSを有する物理マシンと、
前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる通信路構築手段と、
を備える。
具体的には、本発明に係る仮想通信路構築方法は、
仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシン上に、前記仮想マシン及び前記外部プロセスを形成する仮想マシン形成手順と、
前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる仮想通信路構築手順と
を行う。
本発明は、外部プロセス側と仮想マシン側を直接接続することができるため、メモリコピー回数とコンテキストスイッチ切り替え回数を外部通信方式1、2に対し少なくすることができ、高速にデータ転送を実現することができる。従って、本発明は、バイパス高速化技術において仮想マシンと外部プロセスとの間の通信のスループットを向上できる仮想通信路構築システム、及び仮想通信路構築方法を提供することができる。
本発明に係る仮想通信路構築システムの前記通信路構築手段は、
前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、メモリ操作で前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張用プロトコル機能を有することを特徴とする。
本発明に係る仮想通信路構築方法の前記仮想通信路構築手順は、
前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、メモリ操作で前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張ステップを有することを特徴とする。
本発明は、仮想デバイスとゲストOS間の共有バッファキューで実現されるデータ転送と同様に、ゲストOSと外部プロセス間のデータ転送を共有バッファキューのメモリ操作で実現する。
本発明に係る仮想通信路構築システムの前記通信路構築手段は、
前記仮想通信路の状態を検知する接続状態検知機能と、
前記仮想通信路の状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知機能と、
それぞれの前記通信デバイスが通信断のときに定期的に通信先と再接続する再接続機能と、
をさらに有することを特徴とする。
本発明に係る仮想通信路構築方法の前記仮想通信路構築手順は、
前記仮想通信路の状態を検知する接続状態検知ステップと、
前記仮想通信路の状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知ステップと、
それぞれの前記通信デバイスが通信断のときに定期的に通信先と再接続する再接続ステップと、
をさらに有することを特徴とする。
さらに、本発明は、想マシン、外部プロセスそれぞれの通信デバイスが、お互い接続相手の状態に関し、状態変化を検知し、自身内部へ通知することにより、ゲストOSや外部プロセス内部の処理ロジックに対し、障害発生やメンテナンスなどの事象に対処する機会を創出することができる。また、本発明は、仮想マシン、外部プロセスは切断状態に陥ったときに、正しく状態を把握できることにより、それを契機として、接続相手を切り替える動作に移ることができる。従って、本発明は、バイパス高速化技術において障害系のイベントに対する対処機能を有する仮想通信路構築システム、及び仮想通信路構築方法を提供することができる。
本発明に係る仮想通信路構築プログラムは、仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシンに、請求項4から6のいずれかに記載の仮想通信路構築方法を実現させる。
仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシンに、前記仮想通信路構築プログラムを動作させることで前記仮想通信路構築方法を実現できる。
本発明は、バイパス高速化技術において仮想マシンと外部プロセスとの間の通信のスループットを向上でき、障害系のイベントに対する対処機能を有する仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラムを提供することができる。
Virtio−netデバイスの送受信端点の構成を説明する図である。<A>は、親側の端点であり、リングバッファメモリ領域を作成し、子側にそのアドレスを教えて、親子でデータにアクセスできるようにする。<B>は、子側の端点であり、親側に必要なリングバッファの大きさと個数を要求する。ゲストOS起動時にその要求にあわせて、ドライバが親側を用意する。子側は、親側が用意したリングバッファメモリ領域のアクセスのためのアドレスが親側から通知される。 Virtioキューの構成 を説明する図である。 ゲストから仮想マシンへのデータ転送時のVirtioキューのオペレーションを説明する図である。 ゲストから仮想マシンへのデータ転送時のVirtioキューのオペレーションを説明する図である。 ゲストから仮想マシンへのデータ転送時のVirtioキューのオペレーションを説明する図である。 ゲストから仮想マシンへのデータ転送時のVirtioキューのオペレーションを説明する図である。 仮想マシンからゲストOSへのデータ転送時のVirtioキューのオペレーションを説明する図である。 仮想マシンからゲストOSへのデータ転送時のVirtioキューのオペレーションを説明する図である。 仮想マシンからゲストOSへのデータ転送時のVirtioキューのオペレーションを説明する図である。 Virtioキューの操作と通知(接続先がtapデバイスの場合)を説明する図である。 TAPデバイスを使った外部通信方式1を説明する図である。 vhost−netドライバを使った外部通信方式2を説明する図である。 vhost−netを利用した仮想マシンと外部プロセス間通信を説明する図である。 本発明に係る仮想通信路構築システムにおける新機能と構成概要を説明する図である。 本発明に係る仮想通信路構築方法における仮想マシンとゲストOSの起動シーケンスを説明する図である。 本発明に係る仮想通信路構築システムの具体的な構成図を説明する図である。 外部プロセスのvirtqueueデバイスにおける送信用・受信用共有バッファキュー管理部2における管理データを説明する図である。この図の例では、送信用バッファキュー、受信用バッファキューはそれぞれ1つずつ。またそれぞれのサイズは省略しているがデフォルト256である。 共有バッファキュー拡張用プロトコルのシグナリングの制御メッセージシーケンスとフォーマットを説明する図である。 外部プロセス(サーバ側)の制御メッセージ受信フローチャートを説明する図である。 外部プロセスの起動と状態シーケンスを説明する図である。 キューの操作と通知(接続先が外部プロセスの場合)を説明する図である。 キューの操作と通知(接続先が外部プロセスの場合)を説明する図である。 ゲストOS、仮想マシン、及び外部プロセスの動作パターンと状態遷移パターンを説明する図である。 ベーシック認証を利用した接続を説明する図である。 ダイジェスト認証を利用した接続を説明する図である。 SSL認証を利用した接続を説明する図である。 本発明を適用したNFVとSDNを利用した仮想BRASネットワークノードのモデルを説明する図である。
添付の図面を参照して本発明の実施形態を説明する。以下に説明する実施形態は本発明の実施例であり、本発明は、以下の実施形態に制限されるものではない。なお、本明細書及び図面において符号が同じ構成要素は、相互に同一のものを示すものとする。
<本発明の概要>
本発明に係る「仮想通信路構築システム及び仮想通信路構築方法」は、ゲストOSと外部プロセス間の通信路構築システムおよびその制御方法である。本発明は、仮想マシンおよび外部プロセスがそれぞれ具備する通信デバイス(通信インタフェース)への新規機能追加を対象とする(図14を参照。)。
本発明は、仮想マシン及び前記仮想マシン外に形成された外部プロセスが動作可能なホストOSを有する物理マシンと、前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる通信路構築手段と、を備える仮想通信路構築システムである。そして、前記通信路構築手段は、前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、メモリ操作で前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張用プロトコル機能を有することを特徴とする。
前記物理マシンで仮想通信路構築プログラムを実行することで、前記物理マシンに仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシン上に、前記仮想マシン及び前記外部プロセスを形成する仮想マシン形成手順と、前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる仮想通信路構築手順を実現することができる。このとき、前記仮想通信路構築手順は、前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、メモリ操作で前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張ステップを有することを特徴とする。
具体的にはゲストOSと仮想マシンとのデータ転送用の共有バッファキューによるデータ転送を仮想マシンの通信先である外部プロセスへ拡張し、仮想マシンと外部プロセス間での共有バッファキューのメモリ操作によりデータ送受信を実現とする。
前記通信路構築手段は、
前記仮想通信路の状態を検知する接続状態検知機能と、
前記仮想通信路の状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知機能と、
それぞれの前記通信デバイスが通信断のときに定期的に通信先と再接続する再接続機能と、
をさらに有する。
前記仮想通信路構築手順は、
前記仮想通信路の状態を検知する接続状態検知ステップと、
前記仮想通信路の状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知ステップと、
それぞれの前記通信デバイスが通信断のときに定期的に通信先と再接続する再接続ステップと、
をさらに有する。
共有バッファキューによる接続では、仮想マシンと外部プロセスが障害やメンテナンスなどの理由により、それぞれ独立して動作を停止させた場合も、接続相手(仮想マシンまたは外部プロセス)の動作に影響がないように(ハングアップ等が発生しないように)、仮想マシン内と外部プロセスが利用する通信デバイス(通信インタフェース)はそれぞれ次の機能を持つ。
(a)通信接続確立手続き、キューの操作モード交換手続き、バッファキューの更新通知手続き、接続終了手続きを実現する共有バッファキュー拡張用プロトコル機能
(b)通信確立中の接続状態検知機能
(c)通信確立中の接続状態通知機能
ここで、接続状態通知機能とは、通信が確立した場合に仮想マシン内部または外部プロセス内部へインタフェースアップの状態通知する機能、及び通信が切断した(またはされた)場合にインタフェースダウンの状態通知する機能である。
(d)切断状態では、再度通信先へ定期的に接続する再接続機能
さらに、本発明では次の拡張が可能である。
・外部プロセスと仮想マシン間の接続プロトコル
・他のバッファ方式
・ネットワーク以外のファイル入出力やコンソール入出力といった共有バッファキューで実現可能な入出力方式
以下に具体的な実施例を説明する。
<実施例1>
実施例1においては、親側と子側間で既に説明したVirtioで定義された共有バッファキューのオペレーションを前提とする。
(1)仮想マシンと外部プロセスとの接続構成図
図16を用いて本発明の構成について記載する。
[構成1]
本実施例の仮想通信路構築システムは、
[接続状態管理部1]11、[受信データ更新通知部1]12、[受信データバッファキュー設定部1]13、[デバイス動作・フィーチャ設定部1]14、[送信データバッファキュー設定部1]15、[送信データ更新通知部1]16及び[デバイス種別登録部1]17から構成される仮想通信デバイスを表現し、ゲストOS側に仮想通信デバイスへのアクセスとゲストOS側で作成される共有バッファキューの情報を仮想デバイス側へ伝達するための[通信デバイスインタフェース部]10と、
[通信デバイスインタフェース部]10の[受信データバッファキュー設定部1]13、[デバイス動作・フィーチャ設定部1]14及び[送信データバッファキュー設定部1]15を介して設定される共有バッファキューの送信・受信それぞれのバッファキューの種類、大きさ、個数を管理する[送信用・受信用共有バッファキュー管理部1]20と、
仮想マシン起動時に起動オプションを処理する[基本設定処理部1]30と、
[接続状態通知機能部1]41、[接続状態検知機能部1]42、[接続・通信処理基本部1]43、[共有バッファキュー拡張用プロトコル処理部1]44及び[基本設定管理部1]45からなる[通信部(クライアント)]40と、
を備えた、起動オプションに指定されるファイル記述子で指定される接続先に接続する機能を備える、仮想マシン側の[通信デバイス1]100(virtio−net−ipcデバイスと呼ぶ)、並びに
[接続状態管理部2]51、[受信データ出力部2]52、[受信データ通知部2]53、[デバイス動作・フィーチャ設定部2]54、[送信データ入力部2]55、[送信データ通知部2]56及び[デバイス種別登録部2]57から構成される、外部プロセスへ通信インタフェースを提供する、インタフェース部50と、
[受信用共有バッファキュー処理部2]61、[送信用・受信用共有バッファキュー管理部2]62及び[送信用共有バッファキュー処理部2]63からなるゲストOSで作成された共有バッファキューにメモリアクセスし、共有バッファキューを操作可能とする共有バッファキュー操作部60と、
外部プロセス起動時に起動オプションを処理する[基本設定処理部2]70と、
[接続状態通知機能部2]81、[接続状態検知機能部2]82、[接続・通信処理基本部2]83、[共有バッファキュー拡張用プロトコル処理部2]84及び[基本設定管理部2]85からなる[通信部(サーバ)]80と、
を備えた、起動オプションに指定されるファイル記述子で指定される接続先に接続する機能を備える、外部プロセス側の[通信デバイス]200
で構成される。
[構成2]
[送信用・受信用共有バッファキュー管理部1]20は、ゲストOSに[受信データバッファキュー設定部1]13、[デバイス動作・フィーチャ設定部1]14、[送信データバッファキュー設定部1]15を提供することにより、共有バッファキュー情報をゲストOSから取得し、その情報を管理することを可能とする。
[構成3]
[通信デバイスインタフェース部]10は、ゲストOSに[接続状態管理部1]11を提供し、[接続・通信処理基本部1]43と[接続状態検知機能部1]42と[接続状態通知機能部1]41とが連携して、ゲストOSに対し、インタフェース状態のオン/オフを認識させることのできる機能を備える。
[構成4]
[送信用・受信用共有バッファキュー管理部1]20と[共有バッファキュー拡張用プロトコル処理部1]44は、連携して外部プロセスに共有バッファキュー情報を提供する初期化シーケンス、設定シーケンス、更新通知シーケンス、及び終了シーケンスを実行可能なプロトコルを具備する。各シーケンスについては後述する。
[構成5]
[通信デバイスインタフェース部]10の動作が割り込み有りの場合、[受信データ更新通知部1]12、[送信データ更新通知部1]16及び[共有バッファキュー拡張用プロトコル処理部1]4420は、連携して外部プロセスにバッファキュー内容の更新の通知を更新通知シーケンスに従って実施する。
[構成6]
[通信デバイスインタフェース部]10の動作が割り込みなし(ポーリングモード)の場合、[通信デバイス1]100は、[受信データ更新通知部1]12及び[送信データ更新通知部1]16を利用せずに仮想マシンのデバイスドライバ側がポーリングモードで動作することにより、外部プロセスとの転送データ(送受信ともに)やり取りすることができる。
[構成7]
[送信用・受信用共有バッファキュー管理部1]は、管理する共有するバッファキューの種別・個数・サイズ情報をバージョン番号にマッピングし、そのバージョン情報をもとに仮想マシンと外部プロセス間で共有バッファキューの構成情報を共有することを可能とする。
[構成8]
[デバイス種別登録部1]17は、仮想マシン起動時の様々なオプション情報を処理する[基本設定処理部1]とそれら情報から共有バッファキュー種別に対応したデバイス情報を登録することができる。[基本設定管理部1]4530は、そのオプション情報すべてを管理することができる。
[構成10]
[通信デバイス1]100は、仮想マシンから取得したデータ転送モード(割り込み有り/割り込み無し(ポーリングモード))やデバイスフィーチャ情報を、[送信用・受信用共有バッファキュー管理部2]62を通して、[デバイス動作・フィーチャ設定部2]54に提供することにより、共有バッファキューの動作モードとフィーチャ情報を外部プロセスに通知する。これにより外部プロセスがゲストOSと外部プロセス間の仮想通信路を認識可能となる。
[構成11]
割り込みありの動作の場合に、仮想マシンからの転送データを受信する場合、更新通知シーケンスで通知される更新通知を[共有バッファキュー拡張用プロトコル処理部2]84が処理し、[受信用共有バッファキュー処理部2]61が[受信インタフェース]に転送データを転送し、かつ、転送データがあった旨を[受信データ通知部2]53に通知する。
[構成12]
割り込みなし(ポーリングモード)の動作の場合に、仮想マシンからの転送データを受信する場合、[受信用共有バッファキュー処理部2]61は、[受信データ通知部2]53を利用せずに、[受信データ出力部2]52からのデータ取得要求に従い共有バッファキュー処理を実施し、ポーリングモードで転送データを受信する。
[構成13]
割り込みありの動作の場合に、外部プロセスから仮想マシンへ転送データを送信する場合、[送信データ入力部2]55が転送データを受け取り、[送信用共有バッファキュー処理部2]63が共有バッファキュー処理を実行した後、[共有バッファキュー拡張用プロトコル処理部2]84は、仮想マシン側へ更新通知を送信し、送信データの受け取り完了通知が必要な場合は[送信データ通知部2]56を通して、処理ロジックへ通知する。
[構成14]
割り込みなし(ポーリングモード)の動作の場合に、外部プロセスから仮想マシンからの転送データを送信する場合、[送信データ通知部2]56を利用せずに、処理ロジックから[送信データ入力部2]55へ入力された転送データについて[送信用共有バッファキュー処理部2]63が共有バッファキュー処理を実施し、[共有バッファキュー拡張用プロトコル処理部2]84は、ポーリングモードで転送データを仮想マシン側へ送信する。
[構成15]
外部プロセスは、[接続・通信処理基本部2]83と[接続状態検知機能部2]82と[接続状態通知機能部2]81とが連携して、外部プロセスの処理ロジックに対し、インタフェース状態のオン/オフを認識させることのできる機能を備える。
[構成16]
[送信用・受信用共有バッファキュー管理部2]62と[共有バッファキュー拡張用プロトコル処理部2]84は、互いに連携して、初期化シーケンス、設定シーケンス、更新通知シーケンス、及び終了シーケンスを通して仮想マシンから提供される共有バッファキュー情報を取得可能なプロトコルを具備する。
[構成17]
[送信用・受信用共有バッファキュー管理部2]62は、仮想マシンから受信する共有バッファキューのバージョン情報をバッファキューの種別・個数・サイズ情報に分解・マッピングして管理し、バージョン情報をもとに仮想マシンと外部プロセス間で共有バッファキューの構成情報を共有する。
[構成18]
[基本設定処理部2]70は、外部プロセス起動時の様々なオプション情報を処理する。[デバイス種別登録部2]57は、それら情報から共有バッファキュー種別に対応したデバイス情報を登録することができる。[基本設定管理部2]85は、オプション情報すべてを管理することができる。
次に、図15のフローチャートと図16の各機能部の記載を交えながら、仮想通信路構築システムの動作について説明する。
(2)仮想マシンと外部プロセスとの接続方法
本発明は、仮想マシンと外部プロセス間で共有バッファキューのメモリ共有によるデータ転送を実現する手段として、それぞれの通信デバイスであるvirtio−net−ipcデバイスとvirtqueueデバイス間をIPC(Inter Process Communication)を使って接続を実現する。
IPCでは実装方法として多種多様に存在するが、実施例1では、多くのOSで対応しているソケット(または、UNIX(登録商標)ドメインソケットとする)を利用する。ソケットでは、ファイル記述子を利用して接続を確立する。
仮想マシン側は、クライアントとして動作する。仮想マシンは起動時に引数として、外部プロセスと接続する仮想マシンの仮想ネットワークデバイスとしてvirtio−netデバイスの識別子、外部プロセスへの接続に利用するファイル記述子(ここでは、socketpathとする)、外部プロセスへの再接続インターバル(ここでは、cintervalとする。)、仮想マシンと外部プロセスの組み合わせを一意に認識するためのノードIDの4つの引数を組み合わせとして起動する(図15のS101)。クライアントノード名はオプションである。
(参2)[仮想マシンの起動時引数]
Figure 0005960186
起動後、[基本設定処理部1]において、virtio−netデバイスの識別子と、socketpath記述子(ファイルパス)とを両方確認し、両方が設定されていた場合は、[デバイス種別登録部1]17に対し、virtio−netデバイスとして登録する。一方で、外部接続先をソケットとするvirtio−net−ipcデバイスとして[基本設定管理部1]45に登録する(図15のS102)。また、起動オプションはすべて、[基本設定管理部1]45に情報登録される。
ここで、ゲストOSが起動していなければゲストOSを起動させる(図15のS121)。ゲストOSは、物理マシンのメモリ内に共有バッファキュー用の領域を確保する(図15のS122)。ゲストOSは、仮想マシンとの間で共有バッファキューの情報及び通信デバイスの機能(フィーチャ)について交換を実施し(図15のS123)、起動を完了する(図15のS124)。
仮想マシン起動後、外部プロセスとの接続が確立し、後述する設定が正しく完了するまでは、ゲストOSに仮想デバイスの状態を通知する[接続状態管理部1]11ではインタフェースはダウンの状態のままである。
仮想マシンは起動時、[デバイス種別登録部1]17にvirtio−netデバイスとして登録することで、ゲストOS側からはvirtio−netデバイスとして認識するため、ゲストOS側では起動時にvirtio−netデバイスに対応したvirtio−netドライバを起動させる(しかし、仮想マシンの通信デバイスとしてはvirtio−net−ipcデバイスとして動作する)(図15のS102))。
[デバイス種別登録部1]17へ登録が完了した後、[基本設定管理部1]45に設定されたsocketpathが示すファイルパスを[接続・通信処理基本部1]43に設定し、接続先を登録することにより(図15のS103)、接続を試みる(図15のS104)。
外部プロセスが接続不能な状態の場合(図15のS105において“No”)、仮想マシンの起動オプションで指定された時間待ち(図15のS114)、再度接続を試みる(図15のS104)。
外部プロセスが接続可能な状態の場合(図15のS105において“Yes”)、socketpathに従って直接ソケットを介して[接続・通信処理基本部1]43により接続が確立する。以後、外部プロセスとは図18に示す通りのシーケンスをフェーズに従って実施する(図15のS106)。また、仮想マシンのvirtio−net−ipcデバイスと外部プロセスのvirtqueueデバイス間のメッセージ交換においては、図18に示す制御メッセージフォーマットを利用する。
[共有バッファキュー拡張用プロトコル処理部1]44は、[基本設定管理部1]45によりノードID、クライアントノード名(オプション)と、[送信用・受信用共有バッファキュー管理部1]からバッファキューの構成を示すバージョン番号から、初期化メッセージを構成し、[接続・通信処理基本部1]43を介して、仮想マシン側から外部プロセス側へ送信する(図15のS106))。
以下、仮想マシン側のvirtio−net−ipcデバイスをクライアント、外部プロセス側のvirtqueueデバイスをサーバとも呼ぶ。
(参3)[初期化メッセージ]
Figure 0005960186
サーバは、クライアントからの制御メッセージ(初期化メッセージ)を受信できる状態へ遷移し、制御メッセージの受信を開始する(図19のS201、S202)。
サーバ側はクライアントと同様に、[接続・通信処理基本部2]83を介して、[共有バッファキュー拡張用プロトコル処理部2]84により、制御メッセージが処理され、メッセージ種別が初期化メッセージであることを確認し、バージョン番号とノードIDを確認する(図19のS203)。
外部プロセスも後述の通り、起動時に[基本設定処理部2]を介して、[基本設定管理部2]85でノードIDが管理されているため、外部プロセスのvirtqueueデバイスの持っているノードIDとサポートするバージョン番号を比較する(図15のS107、図19のS203)。
ノードIDとバージョン番号の2つの情報がマッチしていれば(図15のS107において“Yes”、図19のS203において“Yes”)、設定メッセージおよび終了メッセージ受信状態へ遷移する(図15のS108及び図19のS204)。一方、ノードIDとバージョン番号の2つの情報がマッチしていなければ(図15のS107において“No”、図19のS203において“No”)、接続が確立しないため(図19のS211)、クライアント側は再接続状態へ遷移する(図15のS114)。再接続は、[基本設定管理部1]45で管理されるcinterval値を確認し、その値の時間間隔で再接続を繰り返し試行する(cintervalが0またはマイナス値に設定されていれば、再接続は繰り返さない)。
初期化メッセージ処理が正常に終了すると(図15のS108)、仮想マシン側は設定メッセージを送信するフェーズに移行する。また、外部プロセス側は、設定メッセージである制御メッセージを受信するフェーズへ移行する。
設定メッセージでは、初期化メッセージで利用した情報に加え、ゲストOSから提供される共有バッファキューにアクセスするためのアドレス情報が必要となる。よって、ゲストOSが起動しているか否かを確認する(図15のS109)。具体的には、[共有バッファキュー拡張用プロトコル処理部1]44は[送信用・受信用共有バッファキュー管理部1]にゲストOSから設定される共有バッファキューの種別・先頭アドレス・個数・サイズが設定されているかどうか問い合わせる。
当該事項が設定されていなければ(図15のS109において“No”)、ゲストOSが起動していないと判断して、[送信用・受信用共有バッファキュー管理部1]からの共有バッファキューの設定完了通知を待つ(図15のS110、S110)。当該事項の設定が完了していれば(図15のS109において“Yes”)、ゲストOSからの共有バッファキューの先頭アドレス情報を取得できるため、[共有バッファキュー拡張用プロトコル処理部1]44はそれら情報を設定メッセージに追加して、外部プロセス(サーバ側)へ下記の内容で設定メッセージを送信する(図15のS112)。
(参4)[設定メッセージ]
Figure 0005960186
[送信用・受信用共有バッファキュー管理部1]への共有バッファキューの情報登録はゲストOS側から、[受信データバッファキュー設定部1]13を介して受信バッファキューの個数とサイズの情報が、[デバイス動作・フィーチャ設定部1]14を介してデバイスフィーチャやデバイスの動作モード(割り込み有りか無し)が、[送信データバッファキュー設定部1]15を介して送信バッファキューの個数とサイズが、それぞれ実施される。
サーバ側は設定メッセージを受信する(図19のS205)と、初期化メッセージと同様に、[接続・通信処理基本部2]83を介して、[共有バッファキュー拡張用プロトコル処理部2]84にて、バージョン番号、ノードID、メッセージ種別を確認する(図19のS206、S207)。
受信した制御メッセージのノードIDとバージョン番号がマッチしなければ(図19のS206において“No”)、接続を切断する(図19のS211)。受信した制御メッセージのノードIDとバージョン番号がマッチすれば(図19のS206において“Yes”)、制御メッセージが設定メッセージであるか否かを確認する(図19のS207)。
制御メッセージが設定メッセージである場合(図19のS207において“Yes”)、共有バッファキューのアドレス情報、virtio−net−ipcデバイスのフィーチャ情報、動作モードを確認し(図19のS209)、値がセットされ、かつ動作モードについては割り込み有効か無効どちらかの値が設定されていれば、設定を完了する(図19のS210)。
これら情報は、サーバ側の[送信用・受信用共有バッファキュー管理部2]62に管理される。このとき、バージョン番号に対応する、バッファキュー種別(virtioキュー)と、バッファキュー先頭アドレス、送信バッファキューの個数とサイズ情報、受信バッファキューの個数とサイズ情報とに分解されて登録される(図17)。このバージョン情報については後述の(3)で説明する。
なお、メッセージ種別が設定メッセージ以外で終了メッセージでない場合(図19のS207において“No”、S208において“No”)、及び共有バッファキューのアドレス情報、virtio−net−ipcデバイスのフィーチャ情報、動作モードが含まれていない場合(図19のS209において“No”)は、設定メッセージの受信を待つ(図19のS204)。また、図19のS208でメッセージ種別が終了メッセージであれば、接続を切断する。
これらの情報を使い、[送信用・受信用共有バッファキュー管理部2]62では、さらに仮想マシン上のゲストOSの共有バッファキューにアクセスするために、メモリマッピングを使い、内部で共有バッファキュー管理用変数として、送信用バッファキュー変数と受信用バッファキュー変数にそれぞれアドレス情報をマッピングさせる(図17)。
仮想マシン側は設定メッセージの結果の応答を受け(図18、図19)、[共有バッファキュー拡張用プロトコル処理部1]44は[接続状態通知機能部1]41を介して、[接続状態管理部1]11にリンクアップ状態を登録する。これにより、ゲストOSは通信デバイス(virtio−net−ipcデバイス)のリンクアップを認識する(図15のS113)。なお、ゲストOSは、リンクアップ状態を確認する際に(図15のS125)、リンクアップの登録が無ければ、仮想マシンがリンクアップ登録するまで待つ(図15のS127、S128)。
外部プロセス側も同様に設定完了後、[共有バッファキュー拡張用プロトコル処理部2]84は[接続状態通知機能部2]81を介して、リンクアップ状態を登録する。これにより、通信デバイス(virtqueueデバイス)の状態をリンクダウン状態からリンクアップ状態に切り替え、外部プロセスの処理ロジックからデータ通信可能な状態へ切り替える。外部プロセス側の設定については後述の(7)で説明する。
(3)バージョン番号の解釈について
バージョン番号は、「バッファキュー種別」、「キューの個数」、「それぞれキューのサイズ」の組み合わせで表現される。キューは送信用、受信用ともに同じ個数であり、且つそれぞれのキューサイズも同一とする。
例えば、キュー種別4ビット、キュー個数12ビット、キューサイズ16ビットとし、‘0001’の4ビットをvirtioキュー種別に割り当てるとする。この場合、図17に記載のとおり、デフォルトのvirtioキューの構成とすると、送受信用キューは1つずつあり、サイズは256であるため、バージョン番号は次のように表現される。
(参5)[バージョン番号]
Figure 0005960186
(4)メッセージタイプ依存データフィールド
図18の制御メッセージフォーマットにおいて、メッセージタイプ依存データフィールドは、設定メッセージと更新通知メッセージにて以下の値で利用される。なお、フィーチャ情報は(5)に後述する。
(参6)[メッセージタイプ依存データフィールド]
Figure 0005960186
(5)Virtio−net−ipcデバイスのフィーチャ情報と動作モードの合意プロセス
フィーチャ情報は、ゲストOSのvirtio−netドライバがサポートするチェックサムオフロードなどの機能と、virtio−net−ipcデバイスがサポートする機能とがゲストOS起動時に折衝され、合意されたものが、最終的なフィーチャ情報として確立する。このフィーチャ情報はVirtioのSpecの通りであるため省略する(詳細は、非特許文献1を参照。)。
このフィーチャ情報の合意はゲストOSと仮想マシンと外部プロセス3者が同時に実施可能であればよいが、ゲストOSと仮想マシン間の合意が優先されるため、ゲストOSと仮想マシン間で初期に合意した情報をバージョン情報に変換し、外部プロセスに一方的に強制することで3者合意プロセスをスキップしている。よって、外部プロセス側はすべてのフィーチャに対応することを前提としている。
一方、動作モードについては、親側から子側へのavailリング更新通知の有効/無効、子側から親側へのusedリング更新通知の有効/無効の設定が可能である。更新通知がオフの場合は、相手側がポーリングモードで動作し、更新通知なしで自発的に転送データを回収することを示す。仮想マシンのvirtio−net−ipcデバイス、ゲストOSのvirtio−netドライバ、外部プロセスのvirtqueueデバイスは両モードに対応している。この更新通知は、ゲストOSと仮想マシン、仮想マシンと外部プロセスの2区間で発生するが、virtio−net−ipcデバイスとvirtio−netドライバ、virtqueueデバイスは両モードに対応しているため、別々に設定が可能である。しかし、本発明では、ゲストOSと仮想マシン間で折衝し合意した動作モードを外部プロセスにそのまま伝達することとしている。つまり2区間とも同じ動作になる。
(6)仮想マシンと外部プロセスとの切断方法
上記(2)において、仮想マシンと外部プロセスとの接続後、仮想マシン側の[共有バッファキュー拡張用プロトコル処理部1]44または外部プロセス側の[共有バッファキュー拡張用プロトコル処理部2]84からそれぞれ[接続・通信処理基本部1]43、[接続・通信処理基本部2]83を介して、終了メッセージを相手に送付することにより、切断を実現する。このとき、外部プロセスは、図19の初期化メッセージや設定メッセージと同様に、バージョン番号、ノードIDを確認する(図19のS206)。これらがマッチしていれば、接続終了状態となる(図19のS207、S208、図15のS115、図20のS312)。
仮想マシン側は切断状態に遷移した場合、仮想マシン側が動作していれば再度接続を試みる(図15のS104)が、仮想マシン自体が終了してしまった場合は当然、再接続は実施しない。
外部プロセス側も同様であり、外部プロセスが動作していれば接続待ち状態となるが(図20のS303)、外部プロセス自体終了していれば再接続待ち状態にはならず、そのまま終了する。
(7)外部プロセスの起動シーケンス
外部プロセスは、通信デバイスとしてvirtqueueデバイスをインタフェースとして起動する(図16)。
virtqueueデバイスは子側の共有バッファキューのオペレーション機能を図16に記載の、[受信用共有バッファキュー処理部2]61と[送信用・受信用共有バッファキュー管理部2]62と[送信用共有バッファキュー処理部2]63により有し、動作モードは前述の通り、割り込みモード及びポーリングモードをサポートするものである。
外部プロセスの起動シーケンスは図20のとおりである。外部プロセスの起動は仮想マシンやゲストOSとは独立である。外部プロセスは起動指示に従って、起動を完了させる(図20のS310、S311)とともに、通信デバイスとのリンクアップを開始する。
外部プロセス起動時、virtqueueデバイス識別子と仮想マシン起動時と同様に接続先としてsocketpath、さらに接続の対を認識するためのノードIDの3つの引数が渡される(図20のS301)。サーバのノード名はオプションである。
(参7)[外部プロセスの起動オプション]
Figure 0005960186
外部プロセスはこれらの起動オプション情報を指定されると、図16の外部プロセス側に記載の[基本設定処理部2]はこれらのパラメータを識別し、[基本設定管理部2]85に登録する。そして、[デバイス種別登録部2]57に登録し、デバイス種別が外部プロセス側の処理ロジックから認識できるようにする(図20のS302)。
次に、[基本設定処理部2]はsocketpathで示されるファイルパスを[接続・通信処理基本部2]83に設定し、[接続・通信処理基本部2]83は仮想マシン側からの接続待ち状態で起動する(図20のS303)。この状態では、外部プロセスの処理ロジックで確認することのできる[接続状態管理部2]51においてインタフェースはダウンの状態のままである。
図20のS304のとおり、仮想マシンからの接続があると、[接続・通信処理基本部2]83を介して、[共有バッファキュー拡張用プロトコル処理部2]84が初期メッセージを識別し、メッセージタイプが初期化メッセージで、且つ、ノードIDが[基本設定管理部2]85で管理するノードIDと等しく、サポートしているバージョンであるかと確認する(図20のS305)。
条件が満たされていない場合、サーバ側は再接続状態へ遷移する(図20のS305において“No”)。条件が満たされている場合、初期化メッセージ処理が正常に終了し、接続が確立する(図20のS306)。仮想マシン側は設定メッセージを送信するフェーズに移行し、外部プロセスは、設定メッセージ受信フェーズへ移行する(図19のS204)。
その後、仮想マシン側からの設定メッセージを待ち受ける(図20のS307、S308)。設定メッセージにおいても同様に、メッセージタイプとノードIDとバージョン番号を確認し、マッチしていれば、設定メッセージに含まれる、バージョン番号、共有バッファキューのアドレス情報、virtio−net−ipcデバイスのフィーチャ情報、動作モードを確認し、値がセットされ、かつ動作モードについては割り込み有効か無効どちらかの値が設定されていれば、設定を完了する(図19のS210、図20のS309)。これらの設定内容は[共有バッファキュー拡張用プロトコル処理部2]84から[送信用・受信用共有バッファキュー管理部2]62に設定・登録される。
その後、[送信用・受信用共有バッファキュー管理部2]62では、登録内容を確認し、バージョン番号と共有バッファキューのアドレス情報より、図17に記載のとおり、共有バッファキューを管理するための各種変数と作成する。本内容は上記(2)に説明済みであるため詳説を割愛する。
共有バッファキューの管理情報が[送信用・受信用共有バッファキュー管理部2]62にて作成されると、[接続状態通知機能部2]81を通して、[接続状態管理部2]51にリンクアップ状態を登録する。
これを受け、外部プロセスは通信デバイスが利用可能状態になったことを認識する。
(8)仮想マシンと外部プロセス接続後のゲストOSから外部プロセスへのデータ送受信について(共有バッファキューの操作について)
共有バッファキューの操作については、virtioをベースとするため、従来の技術の<Virtioキューの操作>で説明したものと全く同じである。本発明により、キュー操作の子側の実施者が、仮想マシン上の通信デバイスから図16に記載の外部プロセス上のvirtqueueデバイスに切り替わったと考えることができる。
ただし、動作モードが割り込み有りの場合の共有バッファキューの更新通知はvirtio−net−ipcデバイスとvirtqueueデバイス間のソケットを経由するため、共有バッファキューの通常のオペレーションに手順が1つ多くなる。つまり、動作モードにおいて、割り込みが有効である場合、図18のとおり、共有バッファキューの更新通知が仮想マシン側と外部プロセス側間で送付することになる(図21)。
一方、動作モードが割り込み無効である場合は、図18に示す更新通知は発生しない。virtio−net−ipcデバイスとvirtqueueデバイスにてポーリングモードで動作し、キューのアップデートが有った場合自発的にアップデートのあったキューの転送データを回収する(図22)。
<割り込みモードの場合の処理>
(ゲストOSから仮想マシンを通して、外部プロセスへ送信する場合)
図16と図21を利用し説明する。
1.availにディスクリプタを積む
ゲストOSはavailに送信データをディスクリプタに入れて積む
2.仮想マシンへ通知
ゲストOSは仮想マシンの通信デバイスへ通知。つまり、virtio−net−ipcデバイスの[共有バッファキュー拡張用プロトコル処理部1]44は[送信データ更新通知部1]16を通じて、更新があった旨を把握する。
3.外部プロセスへ通知
virtio−net−ipcデバイスは外部プロセスへ通知する。つまり、[共有バッファキュー拡張用プロトコル処理部1]44は、外部プロセスのvirtqueueデバイスへ送信用キューのavailの更新通知メッセージを送信。
4.外部プロセスは更新通知を受信し、availを確認し、ディスクリプタを回収
(a)virtqueueデバイスの[共有バッファキュー拡張用プロトコル処理部2]84において、更新メッセージ内の受信用キューの更新であることを知る。
(b)[共有バッファキュー拡張用プロトコル処理部2]84は[受信用共有バッファキュー処理部2]61に更新通知を知らせる。
(c)[受信用共有バッファキュー処理部2]61は更新のあった、ディスクリプタを回収し、[受信データ通知部2]53に受信したことを通知する。
(d)処理ロジックからは、[受信データ出力部2]52を通して、データを取得できるようになる
5.usedに回収したディスクリプタを積む
[受信用共有バッファキュー処理部2]61は[共有バッファキュー拡張用プロトコル処理部2]84にusedに回収したディスクリプタを積んだことを知らせる。
6.usedのアップデートを通知
[共有バッファキュー拡張用プロトコル処理部2]84は更新メッセージを仮想マシン側のvirtio−net−ipcデバイスに送信。
7.ゲストOSへusedのアップデートを通知
virtio−net−ipcデバイスの[共有バッファキュー拡張用プロトコル処理部1]44が更新メッセージを受信し、[送信データ更新通知部1]16にusedのアップデートを通知。
8.usedから外部プロセスが積んだディスクリプタを回収
ゲストOSは[送信データ更新通知部1]16により、更新通知を受信し、usedから外部プロセスが積んだディスクリプタを回収する。
(外部プロセスから、ゲストOSへ送信する場合)
図16と図21を利用して説明する。
1.availにディスクリプタを積む
(a)初期状態では外部プロセスが送信データを詰め込むための、ディスクリプタを仮想マシン側が用意しておく。つまり、ゲストOSが[受信データバッファキュー設定部1]13と[送信データバッファキュー設定部1]15を利用してvirtio−net−ipcデバイスの[送信用・受信用共有バッファキュー管理部1]へ共有バッファキューの個数・サイズ情報を通知する前に完了済みである。
(b)以後、初期状態以降は、手順9で回収したディスクリプタをavailに積むことを示す。
2.仮想マシンへ通知
(a)初期状態では発生しない。
(b)初期状態以降は、ゲストOSは[受信データ更新通知部1]12を通じて、[共有バッファキュー拡張用プロトコル処理部1]44に、更新があった旨を通知する。
3.外部プロセスへ通知
[共有バッファキュー拡張用プロトコル処理部1]44は、外部プロセスのvirtqueueデバイスへ受信用キューのavailの更新通知メッセージを送信。
4.availから利用可能な、ディスクリプタを回収
(a)外部プロセスの処理ロジックから[送信インタフェース]の[送信データ入力部2]55に送信データを送る。
(b)[送信用共有バッファキュー処理部2]63は[送信用・受信用共有バッファキュー管理部2]62から、外部プロセスが送信用で利用するキュー情報(仮想マシンから見ると受信キュー)を参照し、ディスクリプタを用意する。
5.ディスクリプタに転送データを積む
[送信用共有バッファキュー処理部2]63は転送データをディスクリプタにつめる。
6.usedに回収したディスクリプタを積む
[送信用共有バッファキュー処理部2]63は[共有バッファキュー拡張用プロトコル処理部2]84にusedに回収したディスクリプタを積んだことを知らせる。
7.usedのアップデートを通知
[共有バッファキュー拡張用プロトコル処理部2]84は更新メッセージを仮想マシン側のvirtio−net−ipcデバイスに送信。
8.ゲストOSへusedのアップデートを通知。
virtio−net−ipcデバイスの[共有バッファキュー拡張用プロトコル処理部1]44が更新メッセージを受信し、[受信データ更新通知部1]12にusedのアップデートを通知。
9.usedから外部プロセスが積んだディスクリプタを回収
(a)ゲストOSは[受信データ更新通知部1]12により、更新通知を受信し、usedから外部プロセスが積んだディスクリプタを取り出す。
(b)ディスクリプタには転送データが含まれるので、そのデータを取得するとともに、ディスクリプタを解放する(回収する)。
<ポーリングモード(割り込みなし)の場合の処理>
ゲストOSと外部プロセスはそれぞれ、ポーリングモードで動作するため、virtio−net−ipcデバイスおよびvirtqueueデバイスを介した、更新メッセージは中継されない。
(ゲストOSから仮想マシンを通して、外部プロセスへ送信する場合)
図16と図22を利用し説明する。
1.availにディスクリプタを積む
ゲストOSはavailに送信データをディスクリプタに入れて積む
2.availを確認し、ディスクリプタを回収
[受信用共有バッファキュー処理部2]61はポーリングモードで、availの更新を確認する。更新があった場合、ディスクリプタを回収し、[受信データ出力部2]52を通して、転送データを取得できるように、保持しておく。
3.usedに回収したディスクリプタを積む
[受信用共有バッファキュー処理部2]61は[共有バッファキュー拡張用プロトコル処理部2]84にusedに回収したディスクリプタを積む。
4.usedから外部プロセスが積んだディスクリプタを回収
ゲストOSはポーリングモードで、usedの状態を確認し、usedの更新があった場合、外部プロセスが積んだディスクリプタを回収する。
(外部プロセスから、ゲストOSへ送信する場合)
図16と図22を利用して説明する。
1.availにディスクリプタを積む
(a)初期状態では外部プロセスが送信データを詰め込むための、ディスクリプタを仮想マシン側が用意しておく。つまり、ゲストOSが[受信データバッファキュー設定部1]13と[送信データバッファキュー設定部1]15を利用してvirtio−net−ipcデバイスの[送信用・受信用共有バッファキュー管理部1]へ共有バッファキューの個数・サイズ情報を通知する前に完了済みである。
(b)以後、初期状態以降は、手順5で回収したディスクリプタをavailに積むことを示す。
2.availから利用可能な、ディスクリプタを回収
(a)外部プロセスの処理ロジックから[送信インタフェース]の[送信データ入力部2]55に送信データを送る。
(b)[送信用共有バッファキュー処理部2]63は[送信用・受信用共有バッファキュー管理部2]62から、外部プロセスが送信用で利用するキュー情報(仮想マシンから見ると受信キュー)を参照し、ディスクリプタを用意する。
3.ディスクリプタに転送データを積む
[送信用共有バッファキュー管理部2]は転送データをディスクリプタにつめる。
4.usedに回収したディスクリプタを積む
[送信用共有バッファキュー処理部2]63は回収したディスクリプタをusedに積む。
5.usedから外部プロセスが積んだディスクリプタを回収
(a)ゲストOSはポーリングモードで動作し、更新通知なしでusedを確認し、更新があった場合、外部プロセスが積んだディスクリプタを取り出す。
(b)ディスクリプタには転送データが含まれるので、そのデータを取得するとともに、ディスクリプタを解放する(回収する)。
(9)仮想マシンとゲストOSの起動シーケンス
図15に記載の通りであり、仮想マシンが起動し、ゲストOSが起動してvirtio−netドライバが起動するときに、フィーチャ情報についてvirtio−net−ipcデバイスと折衝を行い、さらに動作モードをお互い設定した上で送信用、受信用の共有バッファキューをゲストOSが作成し、共有バッファキューの個数・サイズ・先頭アドレス情報をvirtio−net−ipcデバイスに通知する。
この通知は、上記(2)に記載のとおり、ゲストOSがvirtio−net−ipcデバイスとのインタフェースである、[受信データバッファキュー設定部1]13、[デバイス動作・フィーチャ設定部1]14、[送信データバッファキュー設定部1]15を通して、[送信用・受信用共有バッファキュー管理部1]に通知し設定することで実現する。
以上のように、通常のオペレーションを想定した場合の動作およびシーケンスについて説明した。しかし、図23に示すように、外部プロセス、仮想マシン、及びゲストOSが状態遷移パターン(D1〜D9)において、お互い独立して動作に不具合を発生させない通知のしくみが必要である。次節以降、その方式について説明する。
・状態遷移パターン(D1)
状態遷移パターン(D1)では、仮想マシンだけが起動、停止する状態遷移について取り扱う。このパターンでは、仮想マシンの異常終了を考慮しなければ行けないがそもそも接続先の外部プロセスやゲストOSが存在しないため、影響を与える存在がいない。よって、このケースでは動作への影響は考慮する必要はない。
・状態遷移パターン(D2)
このケースでは、仮想マシンが起動中でゲストOSが停止中と、仮想マシンが起動中でゲストOSが起動中の場合の2つの状態の遷移である。この状態で、ゲストOSが異常終了した場合の対処が必要である。具体的には、ゲストOSが確保した共有バッファキューのメモリ領域が確保されたまま解放されずに異常終了するケースである。この場合は、そのメモリ領域が解放されずに残ってしまうが、この問題については、既存のvirtio−netデバイス含めvirtioの共有バッファキューで実現されたvirtioデバイスすべてに共通する問題である。また、外部プロセスが起動していないため、動作に影響を与えるという観点では考慮する必要はない。
・状態遷移パターン(D3)
このパターンでは、仮想マシンとゲストOSが起動中で、外部プロセスが停止と動作の状態を遷移するケースである。このケースでは、外部プロセスが異常終了したケースを取り扱う。この場合、IPCを利用しているため、IPCの終了通知を仮想マシン側は検知することができ、終了処理を仮想マシン側で実施することができる。つまり、(i)仮想マシン側で終了を検知、(ii)仮想マシン側からゲストOSへリンクダウンを通知、(iii)ゲストOSがリンクダウンを認識、することにより外部プロセスの影響でゲストOSは通常のリンクダウン処理として扱うことができる。その他の問題として、外部プロセス異常終了時に共有バッファキューが初期化されない問題が残るが、これはVitioデバイスすべてで共通する問題である。
・状態遷移パターン(D4)
このパターンでは、仮想マシンとゲストOSが停止中であり、外部プロセスの異常終了のみを対処がターゲットとなる。この状態では外部プロセス側の異常終了は相手側が存在しないため、影響は与えない。
・状態遷移パターン(D5)
このパターンでは、外部プロセスが起動し、virtqueueデバイスがサーバとして接続待ち状態になっている状態で、仮想マシンが起動および停止する状態遷移について、仮想マシンが異常終了した場合について説明する。仮想マシンが異常終了した場合は、外部プロセスのvirtqueueデバイスと仮想マシン側のvirtio−net−ipcデバイスとのコネクションが切断されるだけであり、共有バッファキューの情報を交換する前であるため、異常終了後、外部プロセスのvirtqueueデバイスが再度待ち状態に入るため、特に外部プロセスの動作に仮想マシンの異常終了動作が影響を与えることはない。
・状態遷移パターン(D6)
このパターンでは、外部プロセスと仮想マシンが起動している状態で、ゲストOSの起動と終了の状態遷移中に、ゲストOSが異常終了した場合について説明する。ゲストOSが異常終了前に仮想マシン側のvirtio−net−ipcデバイスにゲストOSが確保した共有バッファキューの情報を提供していた場合、共有バッファキューで利用するメモリ領域も解放されない状態でゲストOSが異常終了してしまうため、外部プロセス側はその異常終了がわからない状態で共有バッファキューに書き込んでしまう。この問題については、既存のvirtio−netデバイス含めvirtioの共有バッファキューで実現されたvirtioデバイスすべてに共通する問題である。
・状態遷移パターン(D7)
このパターンでは、仮想マシンだけが起動している状態(virtio−net−ipcデバイスが定期的に接続を繰り返している状態)、において外部プロセスが停止状態と起動状態間を遷移するケースについて取り扱う。このケースでは、外部プロセス側と仮想マシン側ではIPCでの接続が完了しただけであり、共有バッファキューの情報については交換していない状態であるため、外部プロセスの異常終了に対しても、仮想マシン側は再度、再接続状態に遷移するだけであり、仮想マシンの状態に影響を与えるものではない。
・状態遷移パターン(D8)
このパターンでは、仮想マシンとゲストOSが起動している状態で、両方異常終了するケースを取り扱う。この状態では、影響を与える対象の外部プロセスは起動していないため、当然動作に対して影響を与えない。よって、この状態遷移では動作の影響を考慮する必要はない。
・状態遷移パターン(D9)
このパターンでは、仮想マシンとゲストOSと外部プロセスがすべて起動している状態で、仮想マシンとゲストOSが同時に異常終了するケースを取り扱う。この場合、仮想マシンのvirtio−net−ipcデバイスと外部プロセスのvirtqueueデバイスはIPCで接続しているため、外部プロセス側は異常終了を検知でき、検知するとともに、共有バッファキュー操作を停止することができるため、外部プロセス側へはリンクダウン通知として外部プロセスへも正常に状態変更通知が可能である。これにより、この異常終了においても適切に処理することが可能である。
・その他の状態遷移
仮想マシンとゲストOSと外部プロセスがすべて動作している状態ですべて異常終了してしまうケースでは、すべて動作が終了するため、お互い影響を与えるケースは発生しない。よって、その他の状態遷移についても考慮する必要はない。
<実施例2>
実施例1では、ユニックスドメインソケットを利用したIPCを利用した接続を取り上げた。IPCにおいてはユニックスドメインソケット以外に、ファイルパス指定によるIPCの手法としてパイプ、メッセージキュー、INETソケットが存在し、本発明では、起動オプションに接続種別を設定することで接続手法について切り替えることが可能である。
以上のように、接続手段はこれらの各実装方法で異なるが、上記指定の接続手段を用いて接続を確立した後、初期化メッセージを含む仮想マシンと外部プロセス間でやり取りされる共有バッファキューに関するすべての手順は、制御メッセージフォーマット及びシーケンス(図18)を含み、実施例1に説明の手順と全く同じである。
ただし、起動時に与えるオプションについては、それぞれの接続手段によって異なるため、実施例2において実施例1と異なる箇所のみ以下の通り、記載する(それ以外の手段に関する実施手順は実施例1と同じであるため、省略する。)
<接続手段:パイプ>
パイプを接続手段とする場合、仮想マシン側の起動オプションは下記の通り、socketpathではなくfifopathとして、ファイル記述子を指定して起動する。
(参8)[仮想マシンの起動時引数]
Figure 0005960186
外部プロセス側も同様のファイル記述子を指定することで接続できるようにする。
(参9)[外部プロセスの起動オプション]
Figure 0005960186
それ以外のオプションについては実施例1と同じである。
<接続手段:メッセージキュー>
メッセージキューを接続手段とする場合、仮想マシン側の起動オプションは下記の通り、socketpathではなくmsgqpathとして、ファイル記述子を指定して起動する。
(参10)[仮想マシンの起動時引数]
Figure 0005960186
外部プロセス側も同様のファイル記述子を指定することで接続できるようにする。
(参11)[外部プロセスの起動オプション]
Figure 0005960186
それ以外のオプションについては実施例1と同じである。
<接続手段:INETソケット>
INETソケットを接続手段とする場合、仮想マシン側の起動オプションは下記の通り、socketpathではなくIPアドレスとポート番号を指定して起動する。このとき、レイヤ4プロトコルとしてTCPか、UDPを指定する。
(参12)[仮想マシンの起動時引数]
Figure 0005960186
外部プロセス側も同様のファイル記述子を指定することで接続できるようにする。
(参13)[外部プロセスの起動オプション]
Figure 0005960186
それ以外のオプションについては実施例1と同じである。
<実施例3>
実施例1では、同一物理ホスト内においてゲストOSの共有バッファキューを仮想マシンから外部プロセスへ拡張する手法について説明した。IPCにおいて、ソケットの代わりに、セキュアな接続方式を組み合わせ、1対1で接続するケースを適用することが可能である。ベーシック認証、パスワード認証、SSL(Secure Sockets Layer)、を利用した接続方式を適用できる。これにより、仮想マシンと外部プロセス間での認証機能を共通鍵、または公開鍵認証にて実現し、交換するメッセージ内容も暗号化することが可能であり、セキュアに共有バッファキューの操作が可能となる。
(ベーシック認証を利用したケース)
ベーシック認証を利用するケースでは、実施例1において、仮想マシン起動時のオプションに、外部プロセス接続用の認証情報として、ノードIDの代わりにユーザ/パスワードを指定し起動する。これらのユーザ/パスワードは、図16の[基本設定管理部1]45にて管理される。一方、外部プロセス側も認証許可するためのユーザ/パスワード情報を仮想マシン同様に、図16の[基本設定管理部2]85にて管理する。
この場合、これらのオプションは初期化メッセージ前に外部プロセスとやりとりされ、ベーシック認証が正常に終了すると、そのあと、初期化フェーズに移行する。仮想マシンと外部プロセス間の接続確立までの状態遷移については図24に記載のとおりである。図24において、Basic認証フェーズの認証要求応答、ユーザ/パスワード、認証OKの各種メッセージフォーマットは図18に従い、メッセージタイプにbasic認証、メッセージタイプ依存データにそれぞれ、認証要求応答、ユーザ/パスワード、認証OKの情報が記載され、メッセージがやり取りされる。それ以外の全体の状態遷移等は、実施例1にすべて従うため、省略する。
(ダイジェスト認証)
ダイジェスト認証を利用するケースでは、ベーシック認証の「ユーザ/パスワード」部分をダイジェストに置き換えた形となる(図25)。各種メッセージフォーマットもベーシック認証と同様に図18に従う。また、それ以外の全体の状態遷移等は、実施例1にすべて従うため、省略する。
(SSL認証)
SSL認証を利用するケースでは、クライアント側がサーバ認証用の証明書を所持し、仮想マシン起動時のオプションとして、サーバ証明書のファイルパスを指定する。これらのサーバ証明書のファイルパス情報は、図16の[基本設定管理部1]45にて管理される。外部プロセス側は、起動時にSSLの認証を実施するかどうかのオプションを指定する。
これにより、サーバとクライアント間でSSL認証を実行することにより、接続を実現する(図26)。初期化フェーズに至るSSLによる接続までは、メッセージフォーマットはSSLに従う。また、それ以外の全体の状態遷移等は、実施例1にすべて従うため、省略する。
<実施例4>
実施例1においては、(3)に記載のとおり、バージョン番号を利用してバッファキュー構成(種別・個数・サイズ)の情報対応を示した。これにより、バージョン番号を利用することで送信用、受信用のバッファキューとして、それぞれマルチバッファキューを仮想マシンと外部プロセスで共有することが可能である。
この場合、更新メッセージはのメッセージタイプ依存フィールドには、下記のとおり、更新のあったバッファキューのビットを1、更新がないキューを0、とすることにより、接続相手に知らせることが可能である。
例えば、送信用、受信用にそれぞれ4個のバッファキューを利用する場合、メッセージタイプフィールドは送信用4ビット、受信用4ビットの合計8ビットで構成される。例えば送信用の0番目、1番目のキューが更新された場合は、メッセージタイプ依存フィールドは以下のとおりとなる。
11000000 = (送信用4ビット)(受信用4ビット)
これらの更新メッセージをのぞき、実施例1と同じ構成をとるため、実施例4の詳細な手順は省略する。
<実施例5>
実施例4では、マルチバッファキューにおいて、1つの接続を利用した。送受信用のバッファキューを1つの接続と対応づけ、マルチキューの個数分接続を確立することにより、並列化が望まれパフォーマンス向上が期待できる。具体的には、仮想マシン、外部プロセスともに起動時に個数分のファイル記述子を指定して起動することにより、マルチバッファキュー、且つマルチ接続の機能を持つバッファキューの共有方式を実現することができる。
具体的な実施例については接続が複数と成るだけであり、実施例1と全く同じであるため、詳細は省略する。
<実施例6>
実施例1では、ゲストOSと仮想マシン間のキューとしてvirtioキューの仕様をベースに外部プロセスへ確証する方式について述べた。キュー操作は一般的に、親側と子側で構造(バッファキューの構成とオペレーション方法)で合意できていれば、他のキュー構造においても本発明は適用可能である。実施例1では、仮想マシンと外部プロセス間を接続する際、バージョン番号により、バッファキュー種別、バッファキュー個数、バッファキューサイズの情報を交換する(実施例1の(3))。
よって、キューの更新通知機能と動作モードを交換するだけであり、実施例1の例に加え、設定メッセージにキューの種別情報を追加することにより、任意のキューに拡張可能である。
状態遷移パターンD2、D6において、Virtioキューを前提することでVirtioキューに起因するドライバ側の再初期化が実装されていないことにより、メモリ解放されないという問題を説明した。本実施例で説明した他のキューでリンクダウンや、リンクアップ時にVirtioキューを再初期化する機能を有する共有バッファキューに適用することで、当該問題も解決できる。
<実施例7>
今までの実施例では、仮想マシンの通信デバイス(virtio−net−ipcでバイス)をクライアント、外部プロセスの通信デバイス(virtqueueデバイス)をサーバとして、実施例を述べていたが、逆の場合も同様に本発明は実現可能である。この場合、サーバ、クライアントの処理が今まで述べてきた実施例と逆のパターンになるがそれ以外の状態遷移については実施例1で述べたものと全く同じになるため、詳細は省略する。
<本発明によって生じる効果>
(i)外部プロセス側と仮想マシン側を直接接続することができるため、メモリコピー回数とコンテキストスイッチ切り替え回数を外部通信方式1、2に対し少なくすることができ、高速にデータ転送を実現することができる。
(ii)仮想マシン、外部プロセスそれぞれの通信デバイスが、お互い接続相手の状態に関し、状態変化を検知し、自身内部へ通知することにより、ゲストOSや外部プロセス内部の処理ロジックに対し、障害発生やメンテナンスなどの事象に対処する機会を創出する(障害対応等は、ゲストOSや外部プロセス内部の処理に依存)。これにより、仮想マシン(およびゲストOS)と外部プロセスは異常終了の事象も含め、独立してオペレーションすることができる。つまり、仮想マシンの再起動や、外部プロセス側の再起動においても接続相手にはリンクダウンとして見えるため、動作がハングアップするといったことが一切発生しない。
(iii)仮想マシン、外部プロセスは切断状態に陥ったときに、正しく状態を把握できることにより、それを契機として、接続相手を切り替える動作に移ることができ、さらに再接続機能により、切り離した接続相手と同じ機能を持つ別の接続相手と再接続することによりフェイルオーバー機能を実現することが可能となる。
(iv)本発明では仮想マシンと外部プロセス間のメッセージの交換内容を提案しており、接続方法を限定しない。これにより、適用するプラットフォームによって実装方法を選択、採用することが可能である。
(v)本発明のvirtio−net−ipcデバイスとvirtqueueデバイスを通信インタフェースとして利用することにより、外部プロセスと仮想マシンの接続のあり、なしをゲストOS側にリンクダウンとして状態通知を実施することにより、ゲストOS、外部プロセスはハングアップせずに通常のオペレーションを実施することを可能とする。
(vi)外部通信方式1、2では仮想マシンと外部プロセス間の通信はtapデバイスやvhost−netドライバの他に中継のための仮想スイッチが必要と成るが、この方式では直接接続するため、他のコンポーネントを必要としない。
通常、CPUについてのサイクルタイムは、DRAMのようなメモリへのアクセス時間よりはるかに短い。これは、CPUが次の命令(メモリエリアを参照する)を実行するための待ちが発生することを意味する。そして、メモリエリアへの参照回数が多いほど待ち時間が多く発生することになりスループットの低下が発生する。このため、従来のように仮想マシン間のパケット転送のために複数のメモリエリアにパケットをコピーをすれば、このコピー動作によりネットワークI/Oのパフォーマンスが低下することになる。
図27は、この問題を解決しようとするモデルである。図27のモデルは、仮想ネットワーク技術のNFVとSDN(OpenFlow)を利用した仮想BRAS(Broadband Remote Access Server)ネットワークノードである。NFVは、ネットワーク機能仮想化(Network Function Virtualization)であり、SDNはソフトウエア制御ネットワーク(Software−Defined Networking)である。
各仮想マシン(VM)は、NFVとして機能し、それぞれインターネット接続サービス、IP電話等のSIPサービス、NSOD(Network Service−Oriented Distributor)として機能する例である。NSODは、DPI(Deep Packet Inspection)やアドレス付与を行い、サービスクライアントとネットワークサービスとの媒介をおこなうものである。仮想ネットワークにおいてパケット転送を行うOpen vswichやソフトウエアベースOpenFlowスイッチ等の仮想スイッチが必要である。図27のモデルは、仮想スイッチと仮想マシンが同じメモリエリアで動作するため、ホストOSをバイパスしてパケットのコピー動作を低減でき、ネットワークI/Oのパフォーマンスを向上することができる。
さらに、このBRASに本発明の仮想通信路構築システムを適用すれこともできる。仮想デバイスとゲストOS間の共有バッファキューを介してそれぞれの仮想マシン間を直接接続し、パケット転送が可能になるため、仮想スイッチが不要となる。このため、パケットコピー回数をさらに低減でき、高速データ転送に寄与できる。
[付記]
以下は、本発明の特徴をまとめたものである(図15、図19、図20、図23)。
1.本発明は、仮想マシンおよび外部プロセスにおいて、互いの独立性を担保しつつ、バッファキューの操作を共有するために、初期化(接続相手の識別、バッファキューの大きさ、種類の整合性の確立)、設定処理(バッファキュー操作の動作モード、バッファキューの先頭アドレス)、バッファキューの更新通知処理(割り込み有りの場合)、終了処理、の4フェーズに分けて接続状態をモデル化し、以下の通りプロトコルを規定したことを特徴とする。
(a)接続相手間でそれぞれ同じバッファを操作するため、お互いバッファの種別、大きさの整合性が必要になる。初期化メッセージでは、この整合性を実現するために、接続の度に整合性情報をバージョン情報として交換するための情報領域をプロトコルメッセージ内に規定した。
(b)同様に、設定処理フェーズでは、バッファキューのメモリ情報を相手に伝えるための情報領域をプロトコルメッセージ内に規定した。
(c)データの入出力を取り扱う方式として、割り込みモードと割り込みなしモード(ポーリングモード)が存在する。これを接続完了前に事前に折衝するための同様に、設定処理フェーズでは、動作モード規定領域をプロトコルメッセージ内に規定した。
(d)割り込みモードを実現するために、バッファキューの更新のたびに、相手側に更新通知を通知するメッセージ種別をプロトコルに規定した。
2.本発明は、更新通知なしで、通信デバイスがポーリングモードでデータ転送を実現するために、設定フェーズ時に動作モードとして、割り込み無しモード(ポーリングモード)をサポートしたことを特徴とする。
3.本発明は、仮想マシン、外部プロセスそれぞれにおいて、切断状態を検知した場合、自身の内部へリンクダウン通知することにより、動作の不定状態を防止可能にすることを特徴とする。
4.本発明は、切断状態になった場合、再接続のフェーズにステート遷移することにより、再接続可能にしたことを特徴とする。
5.本発明は、仮想マシン・ゲストOSおよび、外部プロセスと、停止・起動の2つのステート状態とを組み合わせ、各状態遷移においても、再接続可能な状態に遷移することを実現する共有バッファキュー拡張用プロトコルのシグナリングを規定したことを特徴とする。
10:通信デバイスインタフェース
20:送信用・受信用共有バッファキュー管理部1
30:基本設定処理部1
40:通信部(クライアント)
50:インタフェース部
60:共有バッファキュー操作部
70:基本設定処理部2
80:通信部(サーバ)
100:通信デバイス1
200:通信デバイス2

Claims (3)

  1. 仮想マシン及び前記仮想マシン外に形成された外部プロセスが動作可能なホストOSを有する物理マシンと、
    前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる通信路構築手段と、
    を備える仮想通信路構築システムであって、
    前記通信路構築手段は、
    前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、前記仮想マシンが前記ゲストOSから取得した共有バッファキュー情報を前記外部プロセスへ提供することで前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張用プロトコル機能と、
    前記仮想通信路において、前記仮想マシンと前記外部プロセスとの通信が確立している又は切断しているという接続状態を検知する接続状態検知機能と、
    前記接続状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知機能と、
    前記仮想マシンと前記外部プロセスとの通信が切断しているときに定期的に通信先と再接続する再接続機能と、
    することを特徴とする想通信路構築システム。
  2. 仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシン上に、前記仮想マシン及び前記外部プロセスを形成する仮想マシン形成手順と、
    前記仮想マシン内で動作するゲストOSに、前記仮想マシンと前記外部プロセスとを直接接続する仮想通信路を構築させる仮想通信路構築手順とを行う仮想通信路構築方法であって、
    前記仮想通信路構築手順は、
    前記仮想マシンと前記ゲストOSとの間のデータ転送用として形成された共有バッファキューについて、前記仮想マシンが前記ゲストOSから取得した共有バッファキュー情報を前記外部プロセスへ提供することで前記共有バッファキューのデータ転送先を前記外部プロセスへ拡張して前記仮想通信路を構築するとともに、前記ゲストOSと前記外部プロセスとの間の通信に関する手続きを実現させる共有バッファキュー拡張ステップと、
    前記仮想通信路において、前記仮想マシンと前記外部プロセスとの通信が確立している又は切断しているという接続状態を検知する接続状態検知ステップと、
    前記接続状態をそれぞれ前記ゲストOSと前記外部プロセス上の処理ロジックに通知する接続状態通知ステップと、
    前記仮想マシンと前記外部プロセスとの通信が切断しているときに定期的に通信先と再接続する再接続ステップと、
    することを特徴とする想通信路構築方法。
  3. 仮想マシン及び前記仮想マシン外に形成される外部プロセスが動作可能なホストOSを有する物理マシンに、請求項に記載の仮想通信路構築方法を実現させるための仮想通信路構築プログラム。
JP2014076807A 2014-04-03 2014-04-03 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム Active JP5960186B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014076807A JP5960186B2 (ja) 2014-04-03 2014-04-03 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014076807A JP5960186B2 (ja) 2014-04-03 2014-04-03 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム

Publications (2)

Publication Number Publication Date
JP2015197874A JP2015197874A (ja) 2015-11-09
JP5960186B2 true JP5960186B2 (ja) 2016-08-02

Family

ID=54547494

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014076807A Active JP5960186B2 (ja) 2014-04-03 2014-04-03 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム

Country Status (1)

Country Link
JP (1) JP5960186B2 (ja)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6548010B2 (ja) * 2015-06-16 2019-07-24 日本電気株式会社 準仮想化ネットワークデバイス、情報処理装置、情報処理方法、および情報処理プログラム
CN106844066B (zh) * 2017-01-22 2022-09-27 腾讯科技(深圳)有限公司 一种应用运行方法、装置及***
JP6737471B2 (ja) 2017-03-30 2020-08-12 日本電気株式会社 制御装置、制御システム、制御方法及びプログラム
JP7083717B2 (ja) * 2018-07-23 2022-06-13 ルネサスエレクトロニクス株式会社 半導体装置
CN109240802B (zh) 2018-09-21 2022-02-18 北京百度网讯科技有限公司 请求处理方法和装置
US12001895B2 (en) 2019-10-08 2024-06-04 Nippon Telegraph And Telephone Corporation Server delay control system, server delay control device, server delay control method, and program
US20230029932A1 (en) * 2019-12-23 2023-02-02 Nippon Telegraph And Telephone Corporation Server delay control device, server delay control method, and program
JP7400587B2 (ja) 2020-03-30 2023-12-19 横河電機株式会社 通信処理装置、プログラム、及び通信処理方法
US20240129255A1 (en) * 2021-02-10 2024-04-18 Nippon Telegraph And Telephone Corporation Server delay control device, server delay control method, and program
JPWO2022195826A1 (ja) * 2021-03-18 2022-09-22
JP2023003987A (ja) 2021-06-25 2023-01-17 富士通株式会社 情報処理装置、情報処理プログラム、及び情報処理方法
WO2023144878A1 (ja) * 2022-01-25 2023-08-03 日本電信電話株式会社 サーバ内遅延制御装置、サーバ内遅延制御方法およびプログラム

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5365051B2 (ja) * 2008-03-31 2013-12-11 富士通株式会社 管理プログラム、管理装置及び管理方法
US8739177B2 (en) * 2010-06-21 2014-05-27 Intel Corporation Method for network interface sharing among multiple virtual machines
JP2013242644A (ja) * 2012-05-18 2013-12-05 Panasonic Corp 仮想計算機システム、制御方法、およびプログラム
JP2014032498A (ja) * 2012-08-02 2014-02-20 Mitsubishi Electric Corp 計算機の障害再現方式

Also Published As

Publication number Publication date
JP2015197874A (ja) 2015-11-09

Similar Documents

Publication Publication Date Title
JP5960186B2 (ja) 仮想通信路構築システム、仮想通信路構築方法、及び仮想通信路構築プログラム
JP3805725B2 (ja) 相異なるミドルウェアを使用するホームネットワーク上のデバイス間のメッセージの受け渡しを可能にするゲートウェイ、ホームネットワークシステム及びメッセージ受け渡し方法
US20170322828A1 (en) Systems and methods for virtio based optimization of data packet paths between a virtual machine and a network device for live virtual machine migration
US8625448B2 (en) Method and system for validating network traffic classification in a blade server
US20060059287A1 (en) Methods and apparatus for enabling bus connectivity over a data network
US8107360B2 (en) Dynamic addition of redundant network in distributed system communications
CN112910685B (zh) 实现对容器网络统一管理的方法及装置
JP2010183450A (ja) ネットワークインターフェース装置
CN102984237B (zh) 一种基于socket连接的数据传输***及方法
WO2017028399A1 (zh) 通信数据传输方法及***
US9118621B2 (en) Network controller, method, and medium
CN106452951A (zh) 一种信息处理方法、装置及***
JP5018969B2 (ja) 通信制御プログラム、通信制御装置、通信制御システムおよび通信制御方法
KR100597405B1 (ko) 소켓 어플리케이션 프로그램을 이용한 데이터 중계 시스템및 데이터 중계 방법
US20160261719A1 (en) Information processing system, control program, and control method
JP4415391B2 (ja) データをネットワークに送信する方法及び装置並びにデータをネットワークから受信する方法及び装置
US8737413B2 (en) Relay server and relay communication system
JP6677052B2 (ja) 通信管理装置、通信管理方法及びプログラム
US9787805B2 (en) Communication control system and communication control method
US11188346B2 (en) Obtaining environment information in a computing environment
US11106359B1 (en) Interconnection of peripheral devices on different electronic devices
JP7456624B2 (ja) ネットワークの管理装置、初期設定方法及びプログラム
US20130179531A1 (en) Network communications apparatus, method, and medium
WO2022254517A1 (ja) 通信システム及び通信制御方法
JP5170000B2 (ja) 冗長化ペア検出方法、通信装置、冗長化ペア検出プログラム、記録媒体

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160224

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160329

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160526

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160621

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160622

R150 Certificate of patent or registration of utility model

Ref document number: 5960186

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150