軽快なplan9 (第三回kernel/vm探検隊)
DESCRIPTION
2010-2-23 軽快なPlan9 (第三回Kernel/VM探検隊)TRANSCRIPT
軽快なPlan 9筑波大学システム情報工学研究科 / paravirt.org
齊藤 剛 / @go_vm
2010年2月23日 @IIJ
Kernel/VM探検隊1
自己紹介
• 齊藤 剛 / @go_vm
• 大学院生
• 仮想計算機の研究をしています。
• 主にKVMの改造など
2
なぜここにいるの?
• 何故かtwitter上で指名を受けました。
3
軽快なPlan 9って何?
?4
これです5
軽快なPlan 9とは• 仮想計算機上でPlan9を動かして遊んでみる冊子
• 30ページ
• いわゆる、”同人誌”
• http://circle.paravirt.org/c77
6
軽快なPlan 9とは(2)
• タイトルに反して...
• KVMの解説と、VMの床抜きデモンストレーションがメイン
• ゲストにはPlan9を用います
7
初出• 09年12月30日
• 某冬の全国大会二日目技術島で頒布
• 3時間と少しで50部完売しました
• ありがとうございます
8
その後
• 2月10日にグリーOST
勉強会でお話をさせていただきました
• ありがとうございます
9
本題
10
仮想化について
11
仮想計算機の構成
• ホスト型VMM
• KVMやVirtualBox等
• VMMはホストOSのアプリケーションとして動く
ハードウェア
ホストOS
VMM VMM
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
Type II VMM
ゲストOS ゲストOS
12
VM上でのCPUの動作• 速度等の問題から、通常ゲストOSのコードも実CPUでそのまま実行されます
• いちいちエミュレートすると遅い
• しかし
13
ゲストOSがやって良いこと悪いこと
TEXT main+0(SB),0,$0MOVL $1,4(SP)MOVL $.string+0(SB),8(SP)MOVL $14,12(SP)MOVL $20,AXINT $64MOVL $0,4(SP)MOVL $8,AXINT $64GLOBL .string+0(SB),$16DATA .string+0(SB)/8,$”Hello, w”DATA .string+0(SB)/8,$”orld!¥z¥z¥n”END ,
この辺はそのまま実行して良い
これはそのまま実行しちゃダメ
14
特権命令とセンシティブ命令
• CPUの命令には、実行をトラップできないとまずい命令が結構ある
• 特権命令: 実行をトラップできる命令
• センシティブ命令: 実行をトラップしないと”まずい”命令
15
理想的には全ての命令
特権命令
センシティブ命令
これを、「仮想化可能」と呼ぶ16
しかしx86では全ての命令
特権命令
センシティブ命令
非常に残念なことになっています17
x86で仮想化するには、ちょっと工夫が必要でした。
18
様々な工夫
• 動的バイナリ変換 (VMware)
• 静的バイナリ変換 (LilyVM)
• ソース書き換え(Xen)
19
書き換えのいやな点
• 実装コストが馬鹿にならない
• 方式によってはオーバヘッドが大きい
20
そこでIntelとAMDは• CPUに仮想化支援機構を組み込みました
• Intel → Intel VT (vmx)
• AMD → AMD-V (svm)
• 以降vmxの場合について話します。svm
でもだいたい同じです。
21
vmxを有効にするとVMX-root mode VMX-non root mode
いままでの世界(センシティブ命令がはみ出る世界)
新しい世界(センシティブ命令が
全てトラップできる世界)
VMEntry
VMExit
VMX-non root modeでゲストを動かせば、うまくいく
22
うまく分離できた
• ゲストでどんな命令を実行しても良い
• ホストでトラップして適切に対処できる
ハードウェア
ホストOS
VMM VMM
Type II VMM
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
ゲストOS ゲストOSnon-
root
m
ode
root
m
ode
23
ところで
ゲストOS
VMMroot
m
ode
non-
root
m
ode
ユーザプロセス
カーネル
kern
el
mod
eus
er
mod
e
似てますよね24
システムコール
ユーザプロセス
カーネルke
rnel
m
ode
user
m
ode
• ユーザプロセスからカーネルの呼び出し
• カーネルのコンテキストに移って、処理をして、ユーザプロセスに戻る
sysenter
25
• 仮想計算機でも、システムコールと似た概念を定義できます
26
ハイパーコール
ゲストOS
VMM
• ゲストからVMMの呼び出し
• VMM(ホスト)のコンテキストに移って、処理をして、ゲストに戻る
vmcall
non-
root
m
ode
root
m
ode
27
<軽快なPlan9>
28
軽快なPlan9
• 軽快なPlan9では、KVMにハイパーコールを実装して、ゲストのPlan9から呼び出したのでした。
• socket,connect,send,recv相当の機能を定義し、Plan9カーネルを通さずに通信を行いました。
29
呼び出しコード例(1)
TEXT vmcall(SB), $0 MOVL b+0(FP),BX MOVL c+4(FP),CX MOVL d+8(FP),DX MOVL $12345, AX BYTE $0xf BYTE $0x1 BYTE $0xc1 RET
• Plan9のアセンブラ
• 最後のBYTE三つがvmxのvmcall命令
• レジスタに値を詰めて、ホストに飛んで、帰ってくる
30
呼び出しコード例(2)
int hsocket(int dom,int type,int proto){ struct {int d;int t;int p;} arg; arg.d = dom; arg.t = type; arg.p = proto; return vmcall(0,(int)&arg,sizeof(arg));}
• hsocketハイパーコール
• ホスト側でsocket
開いてFDをもらってくる
• KVMに受け側のコードも実装してあります
31
呼び出しコード例(3)
int hsend(int fd,void *buf,int len,int flg){ struct {int fd;void *b;int l;int f;} arg; arg.fd = fd; arg.b = buf; arg.l = len; arg.f = flg; return vmcall(2,(int)&arg,sizeof(arg));}
• hsendハイパーコール
• ホストのsocketでsendしてもらう
• データはポインタで渡せる
32
VMM側コード例int hcall_socket(void *opaque,gva_t arg,int len){ struct {int dom;int type;int proto;} harg;
if(sizeof(harg) != len) return -EINVAL; if(copy_from_guest(opaque,&harg,arg,len)) return -EFAULT; return socket(harg.dom, harg.type, harg.proto);}
• hsendのVMM側実装
• ゲストからホストのユーザ空間に出られるので、コードが簡単
• メモリから引数を読んで、socket()を呼ぶだけでよい
33
ハイパーコールの例34
</軽快なPlan9>
35
次の一歩
36
軽快なPlan9の反省点
• とりあえずやってみた程度
• 実装がadhoc
• Plan9の思想にマッチしていない
37
そこで
• 軽快なPlan9の成果をPlan9カーネルに組み込んで、Plan9標準の方法で使えるようにしたい
38
道具立て
• KVMに対する二つの拡張
• VMRPC
• Socket Outsourcing
39
VMRPC• 仮想計算機上でのゲストホスト間RPCを行うライブラリ
• ゲスト→ホストRPC
• ゲストのメモリの読み書き• ゲストホスト間キュー
• 割り込みの注入
40
VMRPCの構成ホストサーバモジュール
ゲストクライアントモジュール
ホストOS ゲストOS
カーネル空間
ユーザ空間
手続き呼び出し
共有メモリ
イベントキュー
41
41
Socket Outsourcing• VMRPCを用いた、Socket Hypercall Interface
• ゲストOSに対して、Socket APIレベルの通信機能を提供する (BSD Socketライク)
• クライアント機能をゲストのLinux,Windowsに実装
• ゲスト上のアプリケーションからは透過的に利用できる
42
完全仮想化• ゲストOSが変更なしで動作する
• デバイスのエミュレーションが必要
• エミュレーションの処理が重い
‣ 速度が遅い
プロセス
ソケットTCP/IP
デバイスドライバ
エミュレートNIC
デバイスドライバ
ネットワーク
ゲストOS
VMM
ホストOS
43
43
準仮想化• 準仮想ドライバを導入
• ホストOSと直結
• デバイスのエミュレーションが不要
‣ 高速
プロセス
ソケットTCP/IP
準仮想ドライバ
エミュレートNIC
デバイスドライバ
バックエンドドライバ
ネットワーク
ゲストOS
VMM
ホストOS
44
44
バックエンドドライバ
アウトソーシング• 高水準でホスト
OSに要求を渡す
• ゲストOSで処理するのはソケットのインターフェイスのみ
‣ 高速
プロセス
ソケットTCP/IP
準仮想ドライバ
エミュレートNIC
デバイスドライバ
ネットワーク
ゲストOS
VMM
ホストOS
ソケットTCP/IP
ホストサーバモジュール
ゲストクライアントモジュール
45
45
Socket Outsourcingの利点
• VMMが通信の面倒を見るので、ゲスト内でネットワーク処理が不要
• VMRPCを使うため、ゲストホスト間でゼロコピーでデータをやりとりできる
• 高速
46
速度比較
• NICのエミュレーション、virtio、Socket
Outsourcingについて、iperfで通信速度の比較を行う
47
実験環境• 次のマシン二台を直結
• CPU: Intel Core i7 950 3.06GHz
• NIC: Intel 82598EB (10G)
• VMM: KVM88 (VMRPC付き)
• ゲストOS: Linux 2.6.25(SocketOutsourcing
48
実験結果
0
2500
5000
7500
10000
e1000(emu) virtio Sos
転送速度
[M
bps]
49
割とはやい
50
Plan9への実装
• 二種類の方法
• dialなどのAPIを対応させる
• /net/tcpと同じように振る舞うファイルを作る
51
APIを対応させる方法
• Plan9のネットワークAPIと、SosのSocket
インターフェイス間の変換が必要
• APIの機能や、構造体の定義が異なる
• ゲストのWindowsでは実装例あり**Improving Virtualized Network Performance by Delegating Network ProcessingYounggyun Koh,Calton Pu,Yasushi Shinjo,Hideki Eiraku,Go Saito,Daiyuu Nobori
IEEE NCA09
52
/net/tcpのように振る舞わせる• Plan9では、/net/tcp以下のファイルに読み書きするとtcpで通信できる
• SocketOutsourcingを使って同じ振る舞いをするファイルを作ればよい
• APIレベルで対応するよりは、簡単そう
• Plan9のネットワークを完全に置き換えることはできない
53
で、実装したの?
• ごめんなさい、まだ構想だけです
• 部品はそろっているので、Plan9の勉強を兼ねていずれ実装してみたい
54
実装できると
• KVM上でなぜかネットワークが爆速なPlan9ができあがります
• より軽快なPlan9
55
Demo万が一時間が余ったら
56
まとめ• ゲストのPlan9からHypercallで遊んでみました
• 気合い入れてHypercallでネットワークを実装すると意外と速いことを示しました
• 近いうちにPlan9に組み込めるといいね
57