SR-IOV Study

作者:Maxwell Li
日期:2018/08/09
未经作者允许,禁止转载本文任何内容。如需转载请留言。


[TOC]

I/O 虚拟化

I/O 虚拟化技术有三种:Device Emulation、PCI Pass-through 和 SR-IOV。这三种虚拟化技术在不同程度上实现了 I/O 设备的虚拟化功能。

PCI Pass-through

该方式允许将宿主机中的物理 PCI 设备直接分配给虚拟机使用。KVM 支持虚拟机以独占方式访问这个宿主机的 PCI/PCI-E 设备。通过硬件支持的 VT-d 技术将设备分给虚拟机后,在虚拟机看来,设备是物理上连接在 PCI 或者 PCIe 总线上的,客户机对该设备的 I/O 交互操作和实际的物理设备操作完全一样,几乎不需要 KVM 的参与。运行在 VT-d 平台上的 QEMU/KVM 可以分配网卡、磁盘控制器、USB控制器等设备供虚拟机直接使用。

  • 优点:在执行 I/O 操作时绕过 Hypervisor 层,直接访问物理 I/O 设备,极大地提高了性能,可以达到几乎和原生系统一样的性能。
  • 缺点:
    1. 一台服务器主板上允许添加的 PCI 和 PCIe 设备有限,大量使用 VT-d 独立分配设备给客户机,让硬件设备数量增加,增加硬件投资成本。
    2. 对于使用 VT-d 直接分配了设备的客户机,无法进行动态迁移。

SR-IOV

基本原理

VT-d 的性能非常好,但是它的物理设备只能分配给一个虚拟机使用。为了实现多个虚拟机共享一个物理设备,并且达到直接分配的目的,PCI-SIG 组织发布了 SR-IOV (Single Root I/O Virtualization) 规范,它定义了一个标准化的机制用以原生地支持实现多个客户机共享一个设备。SR-IOV 广泛应用在网卡上。

SR-IOV 使得一个单一的功能单元(比如,一个以太网端口)能看起来像多个独立的物理设备。一个带有 SR-IOV 功能的物理设备能被配置为多个功能单元。SR-IOV 使用两种功能:

  • PF(Physical Functions):这是完整的带有 SR-IOV 能力的PCIe 设备。PF 能像普通 PCI 设备那样被发现、管理和配置。
  • VF(Virtual Functions):简单的 PCIe 功能,它只能处理 I/O。每个 VF 都是从 PF 中分离出来的。每个物理硬件都有一个 VF 数目的限制。一个 PF 能被虚拟成多个 VF 用于分配给多个虚拟机。

Hypervisor 能将一个或者多个 VF 分配给一个虚拟机。在某一时刻,一个 VF 只能被分配给一个虚拟机。

SR-IOV

先决条件

  1. 需要 CPU 支持 Intel VT-x 和 VT-d 并在 BIOS 中已启用。
  2. 硬件设备需要支持 SR-IOV 功能。
  3. 需要 QEMU/KAM 的支持。

SR-IOV 部署

官方配置文档请参考:SR-IOV-Passthrough-For-Networking

Step1 配置 BIOS 和 Linux 内核 (Compute)

在所有需要配置 SR-IOV 的计算节点上开启 Intel VT-d 和 SR-IOV 配置。
并且将以下参数添加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX 配置项中。

intel_iommu=on

执行以下命令并重启计算节点。

$ grub2-mkconfig -o /boot/grub2/grub.cfg

Step2 通过 PCI SYS 接口在网卡上创建多个 VF (Compute)

$ echo '0' > /sys/class/net/eth1/device/sriov_numvfs
$ echo '7' > /sys/class/net/eth1/device/sriov_numvfs

Step3 设置 nova-compute 设备白名单 (Compute)

$ crudini --set /etc/nova/nova.conf DEFAULT pci_passthrough_whitelist "{\"devname\": \"eth1\", \"physical_network\": \"physnet\"}"
$ service openstack-nova-compute restart

Step4 配置 sriov_agent.ini 并启动 sriov-agent 服务 (compute)

$ crudini --set /etc/neutron/plugins/ml2/sriov_agent.ini sriov_nic physical_device_mappings physnet:eth1
$ crudini --set /etc/neutron/plugins/ml2/sriov_agent.ini sriov_nic exclude_devices
$ crudini --set /etc/neutron/plugins/ml2/sriov_agent.ini securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver

$ systemctl enable neutron-sriov-nic-agent.service
$ systemctl start neutron-sriov-nic-agent.service

Step5 Neutron 使用 ML2 机制驱动来支持 SR-IOV,执行以下步骤配置 SR-IOV 驱动。(controller || network)

$ crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types vlan,vxlan
$ crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers openvswitch,sriovnicswitch
$ crudini --set /etc/neutron/plugins/ml2/ml2_conf_sriov.ini ml2_sriov supported_pci_vendor_devs 8086:1520
$ sed -i 's/plugin.ini/& --config-file \/etc\/neutron\/plugins\/ml2\/ml2_conf_sriov.ini/' /usr/lib/systemd/system/neutron-server.service

systemctl daemon-reload
service neutron-server restart

支持的 vendor_id 可以通过以下命令在计算节点上查询。

$ lspci -nn | grep "Ethernet Controller Virtual Function"

Step6 配置 FilterScheduler (controller)

$ crudini --set /etc/nova/nova.conf DEFAULT scheduler_available_filters nova.scheduler.filters.all_filters
$ crudini --set /etc/nova/nova.conf DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter

$ service openstack-nova-scheduler restart

Step7 测试验证

$ wget http://artifacts.opnfv.org/yardstick/third-party/yardstick-loopback-v1_1.img
$ source /opt/admin-openrc.sh
$ glance image-create \
    --name "yardstick" \
    --file yardstick-loopback-v1_1.img \
    --disk-format qcow2 \
    --container-format bare

$ openstack aggregate create --zone=sr-iov sr-iov
$ openstack aggregate add host sr-iov host4
$ openstack aggregate add host sr-iov host5

$ nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
$ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0

$ neutron net-create ext-net \
    --provider:network_type vlan \
    --provider:segmentation_id 3603 \
    --provider:physical_network physnet \
    --router:external "True"

$ neutron subnet-create \
    --name ext-subnet \
    --gateway 192.168.36.1 \
    --allocation-pool \
    start=192.168.36.223,end=192.168.36.253 \
    ext-net 192.168.36.0/24

$ neutron port-create ext-net --name sr-iov --binding:vnic-type direct

$ openstack server create \
    --flavor m1.large \
    --image yardstick \
    --security-group default \
    --nic port-id=$(neutron port-list | grep sr-iov | awk '{print $2}') \
    --availability-zone sr-iov demo1

架构对比

PCI Pass-through 和 SR-IOV 架构

参考资料:

SR-IOV Configuration Guide
SR-IOV-Passthrough-For-Networking
Redhat OpenStack SR-IOV Configure
SDN Fundamentails for NFV, Openstack and Containers
KVM Introduction: SR-IOV
PCI Passthrough of host network devices
OpenStack Networking
Attaching physical PCI devices to guests

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容