Neutron中的网络I/O虚拟化
为了提升网络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网卡中实现。
linux传统tap + bridge(VEB, Virtual Ethernet Bridge)实现网络虚拟化技术有一个重要特点, 就是使用server的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), 简单来说它通过port汇聚和数据分类转发,
把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模型创建升级版的虚拟网络,引出虚拟机网络流量。降低Hostserver负载;
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要支持:
- set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
- set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
- set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"
- optional setting:
- 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)
- Load the PCI Stub Driver if it is compiled as a module
- modprobe pci_stub
- lspci -n
- locate the entry for device 01:00.0 and note down the vendor & device ID 8086:10b9
- ...
- 01:00.0 0200: 8086:10b9 (rev 06)
- ...
- echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
- echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
- echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind
复制代码
5, assign device:
- 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设备
- pci_passthrough_whitelist=[{ "vendor_id":"8086","product_id":"1520"}]
复制代码
2。控制节点中定义别名:
- pci_alias={"vendor_id":"8086", "product_id":"1520", "name":"a1"}
复制代码
3, 启动pci devices filter
- scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
- scheduler_available_filters=nova.scheduler.filters.all_filters
- scheduler_available_filters=nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
- scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
复制代码
4, 依据别名定义flavor,a1:2中的2是指要求两块pci设备:
- nova flavor-key m1.large set "pci_passthrough:alias"="a1:2"
复制代码
5, 依据flavor启动虚机:
- 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的详细信息格式例如以下:
- virsh nodedev-dumpxml pci_0000_0b_00_0
- <device>
- <name>pci_0000_0b_00_0</name>
- <parent>pci_0000_00_01_0</parent>
- <driver>
- <name>igb</name>
- </driver>
- <capability type='pci'>
- <domain>0</domain>
- <bus>11</bus>
- <slot>0</slot>
- <function>0</function>
- <product id='0x10c9'>Intel Corporation</product>
- <vendor id='0x8086'>82576 Gigabit Network Connection</vendor>
- </capability>
- </device>
复制代码
使用“virsh nodedev-dettach pci_0000_0b_10_0”命令能够将一块SR-IOV网卡的虚拟功能从host分离,从而使虚机能够通过例如以下格式用到它的虚拟功能。
- <hostdev mode='subsystem' type='pci' managed='yes'>
- <source>
- <address bus='0x0b' slot='0x10' function='0x01'/>
- </source>
- </hostdev>
复制代码
OpenStack是怎样使用并实现SR-IOV特性的呢?见:https://review.openstack.org/#/c/67500/
- nova boot --flavor m1.large --image <image-uuid> --nic net-id=<net-uuid>,vnic-type=<normal|direct|macvtap> vm
- neutron port-create <net-uuid-or-name> --binding:vnic-type <normal|direct|macvtap>
- 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的调度.
- 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
- [securitygroup]
- firewall_driver = neutron.agent.firewall.NoopFirewallDriver
- [ml2]
- tenant_network_types = vlan
- type_drivers = vlan
- mechanism_drivers = openvswitch,sriovnicswitch
- [ml2_type_vlan]
- network_vlan_ranges = physnet1:2:100
复制代码
b、cat /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
- [ml2_sriov]
- agent_required = True
- [sriov_nic]
- physical_device_mappings = physnet1:eth1
- # eth1:0000:07:00.2; 0000:07:00.3, eth2:0000:05:00.1; 0000:05:00.2
- 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
Neutron中的网络I/O虚拟化的更多相关文章
- Neutron VxLAN + Linux Bridge 环境中的网络 MTU
1. 基础知识 1.1 MTU 一个网络接口的 MTU 是它一次所能传输的最大数据块的大小.任何超过MTU的数据块都会在传输前分成小的传输单元.MTU 有两个测量层次:网络层和链路层.比如,网络层 ...
- openstack neutron 二/三层网络实现
引用声明:https://zhangchenchen.github.io/2017/02/12/neutron-layer2-3-realization-discovry/ 一.概述 Neutron是 ...
- neutron中创建子网时禁用dhcp服务的问题
在neutron中创建provider网络时,可以指定是否禁用dhcp.若禁用,就可以使用物理网络中的dhcp服务.若使用物理网络的dhcp,就要禁用子网中提供的.如图
- 【整理】Virtualbox中的网络类型(NAT,桥接等),网卡,IP地址等方面的设置
之前是把相关的内容,放到: [已解决]实现VirtualBox中的(Guest OS)Mac和主机(Host OS)Win7之间的文件和文件夹共享 中的,现在把关于网络配置方面内容,单独提取出来,专门 ...
- 网络I/O虚拟化,SR-IOV技术
1.简介 网络I/O虚拟化是服务器虚拟化技术的重要组成部分,在服务器虚拟化技术领域,计算虚拟化(如CPU和内存虚拟化)已经日趋成熟,但是,网络I/O虚拟化技术的发展相对比较滞后.当前,主流的网络I/O ...
- KVM中的网络简介(qemu-kvm)
emu-kvm主要向客户机提供了如下4种不同模式的网络: 1)基于网桥(bridge)的虚拟网卡 2)基于NAT(Network Addresss Translation)的虚拟网络 3)QEMU内置 ...
- 网络IO的虚拟化模型小结
网络IO的虚拟化模型随着技术发展,出现了多种方式,例如emulation.para-virtualization.pass-through和SR-IOV等,本文试图对其做一个简单的总结. Emulat ...
- K8s中的网络
Kubernetes的网络通信问题: 1. 容器间通信: 即同一个Pod内多个容器间通信,通常使用loopback来实现. 2. Pod间通信: K8s要求,Pod和Pod之间通信必须使用Pod-IP ...
- 基于MACVLAN配置VMWARE虚拟机中容器网络
基于MACVLAN配置VMWARE虚拟机中容器网络 测试部环境组 201711 0 文档说明 MACVLAN是docker的一种支持跨主机网络的driver.macvlan本身是linux kerne ...
随机推荐
- 揭开WebService的神秘面纱
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- jquery滚轮事件
// jquery 兼容的滚轮事件 $(document).on("mousewheel DOMMouseScroll", function (e) { var delta = ( ...
- JavaScript(十二)事件
Dom事件 1.DOM0级事件 on事件 只能 监听冒泡阶段 切只能绑定一个事件 dom.onclick = function(){}; 2.Dom2级事件 可以绑定多次事件 可以通过设置fla ...
- 如何取消android studio启动时自动打开上次关闭的项目
Androidstudio默认每次android studio启动就会自动打开上次关闭的项目,如果想要取消并让它显示此界面 只需要
- python自动化--mock、webservice及webdriver模拟手机浏览器
一.mock实现 自定义一个类,用来模拟未完成部分的开发代码 class Say(): def say_hello(self): pass 自定义返回值 import unittest from un ...
- MySQL性能优化必备25条
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...
- 12Microsoft SQL Server 索引
Microsoft SQL Server 索引 8.1创建索引 CREATE INDEX idx_name ON table_name(列名) --创建非聚集索引 use student go cre ...
- [Algorithm] 7. Serialize and Deserialize Binary Tree
Description Design an algorithm and write code to serialize and deserialize a binary tree. Writing t ...
- [USACO] 打井 Watering Hole
题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastures which are conven ...
- python whl模块安装方法
搞了半个小时可算是安装上去了 做法 ①先cmd输入Python看一下自己的Python是什么版本的,以及自己的平台,我这里是win32以及python3.6 ②然后去寻找合适的whl,注意cp就是版本 ...