分享

Neutron中的网络I/O虚拟化

xioaxu790 发表于 2014-12-17 13:16:45 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 47973
问题导读
1、如何理解虚拟化的网络?
2、在openstack中运行Snabb需要哪些插件?
3、如何理解目前的neutron技术原理?







    为了提升网络I/O性能,虚拟化的网络I/O模型也在不断的演化:
1,全虚拟化网卡(emulation),如VMware中的E1000用来仿真intel 82545千兆网卡,它的功能更完备,如相比一些半虚拟化的网卡(如vmnet3)会对vlan的支持更好(这点可参见我的另一篇博客《Vmware中的虚拟网络》一文: http://blog.csdn.net/quqi99/article/details/8727130)。纯软件模拟不需要硬件支持,通过CPU计算来模拟,跟宿主机的物理网卡隔离,没有平台要求,对虚拟机的操作系统也不需要修改(因为模拟的都是一个常见的硬件网卡,如IntelE1000,主流操作系统一般都自带这些驱动,因此默认情下虚拟机不需要再安装驱动。缺点就是性能差了。

2,半虚拟化网卡,如上面提到的VMware中的vnet3,以及KVM中的virtio等。在半虚拟化模型中,物理硬件资源是统一由Hypervisor来管理的,这样虚拟机和Hypervisor之间通信有可能直接接触到硬件,因此性能相对较高。缺点就是需要修改虚拟机操作系统需要安装这些半虚拟化网卡的驱动程序。

3,Pass-through直通方式,Hypervisor直接把硬件PCI设备分配给虚拟独占使用,性能当然好啦。但是浪费硬件设备,且配置复杂,首先需要在hypervisor指定通过PCIid方式分配给指定的虚拟机,然后虚拟机再识别到设备再安装驱动来使用。OpenStack中如何使用它可参见:https://wiki.openstack.org/wiki/Pci_passthrough

4,SR-IOV(Single Root I/O Virtualization and Sharing Specification),用来解决虚拟最后一公里的问题,即多个虚机可以同时共享使用同一个PCI硬件。它需要专门支持SR-IOV的硬件网卡,它会在Hypervisor里注册成多个网卡(每个网卡都有独立的中断,收发队列,QoS等机制),将虚拟网卡中的数据分类功能挪到了硬件SR-IOV网卡中实现。
1.png




linux传统tap + bridge(VEB, Virtual Ethernet Bridge)实现网络虚拟化技术有一个重要特点, 就是使用服务器的CPU来通过软件模拟网络, 而硬件厂商出于某些目的希望将由软件实现的网络虚拟化改为由硬件来实现网络虚拟化.于是, 针对云计算中的复杂网络问题, 业办提出了两种扩展技术标准:802.1Qbh和802.1Qbg:
1, 802.1Qbh Bridge Port Extension主要由Vmware和Cisco提出, 尝试从接入层到汇聚层提供一个完整的虚拟化网络解决方案, 尽可能达到软件定义一个可控网络的目的, 它扩展了传统的网络协议, 因此需要新的网络硬件设备, 成本较高.
2, 802.1Qbg Edge Virtual Bridging(EVB)主要由HP等公司联合提交, 尝试以较低成本利用现有设备改进软件模型的网络. 802.1Qbg的一个核心概念是VEPA(Virtual Ethernet Port Aggregator), 简单来说它通过端口汇聚和数据分类转发, 把Host上原来由CPU和软件做的网络处理工作通过发卡模式转移到一级硬件交换机上, 减小Host CPU负载,同时使在一级交换机上做虚拟机的流量监控成为可能, 也更加清晰地分割Host与网络设备的势力范围, 方便系统管理. EVB又分两种:
1, Tag-less VEPA, 用MAC-VID来导流,  即VEPA模式, 无论host内部的流量还是出外部的流量统统经发卡模式再到外部交换机转发
2, VN-Tagged, 用全新的Tag来导流, 如VEPA一样也需要对物理交换机做定制,核心思想是在标准以太网帧中为虚机定制增加一段专用的标记VN-Tag,用以区分不同的vif,从而识别特定的虚机的流量。


Linux Host侧的扩展技术
macvtap(SRIOV用于将硬件网卡虚机很多中断号不同的独立的虚拟网卡给虚机用, macvtap的bridge模式更像是代替了tap设备与bridge设备的组合给虚机直接用的), linux引入的新的网络设备模型, 和tap设备一样, 每一个macvtap设备拥有一个对应的linux字符设置, 并拥有和tap设备一样的IOCTL接口, 因此能直接被qemu使用.引入它的目的是: 简化虚拟环境中的交换网络, 代替传统的tap设备加bridge设备组合, 同时支持新的虚拟化网络技术, 如802.1 Qbg.
macvtap和vlan设备一样是以一对多的母子关系出现的(ip link add link eth1 name macvtap0 type macvtap, 会生成名为macvtap0@eth1的macvtap接口), 可无限嵌套子设备再做母设备创建macvtap子设备, 母设备与子设备被隐含桥接起来, 母设备相当于交换机的TRUNK品, 实际上当 MACVTAP 设备被创建并且模式不为 Passthrough时,内核隐含的创建了MACVLAN网络(如:ip link add link eth1 name eth1.10 type vlan id 10),完成转发功能。MACVTAP 设备有四种工作模式:Bridge、VEPA、Private,Passthrough:

1, Bridge, 完成与 Bridge 设备类似功能,数据可以在属于同一个母设备的子设备间交换转发. 当前的Linux实现有一个缺陷,此模式下MACVTAP子设备无法和Linux Host通讯,即虚拟机无法和Host通讯,而使用传统的Bridge设备,通过给Bridge设置IP可以完成。但使用VEPA模式可以去除这一限制. macvtap的这种bridge模式等同于传统的tap+bridge的模式.
2, VEPA, 式是对802.1Qbg标准中的VEPA机制的部分软件实现,工作在此模式下的MACVTAP设备简单的将数据转发到母设备中,完成数据汇聚功能,通常需要外部交换机支持Hairpin模式才能正常工作。
3, Private, Private模式和VEPA模式类似,区别是子 MACVTAP之间相互隔离。
3, Passthrough, 可以配合直接使用SRIOV网卡, 内核的MACVLAN数据处理逻辑被跳过,硬件决定数据如何处理,从而释放了Host CPU资源。MACVTAP Passthrough 概念与PCI Passthrough概念不同,PCI Passthrough针对的是任意PCI设备,不一定是网络设备,目的是让Guest OS直接使用Host上的 PCI 硬件以提高效率。MACVTAP Passthrough仅仅针对 MACVTAP网络设备,目的是饶过内核里MACVTAP的部分软件处理过程,转而交给硬件处理。综上所述,对于一个 SRIOV 网络设备,可以用两种模式使用它:MACVTAP Passthrough 与 PCI Passthrough

所以使用网络虚拟化具有三个层次:
1, 用户可以零成本地使用 Linux 软件实现的 Bridge、VLAN、MACVTAP设备定制与现实世界类似的虚拟网络;
2, 也可以用非常低的成本按照802.1Qbg中的VEPA模型创建升级版的虚拟网络,引出虚拟机网络流量,减少Host服务器负载;
3, 当有支持 SRIOV 的网卡存在时,可以使用 Passthrough 技术近一步减少Host负载


KVM中使用Pass-through的步骤如下:
http://www.linux-kvm.org/page/Ho ... es_with_VT-d_in_KVM
1,cpu要支持VT-d或AMD I/O Virtualization Technology
2, linux kernel要支持:
  1.     set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
  2.     set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
  3.     set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"
  4.     optional setting:
  5.        set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"
复制代码


3, 上述两步准备好后重启机器验证是否支持: dmesg | grep -e DMAR -e IOMMU
4,  unbind device from host kernel driver (example PCI device 01:00.0)
  1.     Load the PCI Stub Driver if it is compiled as a module
  2.        modprobe pci_stub
  3.     lspci -n
  4.     locate the entry for device 01:00.0 and note down the vendor & device ID 8086:10b9
  5.        ...
  6.        01:00.0 0200: 8086:10b9 (rev 06)
  7.        ...
  8.     echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
  9.     echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
  10.     echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind
复制代码


5, assign device:
  1.    qemu-system-x86_64 -m 512 -boot c -net none -hda /root/ia32e_rhel5u1.img -device pci-assign,host=01:00.0
复制代码


OpenStack中使用的Pass-through步骤如下:
https://wiki.openstack.org/wiki/Pci_passthrough
1,计算节点中定义虚机中可用的pci设备
  1.  pci_passthrough_whitelist=[{ "vendor_id":"8086","product_id":"1520"}]
复制代码


2,控制节点中定义别名:
  1.    pci_alias={"vendor_id":"8086", "product_id":"1520", "name":"a1"}
复制代码


3, 启动pci devices filter
  1.   scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
  2.   scheduler_available_filters=nova.scheduler.filters.all_filters
  3.   scheduler_available_filters=nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
  4.   scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
复制代码


4, 根据别名定义flavor,a1:2中的2是指要求两块pci设备:
  1.   nova flavor-key  m1.large set "pci_passthrough:alias"="a1:2"
复制代码


5, 根据flavor启动虚机:
  1.  nova boot --image new1 --key_name test --flavor m1.large 123
复制代码


KVM中使用SR-IOV配置可参见:http://hj192837.blog.51cto.com/655995/1061407/, 对于硬件支持SR-IOV的网卡,在启动igb模块后(modprobe /etc/modprobe.d/igb.conf igb max_vfs=7)就能用lspci命令看到这块物理网卡已经被注册成了多个SR-IOV网卡,使用virsh nodedev-dupxml命令查看这些SR-IOV的具体信息格式如下:
  1. virsh nodedev-dumpxml pci_0000_0b_00_0
  2. <device>
  3.    <name>pci_0000_0b_00_0</name>
  4.    <parent>pci_0000_00_01_0</parent>
  5.    <driver>
  6.       <name>igb</name>
  7.    </driver>
  8.    <capability type='pci'>
  9.       <domain>0</domain>
  10.       <bus>11</bus>
  11.       <slot>0</slot>
  12.       <function>0</function>
  13.       <product id='0x10c9'>Intel Corporation</product>
  14.       <vendor id='0x8086'>82576 Gigabit Network Connection</vendor>
  15.    </capability>
  16. </device>
复制代码


    使用“virsh nodedev-dettach pci_0000_0b_10_0”命令可以将一块SR-IOV网卡的虚拟功能从host分离,从而使虚机可以通过如下格式用到它的虚拟功能。
  1. <hostdev mode='subsystem' type='pci' managed='yes'>
  2.    <source>
  3.       <address bus='0x0b' slot='0x10' function='0x01'/>
  4.    </source>
  5. </hostdev>
复制代码


OpenStack是如何使用并实现SR-IOV特性的呢?见:https://review.openstack.org/#/c/67500/
  1.   nova boot --flavor m1.large --image <image-uuid> --nic net-id=<net-uuid>,vnic-type=<normal|direct|macvtap> vm
  2.   neutron port-create <net-uuid-or-name> --binding:vnic-type <normal|direct|macvtap>
  3.   nova boot --flavor m1.large --image <image-uuid> --nic port-id=<port-uuid-from-above> vm
复制代码


1,port-binding用于nova和neutron之间传递数据,所以port-binding要增加vnic-type参数,见:https://review.openstack.org/#/c/72334/
  最后它也要挪到能存储任意key-val的binding:profile字典中去,见:https://blueprints.launchpad.net ... ml2-binding-profile
   Replace binding:capabilities with binding:vif_details, https://review.openstack.org/#/c/72452/

2,Implements ML2 mechanism driver for SR-IOV capable NIC based switching, https://review.openstack.org/#/c/74464/

使用了SR-IOV后,就是由硬件桥(Hardware-based Virtual Ethernet Bridging, HW VEB)来通过direct和macvtap方式提供port (VF).
1, Nova端通过pci_passthrough_whitelist将VFs关联到physical_network来支持对sr-iov port的调度.
  1.    pci_passthrough_whitelist = {"address":"*:0a:00.*","physical_network":"physnet1"}
复制代码


2, Neutron端
   Neutron sriovnicswitch ML2用来提供port binding功能向nova提供信息
   Nuetron sriovnicswitch agent当SR-IOV硬件支持VF link state更新时可以用来处理port更新事件
   a、cat /etc/neutron/plugins/ml2/ml2_conf.ini
  1.    [securitygroup]
  2.    firewall_driver = neutron.agent.firewall.NoopFirewallDriver
  3.    [ml2]
  4.    tenant_network_types = vlan
  5.    type_drivers = vlan
  6.    mechanism_drivers = openvswitch,sriovnicswitch
  7.    [ml2_type_vlan]
  8.    network_vlan_ranges = physnet1:2:100
复制代码


   b、cat /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
  1.    [ml2_sriov]
  2.    agent_required = True
  3.    [sriov_nic]
  4.    physical_device_mappings = physnet1:eth1
  5.    # eth1:0000:07:00.2; 0000:07:00.3, eth2:0000:05:00.1; 0000:05:00.2
  6.    neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
复制代码


      演化的根本思想是:虚机  --  虚机网卡(tap)  -- 虚拟化层(用户空间) -- 内核网桥 --  物理网卡。
1, virtio技术通过同时修改物理机操作系统与虚拟化软件从而不需要再模拟完整的虚机网卡,从而绕开一层,提升性能。
2, vhost_net使虚拟机的网络通讯直接绕过用户空间的虚拟化层,直接可以和内核通讯,从而提供虚拟机的网络性能
3, macvtap则是绕过内核网桥


        传统的neutron实际技术是tap + linux bridge + veth,然后通过iptables或ovs流表来实际anti-spoofing与security-group的支持.
Snabb NFV switch的思想是将能将硬件做的事尽量由硬件网卡来做, 如iptables/ebtables/ovs/bridge这些事。
在openstack中运行Snabb需要两个插件:
1, ML2 Snabb Mechanism Driver,
2, Snabb Switch, 运行在每个计算节点上,类似于ovs, 但是它集成了neturon snabb l2 agent的功能, 它在软件和硬件SR-IOV之上提供数据平面,软件提供virtio-net抽象,security group过滤,带宽控制,ethernet-over-ip遂道。SR-IOV硬件则提供zero-copy DMA加速功能, 见:https://github.com/SnabbCo/snabb ... bb-switch-operation






已有(1)人评论

跳转到指定楼层
chistpest 发表于 2015-11-23 12:50:11
谢谢搂住,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条