KVM Network Model

[1] Userspace Virtio network architecture
[2] Vd-t,sriov architecture
[3] Vhost_net architecture
[4] Vhost over sriov & macvtap architecture

      +--------------+
      |  Guest VM    |
      | +--+    +--+ |
      +-|  |----|  |-+
        |tx|    |rx|
      +-+--+----+--+-+
      |    QEMU  ^  |
      |    v     /   |
      |    +----+    |
      +----| tap|----+
  +--------|    |--------+
  |        +----+        |
  |Kernel/HV  ^          |
  |           |          |
  |           v          |
  |       +------+       |
  |       |bridge|       |
  |       +------+       |
  |           ^          |
  |           |          |
  |           v          |
  |       +------+       |
  +-------| NIC  |-------+
          +------+
              ^
              |
              v

      +------------------------+
      |     Guest VM           |
      |              +--+ +--+ |
      +--------------|tx|-|rx|-+
                     +--+ +--+
                       ^   ^
                         /
                         |
                         v
      +--------+   +-----------+
      | QEMU   |   | VF NIC #2 |
      +--------+   +-----------+
  +----------------------+  ^
  | Kernel/HV            |  |
  |    +-----------+     |  |
  |    | VF NIC #1 |     |  |
  |    +-----------+     |  |
  |           ^          |  |
  |           |          |  |
  |           v          |  v
  |       +--------------+----+
  +-------| Physical NIC      |
          +-------------------+
              ^
              |
              v

      +------------------------+
      |     Guest VM           |
      |              +--+ +--+ |
      +--------------|tx|-|rx|-+
                     +--+ +--+
       +--------+      ^   ^
       | QEMU   |        /
       +--------+        |
  +----------------------|------+
  | Kernel/HV            v      |
  |                 +-------+   |
  |             +-> | vhost |   |
  |             |   +-------+   |
  |             v               |
  |       +------+              |
  |       | tap  |              |
  |       +------+              |
  |           ^                 |
  |           |                 |
  |           v                 |
  |       +------+              |
  |       |bridge|              |
  |       +------+              |
  |           ^                 |
  |           |                 |
  |           v                 |
  |       +------+              |
  +-------| NIC  |--------------+
          +------+
              ^
              |
              v

      +------------------------+
      |     Guest VM           |
      |              +--+ +--+ |
      +--------------|tx|-|rx|-+
                     +--+ +--+
       +--------+      ^   ^
       | QEMU   |        /
       +--------+        |
  +----------------------|------+
  | Kernel/HV            v      |
  |                 +-------+   |
  |             +-> | vhost |   |
  |             |   +-------+   |
  |             v               |
  |       +---------+           |
  |       | macvtap |           |
  |       +---------+           |
  |           ^                 |
  |           |                 |
  |           v                 |
  | +-----------+ +-----------+ |
  | | VF NIC #2 | | VF NIC #1 | |
  | +-----------+ +-----------+ |
  |           ^      ^          |
  |           |      |          |
  |           v      v          |
  |       +---------------+     |
  +-------| Physical NIC  |-----+
          +---------------+
                  ^
                  |
                  v

How to use kexec

Tue Jun 15 09:07:36 2010

1. check if current kernel support kexec
# grep KEXEC /boog/config-2.6.34-rc6

2. install kexec tools
1) apt-get / yum install kexec-tools
2) src: http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools-2.0.1.tar.gz

3. get command line of new kernel
# cat /boot/grub/menu.lst
title linux-2.6.34-rc7
root (hd0,5)
kernel /boot/vmlinuz-2.6.34-rc7 root=/dev/sda6
initrd /boot/initrd.img-2.6.34-rc7
boot

4. setup parameters
# kexec -l /boot/vmlinuz-2.6.34-rc7 –append=”root=/dev/sda6″ –initrd=/boot/initrd.img-2.6.34-rc7

5. switch to new kernel
# kexec -e
System will hot-reboot

Virtual Virtio Nic

keywords: network, virtio, vhost, virtualization

前两周一直在研究网卡offload的特性,目的是通过ethtool设置虚拟网卡功能,进行功能验证。物理网卡、虚拟e1000基本都搞清楚了,rtl8139比较老,很多新特新都不支持,所以忽略。问题就处在了Virtio虚拟网卡上,这个玩意不同于一般的虚拟网卡,不是单纯的硬件模拟,她需要利用内核里边提供的相关API,争取最高性能。由于是内核跟hypervisor相互调用,所以虚拟机用户感知到的网卡功能,也需要hypervisor的支持(特性支持、参数配置等)。
QEMU 有个新参数 “-netdev tap,vhost=on…” 替换了原来的 “-net tap,…”,用于创建网络设备,很多新特性只有在新参数才能使用。比如虚拟网卡的offload功能,老参数需要QEMU实现对offload功能的支持,目前只能使用GSO一种。新参数则可以使用主机内核提供的vhost支持,offload工作由内核中的vhost_net模块来完成,性能提升就不用说了,rx/tx/sg/tso/gso/ufo都支持。开始觉得奇怪,为什么不支持receive offload?offload的思想就是把数据切割/组装尽可能由硬件,或者由较下层(网络层、数据链路层、物理层)做,所以虚拟网卡并不是实际上的最底层,QEMU虚拟机只是物理的一个进程而已,应该交给物理机的硬件/较下层处理,所以virtio网卡不需要received offload。

用前面主要是花时间搞懂了Virtio在内核中的实现代码,QEMU中的调用、virtio网卡队列的实现等。vhost把虚拟机IO降到内核里已经不是新闻了,所以下面目标转向vhost的实现,需要分析代码。

virtio:towards a de-facto standard for virtual i o devices: http://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf
qemu : http://www.qemu.org/
vhostnet: http://fedoraproject.org/wiki/Features/VHostNet
virtio: http://www.linux-kvm.org/page/Virtio