SRIOV 简介

OpenStack 自 Juno 版本开始引入 SRIOV,SRIOV(Single Root I/O Virtualization) 是将 PCIe(PCI) 设备虚拟化成虚拟 PCIe(PCI) 的技术,它最典型的应用是对网卡设备的虚拟化,这里讨论的都是网卡设备的虚拟化。
 
SRIOV 有两个重要概念: PF(Physical Function) 和 VF(Virtual Function)。PF 是 host 上的物理实体,VF 则是 PF 虚拟出来的设备。创建 VM 时,VF attach 到 VM 上。对于 VM 来说, VF 和实体 PF 没有什么区别。同时,通过 VF 访问外网不需要经过 OVS(br-int/tap...) 等设备,从而减少了流程,降低了网络延时。

SRIOV 配置

配置 SRIOV 有两种方式:
 
1. 已安装好的 OpenStack 上配置 SRIOV,需要通过以下几个步骤:
1) compute node 上创建 VF
2) compute node 上配置 whitelist PCI devices
3) controller node 上配置 neutron-server
4) controller node 上配置 nova-scheduler
5) compute node 上使能 sriov-agent
 
详细配置信息可参考这里
 
2. 安装 OpenStack 的时候在配置文件上配置好 SRIOV 信息:
NovaPCIPassthrough:
- devname: "ens10"
trusted: "true"
physical_network: "sriov-a"
- devname: "ens11"
trusted: "true"
physical_network: "sriov-b"
- devname: "ens20"
trusted: "true"
physical_network: "sriov-a"
- devname: "ens21"
trusted: "true"
physical_network: "sriov-b"

NeutronPhysicalDevMappings: "sriov-a:ens10,sriov-a:ens20,sriov-b:ens10f1,sriov-b:ens21"
physical_network 表示 OpenStack 的 provider network,详细配置信息可看这里
 
安装完成之后,登到 compute node 上查看 SRIOV 是否使能:
[root@compute-1 home]# cat /sys/class/net/ens10/device/sriov_
sriov_drivers_autoprobe sriov_offset sriov_totalvfs
sriov_numvfs sriov_stride sriov_vf_device
[root@compute-1 home]# cat /sys/class/net/ens10/device/sriov_numvfs
16
[root@compute-1 home]# cat /sys/class/net/ens10/device/sriov_totalvfs
63
其中,ens10 表示 PF,sriov_numvfs 表示 PF 虚拟出来的 VF 数目,sriov_totalvfs 表示最多可虚拟的 VF 数目。
 
检查 VF 是否出于 up 状态:
[root@compute-1 home]# lspci | grep Eth
09:00.0 Ethernet controller: Intel Corporation 82599 10 Gigabit Dual Port Backplane Connection (rev 01)
09:00.1 Ethernet controller: Intel Corporation 82599 10 Gigabit Dual Port Backplane Connection (rev 01)
09:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
09:10.1 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
09:10.2 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
... [root@compute-1 home]# ip link show ens10
4: ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 48:df:37:0f:19:f0 brd ff:ff:ff:ff:ff:ff
vf 0 MAC 2e:c7:47:d8:26:ea, spoof checking on, link-state auto, trust off, query_rss off
vf 1 MAC 06:13:09:1d:10:47, spoof checking on, link-state auto, trust off, query_rss off
vf 2 MAC fa:f9:c0:ea:17:79, spoof checking on, link-state auto, trust off, query_rss off
...
 

创建带 VF 的 VM

1. 创建网络
$ openstack network create --provider-physical-network physnet2 \
--provider-network-type vlan --provider-segment 1000 \
sriov-net $ openstack subnet create --network sriov-net \
--subnet-pool shared-default-subnetpool-v4 \
sriov-subnet
 
2. 创建 sriov port
$ openstack port create --network $net_id --vnic-type direct \
sriov-port
其中,vnic-type 分别有三种模式:normal, macvtap 和 direct。normal 是 vif 在 OVS 中使用的模式;macvtap 是操作系统虚拟化的网卡,使用 macvtap 模式会将 VF attach 到 macvtap 上;direct 是直接将 VF 分配给 VM 的模式;这里使用 direct 模式。
 
查看创建好的 port 属性:
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | |
| binding_profile | trusted='true' |
| binding_vif_details | |
| binding_vif_type | unbound |
| binding_vnic_type | direct |
| created_at | 2020-06-14T03:10:13Z |
| data_plane_status | None |
| description | |
| device_id | |
| device_owner | |
| dns_assignment | None |
| dns_domain | None |
| dns_name | None |
| extra_dhcp_opts | |
| fixed_ips | ip_address='192.168.2.87', subnet_id='35b2c708-ab7b-4a22-8ae4-d6ecd5e8a5ed' |
| id | 815f26de-ba36-4c9b-b8e2-b052fdb7d28d |
| location | cloud='', project.domain_id=, project.domain_name='Default', project.id='b336e515d511487db8d359e8722c3d7c', project.name='admin', region_name='regionOne', zone= |
| mac_address | fa:16:3e:46:43:be |
| name | sriov-port |
| network_id | 23b60822-b4c7-4501-b509-e9deb92ae925 |
| port_security_enabled | True |
| project_id | b336e515d511487db8d359e8722c3d7c |
| propagate_uplink_status | None |
| qos_policy_id | None |
| resource_request | None |
| revision_number | 1 |
| security_group_ids | 1777fd33-ffd9-404d-b58e-0eb15e0b2c13 |
| status | DOWN |
| tags | |
| trunk_details | None |
| updated_at | 2020-06-14T03:10:13Z |
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
创建 port 是通过 neutron 组件来完成的,port 在未 attach 到 VM 之前具有较少的属性,其中,binding_vif_type 表示绑定的 vif 类型,有 HW_VEB, VIF_TYPE_802_QBH 和 VIF_TYPE_802_QBG,vif 是 Virtual Network Interface 的缩写;binding_host_id 是 nova 根据 port 属性等调用 nova-scheduler 分配的计算节点。
 
从 sriov port 可以看到 mac 地址已经有了,在计算节点通过 ip link show 查看具体是哪个计算节点分配的 VF:
[root@compute-1 home]# ip link show ens10 | grep fa:16:3e:8b:c6:51
vf 11 MAC fa:16:3e:8b:c6:51, spoof checking on, link-state auto, trust off, query_rss off
可以看出,port 是 sriov-a(provider network) 中的 ens10 端口虚拟出来的第 11 个 VF。
 
由于该 port 是在 computer-1 上的,所以 nova-scheduler 在调度分配计算节点时,其中的 PciPassthroughFilter 会将计算节点选定为 computer-1。值得注意的一点是 OpenStack 还不支持 attach sriov port 到一个已经存在的节点,猜测可能和这方面有关,即 sriov port 在创建时已经分配好了计算节点,如果 attach 的 VM 不在该计算节点上会出问题。
 
3. 创建 VM
$ openstack server create --flavor m1.large --image ubuntu_18.04 \
--nic port-id=$port_id \
test-sriov
 
查看 VM 是否属于 computer-1:
[root@controller-0 ~]# openstack server show demo | grep compute
| OS-EXT-SRV-ATTR:host | compute-1.localdomain
查看 attach 到 VM 后的 sriov port 属性:
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | compute-1.localdomain |
| binding_profile | pci_slot='0000:87:13.4', pci_vendor_info='8086:10ed', physical_network='sriov-a' |
| binding_vif_details | connectivity='l2', port_filter='False', vlan='0' |
| binding_vif_type | hw_veb |
| binding_vnic_type | direct |
| created_at | 2020-06-05T01:39:41Z |
| data_plane_status | None |
| description | |
| device_id | 322443ba-91da-472f-88d5-9e300797d457 |
| device_owner | compute:nova |
| dns_assignment | None |
| dns_domain | None |
| dns_name | None |
| extra_dhcp_opts | |
| fixed_ips | ip_address='192.168.2.7', subnet_id='35b2c708-ab7b-4a22-8ae4-d6ecd5e8a5ed' |
| id | cd35f343-774e-4a31-a353-328e2fbad125 |
| location | cloud='', project.domain_id=, project.domain_name='Default', project.id='b336e515d511487db8d359e8722c3d7c', project.name='admin', region_name='regionOne', zone= |
| mac_address | fa:16:3e:46:43:be |
| name | demo-sriov_a |
| network_id | 23b60822-b4c7-4501-b509-e9deb92ae925 |
| port_security_enabled | True |
| project_id | b336e515d511487db8d359e8722c3d7c |
| propagate_uplink_status | None |
| qos_policy_id | None |
| resource_request | None |
| revision_number | 6 |
| security_group_ids | 1777fd33-ffd9-404d-b58e-0eb15e0b2c13 |
| status | ACTIVE |
| tags | |
| trunk_details | None |
| updated_at | 2020-06-05T01:40:21Z |
+-------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
attach 到 VM 上的 port 的 binding_host_id 确定为 compute-1,binding_profile 为 VF 绑定的 PCI 和 provider 网络信息,binding_vif_type 为 hw_veb,hw_veb 表示同一个计算节点和虚拟子网内,不同 VM 通过内置网卡的硬件 VEB 将报文环回,不需要通过交换机将报文环回。
 
在创建 VM 时,涉及到 Nova 和 Neutron 的交互。对于 Nova 来说它并不知道 Neutron 所创建的 port 的属性信息,使用 --nic 选项使得 nova 从 neutron 处获得 port 的信息。关于 Nova 和 Neutron 的交互可看这里
 

验证 SRIOV

上图中,compute1 的 e0 和 e1 网卡分别虚拟出 vf0 和 vf1。e0 的 vf0 被分配给 VM1,在 VM1 上看到的就是 e0 的网卡。e1 的 vf1 被分配给 VM2,在 VM2 上看到的 e0 就是 VM2 的网卡。并且 compute1 上的 e0 和 e1 分别连到交换机上的 1 号和 9 号端口,其中交换机的 50 口为上连口。构建这个简单的场景来验证 SRIOV 是否使能。
 
具体创建 VM 的方式在上一节已经说了,这里直接看结果。分别登到 VM1 和 VM2 上查看 VM1 和 VM2 上 e0 网口是否使能:
[root@demo1:/home/robot]
# ip a | grep eth0
18: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.57.0.3/27 brd 10.57.0.1 scope global f1om [root@demo:/home/robot]
# ip a | grep eth0
14: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.57.0.2/27 brd 10.57.0.1 scope global f1om # 从 VM1 ping VM2,在 eth0 端口上抓包:
[root@demo:/home/robot]
# ping -I 10.57.0.2 -c 4 10.57.0.3
PING 10.57.0.3 (10.57.0.3) from 10.57.0.2 : 56(84) bytes of data.
64 bytes from 10.57.0.3: icmp_seq=1 ttl=64 time=0.383 ms
64 bytes from 10.57.0.3: icmp_seq=2 ttl=64 time=0.103 ms
64 bytes from 10.57.0.3: icmp_seq=3 ttl=64 time=0.274 ms
64 bytes from 10.57.0.3: icmp_seq=4 ttl=64 time=0.146 ms --- 10.57.0.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3089ms [root@demo1:/home/robot]
# tcpdump -i f1om host 10.57.0.2 -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on f1om, link-type EN10MB (Ethernet), capture size 262144 bytes
22:51:48.904493 ARP, Request who-has 10.57.199.65 tell 10.57.0.2, length 42
22:51:49.146108 IP 10.57.0.3 > 10.57.0.2: ICMP echo reply, id 15, seq 1, length 64
22:51:50.187253 IP 10.57.0.3 > 10.57.0.2: ICMP echo reply, id 15, seq 2, length 64
22:51:51.211443 IP 10.57.0.3 > 10.57.0.2: ICMP echo reply, id 15, seq 3, length 64
22:51:52.235339 IP 10.57.0.3 > 10.57.0.2: ICMP echo reply, id 15, seq 4, length 64
22:51:54.453779 ARP, Request who-has 10.57.0.2 tell 10.57.0.3, length 28
22:51:54.453885 ARP, Reply 10.57.0.2 is-at fa:16:3e:46:43:be, length 42
22:51:54.475245 ARP, Request who-has 10.57.0.3 tell 10.57.0.2, length 42
22:51:54.475260 ARP, Reply 10.57.0.3 is-at fa:16:3e:d6:f0:b6, length 28
22:51:58.917049 ARP, Request who-has 10.57.199.65 tell 10.57.0.2, length 42
22:52:08.936950 ARP, Request who-has 10.57.199.65 tell 10.57.0.2, length 42
 
从 VM1 可以 ping 通 VM2,SRIOV 使能。
 

Trust mode

现在结束 SRIOV 还为时尚早,再介绍个 SRIOV 中值得关注的参数 Trust mode。与其它网口输出的信息不太相同的是 vf 的输出有个 trust off 参数:
[root@compute-1 home]# ip link show ens10 | grep fa:16:3e:8b:c6:51
vf 11 MAC fa:16:3e:8b:c6:51, spoof checking on, link-state auto, trust off, query_rss off
 
它类似于硬件网卡的混杂模式,在创建 VM 的时候可指定将 trust 设为 on,即 vf 将进入 trust on 模式,进入该模式之后 VM 可以做一些特权操作,比如进入混杂模式和修改网卡的 mac 地址等。
关于 Trust mode 的介绍可看这里这里
 
要开启 trust mode on 模式,首先需要在 host 上将 vf trust mode 置成 on,参看这里可在安装的配置 trust mode 为 on,也可手动通过命令将 trust mode 设为 on:
$ ip link set ens10 vf 19 trust on
 
然后,在创建 port 的时候将 port 的 binding:profile 属性设为 trusted(通过 heat 创建 trust mode 可以在 heat template 的 OS::Neutron::port 类型下的 value_specs 里指定 trust mode 参数,详细信息看这里):
openstack port create --network sriov111 \
--vnic-type direct --binding-profile trusted=true \
sriov111_port_trusted
 
最后,创建 VM 时 port 被 attach 到 VM 上,使得 VM 内的网口处于 trust on 模式:
 
可通过命令 /sys/class/net/<eth>/flags 检查网卡是否出于混杂模式(这是硬件上的配置,VM 上还需要 check):
[root@controller-0 ~]# cat /sys/class/net/ens10/flags
0x1003
[root@controller-0 ~]# ifconfig ens10 promisc
[root@controller-0 ~]# cat /sys/class/net/ens10/flags
0x1103
 
注意,trust 模式仅在 Rocky 的 release 版本及之后版本才支持,这里详细介绍了使能 trust mode 后的效果。
 
 
 
(完)
 
 

设备共享分配:虚拟化和 SRIOV的更多相关文章

  1. KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  2. KVM(四) I/O 设备直接分配和 SR-IOV

    (4):I/O 设备直接分配和 SR-IOV 本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较. 1. PCI/PCI-E ...

  3. 网络I/O虚拟化,SR-IOV技术

    1.简介 网络I/O虚拟化是服务器虚拟化技术的重要组成部分,在服务器虚拟化技术领域,计算虚拟化(如CPU和内存虚拟化)已经日趋成熟,但是,网络I/O虚拟化技术的发展相对比较滞后.当前,主流的网络I/O ...

  4. 操作系统-I/O(2)设备的分配

    作业执行前对设备提出申请时,指定某台具体的物理设备会让设备分配变得简单,但如果所指定设备出现故障,即便计算机系统中有同类设备也不能运行 设备独立性:用户通常不指定物理设备,而是指定逻辑设备,使得用户作 ...

  5. 【整理】--【字符设备】分配设备号register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()

    (1) 分配设备编号,注册设备与注销设备的函数均在fs.h中声明,如下: extern int register_chrdev_region(dev_t,unsigned int,const char ...

  6. Ubuntu和Windows设备共享

    http://blog.csdn.net/pipisorry/article/details/51725942 蓝牙设备如键盘.鼠标都可以. 装的双系统win7和Ubuntu,如果只使用一个系统,蓝牙 ...

  7. [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)

    转载自 http://weibo.com/p/1001603980563068394770   @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...

  8. cgroup测试存储设备IOPS分配

    1 使用:创建树并且attach子系统 首先要创建文件系统的挂载点作为树的根 mkdir /cgroup/name mkdir /cgroup/cpu_and_mem Mount这个挂载点到一个或者多 ...

  9. linux设备号分配

    参考:http://blog.chinaunix.net/uid-24460251-id-2606762.htmlhttp://blog.csdn.net/zjjyliuweijie/article/ ...

  10. virtualbox之usb设备的分配

    来源:http://www.cnblogs.com/fsjohnhuang/p/3987545.html 首先下载安装virtualbox的扩展包,因为box原本不支持usb设备.www.virtua ...

随机推荐

  1. Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same(解决)

    问题描述 在使用pytorch训练经典的MNIST数据集时,运行时,出现了以下的问题: Input type (torch.FloatTensor) and weight type (torch.cu ...

  2. IDEA在new对象的时候不显示其parameter

    问题现象 最近安装了一个IDEA2023.1版本,出现了new对象不显示相关构造参数 解决办法 在IDEA的设置中开启相关提示 勾选上面的几个设置,保存 效果

  3. Storm 集群的搭建及其Java编程进行简单统计计算

    一.Storm集群构建 编写storm 与 zookeeper的yml文件 storm yml文件的编写 具体如下: version: '2' services: zookeeper1: image: ...

  4. 江西财经大学第一届程序设计竞赛 I 题 小P和小Q

    题目链接:https://www.nowcoder.com/acm/contest/115/I 这题目要注意的是!!!pow函数前强制类型转换一定要float !!!一定要是float,double不 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (174)-- 算法导论13.3 3题

    三.用go语言,假设图13-5 和图13-6 中子α.β.γ.δ和ε的黑高都是k.给每张图中的每个结点标上黑高,以验证图中所示的转换能保持性质 5. 文心一言: 在Go语言中,你可以通过以下步骤来为图 ...

  6. 未加载mscorlib.pdb

    前言: 早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug! 问题重 ...

  7. 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全

    当前,电商平台会采用基于Docker的容器技术来承载618大促期间的一些关键业务版块,包括最简单的商品图片展示.订单详情页面等等. 通过容器化改造,电商平台的每个业务版块解耦,可以独立开发.部署和上线 ...

  8. 干货分享丨玩转物联网IoTDA服务系列六-恒温空调

    摘要:本文主要讲述空调接入到物联网平台后,通过恒温空调控制系统,不论空调是否开机,都可以调整空调默认温度,待空调上电开机后,自动按默认温度调节. 场景简介 通过恒温控制系统,不论空调是否开机,都可以调 ...

  9. 【终极教程】Cocos2dx服务端重构(优化cocos2dx服务端)

    [终极教程]Cocos2dx服务端重构(优化cocos2dx服务端) 文章目录 概述 问题概述1. 代码混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤2. 缺乏文档3. 缺乏推荐的最佳实践4 ...

  10. Solon Web 开发:三、一个简单的 Web 模板项目(或示例)

    演示 web 程序的常用能力: 控制器.请求参数.参数校验.跳转 过滤器.全局异常处理 静态文件 动态模板 动态模板公共变量及控制器基类 日志 Json 渲染格式控制 模板下载: 打包成 jar ,可 ...