仮想化環境におけるパケットフォワーディング

3,506 views
3,136 views

Published on

Internet Week 2011

Published in: Technology
0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,506
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
0
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide

仮想化環境におけるパケットフォワーディング

  1. 1. 仮想化環境におけるパケットフォワーディング浅田 拓也 @ 東京工科大学Twitter: @syuu1228
  2. 2. おさらい
  3. 3. 仮想化技術とは1台のコンピュータ上に複数の仮想的なコンピュータを動作させ、それぞれの上でOS・アプリケーションを実行ハードウェアOSハードウェアハイパーバイザOS OSプロセス プロセスプロセス従来 仮想化
  4. 4. ハードウェア仮想化支援機能による仮想化• CPUにハイパーバイザを実行するモードとゲストOSを実行するモードを追加:IntelVT、AMD-V• ハードウェアレベルで仮想化に対応する事により仮想化オーバヘッドを低減し、ハイパーバイザの実装を単純に出来る• ハードウェア支援出来る範囲を広げつつある• メモリ管理の仮想化支援:EPT• デバイスIOの仮想化支援:IntelVT-d + SR-IOVカーネルモードユーザモードカーネルモードユーザモードハイパーバイザモードゲストモードring 0ring 3
  5. 5. LINUX KVMの仕組み
  6. 6. LINUX KVM 概要• Linuxカーネルに組み込まれたシンプルなハイパーバイザ(仮想化支援機能のあるCPUを前提)• CPU仮想化以外の機能はKVM対応のQEMUが担当(仮想デバイス、メモリ確保、BIOS…)LinuxカーネルKVMQEMUカーネルユーザハイパーバイザモード ゲストモードKVMサポート仮想デバイスゲストOS
  7. 7. QEMU• プログラムでCPUをエミュレート、ゲスト環境のプログラムを実行• 異なるアーキテクチャをエミュレート出来る(これが本来の目的)• 非常に遅い・エミュレーションは仮想化には無駄QEMU mov dx,3FBhmov al,128out dx,alCPUエミュレータ実行仮想デバイスOS物理デバイス物理CPUIO
  8. 8. QEMU-KVM• CPUエミュレータを動かす代わりにKVMへゲストモードへの切り替えを要求するように改造• ゲストからIOが発生した場合、KVMからQEMUへ仮想デバイスへのIOが送れるように改造QEMU仮想デバイスOS物理デバイス物理CPUKVMモード切替
  9. 9. ゲストモードへの切り替え• QEMUはCPUエミュレーションを行う代わりにゲストへのモード切り替えを依頼するioctlをカーネルへ発行• KVMはCPUのモードをゲストモードへ移行• ゲストOSがハードウェアへのIOなどトラップされるような動作を行うか、物理ハードウェアからの割込みがかかるまでゲストモードが実行されるLinuxカーネルKVMQEMUカーネルユーザゲストOSKVMサポート仮想デバイス① ioctl(KVM_RUN)② VMLAUNCHハイパーバイザモード ゲストモード
  10. 10. 仮想デバイスへのIO• ゲストOSがデバイスへIO、ゲストモードが中断され制御がKVMへ戻る• QEMUへデバイスエミュレーションを依頼• QEMUでデバイスエミュレーション、結果をKVMへ通知LinuxカーネルKVMQEMUカーネルユーザゲストOSKVMサポート仮想デバイス①デバイスへのIOハイパーバイザモード ゲストモード②QEMUへ処理を依頼③デバイスエミュレーション
  11. 11. KVMの仮想NIC
  12. 12. NICエミュレーション• QEMUを使って実在のNICをエミュレート→ゲストOSで既存のドライバが使える• 仮想レジスタへのアクセスのたびにゲストモードの実行を中断し、カーネルからQEMUに切り替えてエミュレーションを行わなければならないカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2フォワード割り込み物理割り込みパケットバッファレジスタアクセス割り込みレジスタアクセスコピーコピー
  13. 13. NICエミュレーションの動作• パケットがNICに着信、物理割り込みが発生カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ
  14. 14. NICエミュレーションの動作• NICドライバがパケットを受信カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信
  15. 15. NICエミュレーションの動作• ブリッジがパケットをtapデバイスへフォワードカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ
  16. 16. NICエミュレーションの動作• tapからQEMUへコピーカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー
  17. 17. NICエミュレーションの動作• QEMUからゲストのパケットバッファへコピーカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー
  18. 18. NICエミュレーションの動作• QEMUからKVMへ仮想割り込みを要求カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑥仮想割り込み要求
  19. 19. NICエミュレーションの動作• KVMはゲストに仮想割り込みをセットしてモード切替カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑥仮想割り込み要求⑦仮想割り込み
  20. 20. NICエミュレーションの動作• ゲストのNICドライバがレジスタアクセスを行い、ゲストモードが中断カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑧仮想レジスタアクセス⑥仮想割り込み要求
  21. 21. NICエミュレーションの動作• KVMはQEMUにエミュレーションを要求カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑧仮想レジスタアクセス⑨エミュレーション要求
  22. 22. NICエミュレーションの動作• QEMUはe1000エミュレーションを行い、結果をKVMへ通知カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑧仮想レジスタアクセス⑩エミュレーション結果通知
  23. 23. NICエミュレーションの動作• KVMエミュレーション結果をセットしてゲストへ復帰以降、レジスタアクセスのたびに⑧∼⑪の繰り返しカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑪ゲストへ復帰⑩エミュレーション結果通知
  24. 24. NICエミュレーションの動作• ゲストのNICドライバがパケットを受信カーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑪ゲストへ復帰⑩エミュレーション結果通知⑫パケット受信
  25. 25. NICエミュレーションの動作• TCP/IPスタックがパケットをフォワードカーネルカーネルゲストハイパーバイザ ユーザNICNICドライバ tapドライバbridgeqemutapクライアントe1000エミュレーションkvme1000ドライバTCP/IPスタックNIC2①物理割り込みパケットバッファ②パケット受信③tapへブリッジ④コピー⑤コピー⑪ゲストへ復帰⑩エミュレーション結果通知⑫パケット受信⑬パケットフォワード
  26. 26. VIRTIO-NET• IO仮想化フレームワーク「virtio」を用いてパケットの入出力を行う→ゲストOSにvirtio用ドライバが必要• 仮想レジスタは存在せず、virtio ring上の情報を見ながらパケットを取り出す→ハイパーバイザへの切り替え回数が少ないカーネルカーネルゲストユーザNICNICドライバ tapドライバbridgeqemutapクライアントvirtio serverkvmvirtioドライバTCP/IPスタックNIC2フォワード割り込み物理割り込みコピーvirtio ringコピー割り込みハイパーバイザ
  27. 27. VHOST-NET• QEMUを通さず、カーネル内のvhost-netモジュールがホスト ゲストのパケットやり取りを制御• QEMU KVMの切り替えコストを削減カーネルカーネルゲストユーザNICNICドライバ tapドライバbridgeqemuvhost-netkvmvirtioドライバTCP/IPスタックNIC2フォワード割り込み物理割り込みvirtio ring割り込みハイパーバイザコピーコピー
  28. 28. SR-IOV• 物理NICがVMに対して仮想NICを直接提供 IOはハイパーバイザーを介在せずに行われる• 割込みだけは仮想化出来ていないのでKVMを通じて転送される• 最も性能が高いがハード対応が必要/ゲストのパケットをフィルター・改変する事は難しいNICカーネルカーネルゲストユーザPFPFドライバqemukvmVFドライバTCP/IPスタックNIC2フォワード割り込み物理割り込み割り込み割込みハンドラVFDMAパススルーハイパーバイザ
  29. 29. どれを使うべき?• 幅広いOSで仮想NICが動作する必要がある→NICエミュレーション、e1000が最も高速• 最近のLinuxを動かす予定、SR-IOV対応NICが無い→vhost-net• SR-IOV対応NICがある→SR-IOV
  30. 30. KVMの仮想ネットワーク
  31. 31. BRIDGE +TAP• STPを含む802.1d標準準拠のブリッジ実装• netfilterによるフィルタリング• ブリッジ自体をインタフェースとしてコンフィグレーション可能ブリッジxx:xx:xx:xx:xx:01物理NICxx:xx:xx:xx:xx:00tap0xx:xx:xx:xx:xx:02tap1xx:xx:xx:xx:xx:03QEMUQEMU
  32. 32. BRIDGE+TAPでNAT• ブリッジにTAPのみを繋ぎ、ブリッジインタフェースにIPマスカレードを設定してNATを構成ブリッジxx:xx:xx:xx:xx:01物理NICxx:xx:xx:xx:xx:00tap1xx:xx:xx:xx:xx:03QEMUtap0xx:xx:xx:xx:xx:02QEMUNAT
  33. 33. MACVTAP• 物理NICに対して追加のMACアドレスを付与、独立したインタフェースとして動作• netfilterには非対応、bridgeより簡易的な実装で「速い」とされている• 構造上、NAT構成には使えない物理NICxx:xx:xx:xx:xx:00macvtap0xx:xx:xx:xx:xx:01macvtap1xx:xx:xx:xx:xx:02QEMUQEMU
  34. 34. MACVTAPのモード• bridgetap tap間、tap NIC間通信を行えるモード• privatetap tap間、tap NIC間通信を許可しないモード• vepa全てのパケットを外部スイッチでスイッチングするモード• passthroughNICに入ってくる全てのパケットを特定のtapに流すモード
  35. 35. OPENVSWITCH• 仮想マシンに対し仮想OpenFlowスイッチを提供• 物理構成に縛られない柔軟な仮想ネットワークをL2レベルで構築可能
  36. 36. どれを使うべき?• NAT環境を構成、パケットフィルタリングなどを行う→bridge + tap• 高速なブリッジ環境→macvtap• OpenFlowを用いて柔軟なL2ネットワークを構築→OpenvSwitch
  37. 37. 実験的な機能・実装中の機能
  38. 38. VHOST-NETのゼロコピー対応• tap→vhost-net、vhost-net→ゲスト間のパケットコピーを抑制• スループットの向上、レイテンシの削減が期待されるカーネルカーネルゲストユーザNICNICドライバ tapドライバbridgeqemuvhost-netkvmvirtioドライバTCP/IPスタックNIC2フォワード割り込み物理割り込みvirtio ring割り込みハイパーバイザ コピーなしコピーなし
  39. 39. VHOST-NETのマルチキュー対応• 現状のシングルキューな仮想NICでは、ブリッジ以降のパスが同時に1スレッドでしか処理できない為、パフォーマンスネックになる• vCPUが複数ある環境での性能向上が期待されている singlequeuevhost-netNICNICドライバbridgetapvirtio pushkvmvirtioドライバTCP/IPロック競合が発生!multiqueuevhost-netNICNICドライバbridgetapvirtio pushkvmvirtioドライバTCP/IP
  40. 40. SR-IOVのマルチキュー対応• 82599のVFは最大4キューまでのRSSに対応• 現状ではドライバに実装されていないが、ドライバ対応で利用可能になると思われる
  41. 41. EVB: EDGEVIRTUAL BRIDGING• VEB:SR-IOV対応NIC上のスイッチでVM間通信を処理• VEPA:物理スイッチでVM間通信を処理VM VM VMtap tap tapswitchvirtiodriverNICswitchVM VM VMVF VF VFLinuxKernelLinuxKernelSR-IOVNICソフトブリッジswitchswitchVEBVM VM VMVF VF VFLinuxKernelSR-IOVNICswitchVEPA
  42. 42. まとめ• KVMにおける仮想NICのマルチコア環境への最適化は未だ不十分• 仮想化のハードウェアによる支援はNICに留まらずスイッチへも広がりつつ有る

×