軽快なplan9 (第三回kernel/vm探検隊)

58
軽快なPlan 9 筑波大学システム情報工学研究科 / paravirt.org 齊藤 / @go_vm 2010223@IIJ Kernel/VM探検隊 1

Upload: go-saito

Post on 19-Jun-2015

1.584 views

Category:

Technology


2 download

DESCRIPTION

2010-2-23 軽快なPlan9 (第三回Kernel/VM探検隊)

TRANSCRIPT

Page 1: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan 9筑波大学システム情報工学研究科 / paravirt.org

齊藤 剛 / @go_vm

2010年2月23日 @IIJ

Kernel/VM探検隊1

Page 2: 軽快なPlan9 (第三回Kernel/VM探検隊)

自己紹介

• 齊藤 剛 / @go_vm

• 大学院生

• 仮想計算機の研究をしています。

• 主にKVMの改造など

2

Page 3: 軽快なPlan9 (第三回Kernel/VM探検隊)

なぜここにいるの?

• 何故かtwitter上で指名を受けました。

3

Page 4: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan 9って何?

?4

Page 5: 軽快なPlan9 (第三回Kernel/VM探検隊)

これです5

Page 6: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan 9とは• 仮想計算機上でPlan9を動かして遊んでみる冊子

• 30ページ

• いわゆる、”同人誌”

• http://circle.paravirt.org/c77

6

Page 7: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan 9とは(2)

• タイトルに反して...

• KVMの解説と、VMの床抜きデモンストレーションがメイン

• ゲストにはPlan9を用います

7

Page 8: 軽快なPlan9 (第三回Kernel/VM探検隊)

初出• 09年12月30日

• 某冬の全国大会二日目技術島で頒布

• 3時間と少しで50部完売しました

• ありがとうございます

8

Page 9: 軽快なPlan9 (第三回Kernel/VM探検隊)

その後

• 2月10日にグリーOST

勉強会でお話をさせていただきました

• ありがとうございます

9

Page 10: 軽快なPlan9 (第三回Kernel/VM探検隊)

本題

10

Page 11: 軽快なPlan9 (第三回Kernel/VM探検隊)

仮想化について

11

Page 12: 軽快なPlan9 (第三回Kernel/VM探検隊)

仮想計算機の構成

• ホスト型VMM

• KVMやVirtualBox等

• VMMはホストOSのアプリケーションとして動く

ハードウェア

ホストOS

VMM VMM

ユーザプロセス

ユーザプロセス

ユーザプロセス

ユーザプロセス

Type II VMM

ゲストOS ゲストOS

12

Page 13: 軽快なPlan9 (第三回Kernel/VM探検隊)

VM上でのCPUの動作• 速度等の問題から、通常ゲストOSのコードも実CPUでそのまま実行されます

• いちいちエミュレートすると遅い

• しかし

13

Page 14: 軽快なPlan9 (第三回Kernel/VM探検隊)

ゲスト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

Page 15: 軽快なPlan9 (第三回Kernel/VM探検隊)

特権命令とセンシティブ命令

• CPUの命令には、実行をトラップできないとまずい命令が結構ある

• 特権命令: 実行をトラップできる命令

• センシティブ命令: 実行をトラップしないと”まずい”命令

15

Page 16: 軽快なPlan9 (第三回Kernel/VM探検隊)

理想的には全ての命令

特権命令

センシティブ命令

これを、「仮想化可能」と呼ぶ16

Page 17: 軽快なPlan9 (第三回Kernel/VM探検隊)

しかしx86では全ての命令

特権命令

センシティブ命令

非常に残念なことになっています17

Page 18: 軽快なPlan9 (第三回Kernel/VM探検隊)

x86で仮想化するには、ちょっと工夫が必要でした。

18

Page 19: 軽快なPlan9 (第三回Kernel/VM探検隊)

様々な工夫

• 動的バイナリ変換 (VMware)

• 静的バイナリ変換 (LilyVM)

• ソース書き換え(Xen)

19

Page 20: 軽快なPlan9 (第三回Kernel/VM探検隊)

書き換えのいやな点

• 実装コストが馬鹿にならない

• 方式によってはオーバヘッドが大きい

20

Page 21: 軽快なPlan9 (第三回Kernel/VM探検隊)

そこでIntelとAMDは• CPUに仮想化支援機構を組み込みました

• Intel → Intel VT (vmx)

• AMD → AMD-V (svm)

• 以降vmxの場合について話します。svm

でもだいたい同じです。

21

Page 22: 軽快なPlan9 (第三回Kernel/VM探検隊)

vmxを有効にするとVMX-root mode VMX-non root mode

いままでの世界(センシティブ命令がはみ出る世界)

新しい世界(センシティブ命令が

全てトラップできる世界)

VMEntry

VMExit

VMX-non root modeでゲストを動かせば、うまくいく

22

Page 23: 軽快なPlan9 (第三回Kernel/VM探検隊)

うまく分離できた

• ゲストでどんな命令を実行しても良い

• ホストでトラップして適切に対処できる

ハードウェア

ホストOS

VMM VMM

Type II VMM

ユーザプロセス

ユーザプロセス

ユーザプロセス

ユーザプロセス

ゲストOS ゲストOSnon-

root

m

ode

root

m

ode

23

Page 24: 軽快なPlan9 (第三回Kernel/VM探検隊)

ところで

ゲストOS

VMMroot

m

ode

non-

root

m

ode

ユーザプロセス

カーネル

kern

el

mod

eus

er

mod

e

似てますよね24

Page 25: 軽快なPlan9 (第三回Kernel/VM探検隊)

システムコール

ユーザプロセス

カーネルke

rnel

m

ode

user

m

ode

• ユーザプロセスからカーネルの呼び出し

• カーネルのコンテキストに移って、処理をして、ユーザプロセスに戻る

sysenter

25

Page 26: 軽快なPlan9 (第三回Kernel/VM探検隊)

• 仮想計算機でも、システムコールと似た概念を定義できます

26

Page 27: 軽快なPlan9 (第三回Kernel/VM探検隊)

ハイパーコール

ゲストOS

VMM

• ゲストからVMMの呼び出し

• VMM(ホスト)のコンテキストに移って、処理をして、ゲストに戻る

vmcall

non-

root

m

ode

root

m

ode

27

Page 28: 軽快なPlan9 (第三回Kernel/VM探検隊)

<軽快なPlan9>

28

Page 29: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan9

• 軽快なPlan9では、KVMにハイパーコールを実装して、ゲストのPlan9から呼び出したのでした。

• socket,connect,send,recv相当の機能を定義し、Plan9カーネルを通さずに通信を行いました。

29

Page 30: 軽快なPlan9 (第三回Kernel/VM探検隊)

呼び出しコード例(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

Page 31: 軽快なPlan9 (第三回Kernel/VM探検隊)

呼び出しコード例(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

Page 32: 軽快なPlan9 (第三回Kernel/VM探検隊)

呼び出しコード例(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

Page 33: 軽快なPlan9 (第三回Kernel/VM探検隊)

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

Page 34: 軽快なPlan9 (第三回Kernel/VM探検隊)

ハイパーコールの例34

Page 35: 軽快なPlan9 (第三回Kernel/VM探検隊)

</軽快なPlan9>

35

Page 36: 軽快なPlan9 (第三回Kernel/VM探検隊)

次の一歩

36

Page 37: 軽快なPlan9 (第三回Kernel/VM探検隊)

軽快なPlan9の反省点

• とりあえずやってみた程度

• 実装がadhoc

• Plan9の思想にマッチしていない

37

Page 38: 軽快なPlan9 (第三回Kernel/VM探検隊)

そこで

• 軽快なPlan9の成果をPlan9カーネルに組み込んで、Plan9標準の方法で使えるようにしたい

38

Page 39: 軽快なPlan9 (第三回Kernel/VM探検隊)

道具立て

• KVMに対する二つの拡張

• VMRPC

• Socket Outsourcing

39

Page 40: 軽快なPlan9 (第三回Kernel/VM探検隊)

VMRPC• 仮想計算機上でのゲストホスト間RPCを行うライブラリ

• ゲスト→ホストRPC

• ゲストのメモリの読み書き• ゲストホスト間キュー

• 割り込みの注入

40

Page 41: 軽快なPlan9 (第三回Kernel/VM探検隊)

VMRPCの構成ホストサーバモジュール

ゲストクライアントモジュール

ホストOS ゲストOS

カーネル空間

ユーザ空間

手続き呼び出し

共有メモリ

イベントキュー

41

41

Page 42: 軽快なPlan9 (第三回Kernel/VM探検隊)

Socket Outsourcing• VMRPCを用いた、Socket Hypercall Interface

• ゲストOSに対して、Socket APIレベルの通信機能を提供する (BSD Socketライク)

• クライアント機能をゲストのLinux,Windowsに実装

• ゲスト上のアプリケーションからは透過的に利用できる

42

Page 43: 軽快なPlan9 (第三回Kernel/VM探検隊)

完全仮想化• ゲストOSが変更なしで動作する

• デバイスのエミュレーションが必要

• エミュレーションの処理が重い

‣ 速度が遅い

プロセス

ソケットTCP/IP

デバイスドライバ

エミュレートNIC

デバイスドライバ

ネットワーク

ゲストOS

VMM

ホストOS

43

43

Page 44: 軽快なPlan9 (第三回Kernel/VM探検隊)

準仮想化• 準仮想ドライバを導入

• ホストOSと直結

• デバイスのエミュレーションが不要

‣ 高速

プロセス

ソケットTCP/IP

準仮想ドライバ

エミュレートNIC

デバイスドライバ

バックエンドドライバ

ネットワーク

ゲストOS

VMM

ホストOS

44

44

Page 45: 軽快なPlan9 (第三回Kernel/VM探検隊)

バックエンドドライバ

アウトソーシング• 高水準でホスト

OSに要求を渡す

• ゲストOSで処理するのはソケットのインターフェイスのみ

‣ 高速

プロセス

ソケットTCP/IP

準仮想ドライバ

エミュレートNIC

デバイスドライバ

ネットワーク

ゲストOS

VMM

ホストOS

ソケットTCP/IP

ホストサーバモジュール

ゲストクライアントモジュール

45

45

Page 46: 軽快なPlan9 (第三回Kernel/VM探検隊)

Socket Outsourcingの利点

• VMMが通信の面倒を見るので、ゲスト内でネットワーク処理が不要

• VMRPCを使うため、ゲストホスト間でゼロコピーでデータをやりとりできる

• 高速

46

Page 47: 軽快なPlan9 (第三回Kernel/VM探検隊)

速度比較

• NICのエミュレーション、virtio、Socket

Outsourcingについて、iperfで通信速度の比較を行う

47

Page 48: 軽快なPlan9 (第三回Kernel/VM探検隊)

実験環境• 次のマシン二台を直結

• CPU: Intel Core i7 950 3.06GHz

• NIC: Intel 82598EB (10G)

• VMM: KVM88 (VMRPC付き)

• ゲストOS: Linux 2.6.25(SocketOutsourcing

48

Page 49: 軽快なPlan9 (第三回Kernel/VM探検隊)

実験結果

0

2500

5000

7500

10000

e1000(emu) virtio Sos

転送速度

[M

bps]

49

Page 50: 軽快なPlan9 (第三回Kernel/VM探検隊)

割とはやい

50

Page 51: 軽快なPlan9 (第三回Kernel/VM探検隊)

Plan9への実装

• 二種類の方法

• dialなどのAPIを対応させる

• /net/tcpと同じように振る舞うファイルを作る

51

Page 52: 軽快なPlan9 (第三回Kernel/VM探検隊)

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

Page 53: 軽快なPlan9 (第三回Kernel/VM探検隊)

/net/tcpのように振る舞わせる• Plan9では、/net/tcp以下のファイルに読み書きするとtcpで通信できる

• SocketOutsourcingを使って同じ振る舞いをするファイルを作ればよい

• APIレベルで対応するよりは、簡単そう

• Plan9のネットワークを完全に置き換えることはできない

53

Page 54: 軽快なPlan9 (第三回Kernel/VM探検隊)

で、実装したの?

• ごめんなさい、まだ構想だけです

• 部品はそろっているので、Plan9の勉強を兼ねていずれ実装してみたい

54

Page 55: 軽快なPlan9 (第三回Kernel/VM探検隊)

実装できると

• KVM上でなぜかネットワークが爆速なPlan9ができあがります

• より軽快なPlan9

55

Page 56: 軽快なPlan9 (第三回Kernel/VM探検隊)

Demo万が一時間が余ったら

56

Page 57: 軽快なPlan9 (第三回Kernel/VM探検隊)

まとめ• ゲストのPlan9からHypercallで遊んでみました

• 気合い入れてHypercallでネットワークを実装すると意外と速いことを示しました

• 近いうちにPlan9に組み込めるといいね

57

Page 58: 軽快なPlan9 (第三回Kernel/VM探検隊)

http://circle.paravirt.org/c77

58