之前的多篇文章介绍了网络虚拟化常见的技术实现,特别是virtio/vhost技术的实现。虽然virtio/vhost架构显著改善了虚拟网络的性能,但virtio网卡仍然是软件模拟的设备,其性能稳定性和资源占用率显然无法达到物理网卡的水平。虚拟网络其实还有一种实现方式——设备直通,让虚拟机与网卡直接交互,从而获得最高的网络性能。但这种方式显然无法大规模使用,因为物理网卡的数量是有限的,成本也很高,无法为每个虚拟机分配一个。

SR-IOV(Single Root I/O Virtualization)技术就是为了解决上述问题而产生的。通过SR-IOV技术,单个物理网卡能够提供多个网卡的接口和功能,从而让每个虚拟机都能直接和物理网卡通信,获得接近物理网卡的网络性能。

本文将讨论SR-IOV的基本原理和使用场景。

问题

  1. SR-IOV和MR-IOV有什么关系和区别?
  2. SR-IOV模拟出的VF和普通网卡在功能上和使用上有什么区别?
  3. 虚拟机是如何完成VF的配置和初始化的?
  4. 虚拟机与VF直接交互时,是如何注册设备的DMA地址的?

SR-IOV概念

SR-IOV中的SR(Single Root)是与MR-IOV相对的。SR-IOV和MR-IOV都是PCI-SIG定义的IO设备硬件虚拟规范。这里的Single Root和Multi Root中的Root指的是PCI根节点,基本上可以看做是单个计算节点的接入点。支持SR-IOV的IO设备只能同时为单个节点服务,相应的MR-IOV设备就能同时接入多个节点工作。MR-IOV主要是为刀片架构设计的,允许多个计算刀片通过同一个MR-IOV设备实现IO功能。普通服务器上的网卡只需要支持SR-IOV即可,例如Intel经典的82599系列。

SR-IOV是让PCIE设备扩展支持硬件虚拟化的规范,具体规范可见https://composter.com.ua/documents/sr-iov1_1_20Jan10_cb.pdf

在规范中,定义了SR-IOV设备可以支持两个类别的功能:PF(Physical Function)和VF(Virtual Function)。

PF顾名思义就是普通物理设备原有的功能。只是在支持SR-IOV的设备上,PF还拥有了配置和初始化VF的能力。SR-IOV规范中要求PF增加了一个SR-IOV专用的寄存器,用于配置和开关SR-IOV能力。

VF就是虚拟化出来的虚拟设备。在操作系统角度看,VF是PCIE总线上的一个物理设备,只是和物理网卡共用一个PCIE slot。VF创建后,系统可以像操作普通网卡那样操作VF网卡,只是需要使用专门的网卡驱动。以intel的10GE网卡82599为例,PF的驱动是标准的ixgbe,VF的驱动是ixgbevf。

根据规范,单个PF可以生成65536个VF,但实际上网卡不可能支持这么多VF。网卡支持的具体VF数量与网卡的硬件资源有关,例如82599支持64个VF。

SR-IOV的使用

SR-IOV虽然是为虚拟化环境设计的,但从功能和使用上说和软件层面的虚拟化没有什么直接关系。对VF的创建和配置是在PF驱动的基础上执行的,通过PF驱动向上暴露的接口操作。例如通过/sys/bus/pci/devices/$BDF/sriov_numvfs就能动态创建指定数量的VF,在驱动加载时直接传入参数也能达到相同的效果。

在VF被创建后,在host系统中就可以当做是一个真实的物理网卡使用,可以通过内核驱动或DPDK的用户态驱动来操作。

如果要在guest中使用VF,需要在qemu启动虚拟机时配置设备直通模式,通过qemu实现guest对VF的配置和内存映射,最终让guest能够与VF直接DMA通信。大体结构如下图所示。

这里就有一些问题,guest是不能直接访问物理机的PCI总线和设备的,那么它是怎么发现和配置VF的?另外guest中使用的地址空间是GVA/GPA,VF如何使用这些地址去执行DMA?这些工作都需要在qemu和KVM的支持下完成。

QEMU设备直通

这里涉及到的技术称为QEMU设备直通。通过设备直通,guest中设备驱动对device的操作可以原样作用在host的物理设备上。设备直通的具体原理和实现可以参考https://www.donglizhang.org/virt-passthrough.pdf和qemu VM device passthrough using VFIO, the code analysis。大体上说,可以分为几个步骤:

  1. 在guest的虚拟PCI总线上模拟直通设备的存在,使guest OS可以检测到直通设备
  2. 将部分PCI bar设备地址空间(例如rx/tx ring、doorbell)映射到guest地址空间,使guest可以直接读写直通设备内存地址
  3. 通过IOMMU/VFIO映射GPA=>HPA地址,使guest写入设备内存的GPA地址可以被设备直接DMA访问
  4. 通过IOMMU/VFIO重定向设备中断

关于IOMMU和VFIO的部分可以参考上一篇文章:网络虚拟化——virtio-user_dillanzhou的博客-CSDN博客

可以看到,设备直通在设备检测和初始化的阶段是需要qemu/kvm的支持的,但在初始化完成后数据面的交互是可以由guest与设备直接完成的。除了中断处理需要vfio/kvm参与外,guest与直通设备的通信过程和效率可以与host基本相同。

需要注意的是设备直通技术其实与SR-IOV也没有直接关系,只是在有了SR-IOV设备后设备直通技术才有了较大的应用空间。

小结

我们在本文中讨论了SR-IOV的概念以及在Host/Guest中的使用方法和实现。最后来看一下文章开始时的问题:

1. SR-IOV和MR-IOV有什么关系和区别?

SR-IOV只需要支持一个节点(其实就是PCI总线根节点,PCI Root Complex)。MR-IOV支持同时服务多个节点。MR-IOV是在SR-IOV的基础上增加了多节点支持,支持MR-IOV就必然支持SR-IOV。

2. SR-IOV模拟出的VF和普通网卡在功能上和使用上有什么区别?

从使用和表现上和普通网卡没有区别,但VF的功能特性和资源使用量可能比这个设备的PF要少,例如支持的队列数可能会较少,或者某些特性不支持。另外VF和PF最终需要共享带宽和资源。

3. 虚拟机是如何完成VF的配置和初始化的?

部分PCI bar空间(例如rx/tx ring)会被qemu映射到guest地址空间,让guest可以直接访问;另外部分较复杂的配置空间(例如MSI-X中断表),由qemu trap处理。

4. 虚拟机与VF直接交互时,是如何注册设备的DMA地址的?

qemu会维护GPA=>HPA的页表信息,guest只需要向设备写入GPA地址,设备DMA访问时IOMMU会根据页表查询到HPA地址并访问。

通过SR-IOV技术,虚拟机和容器可以直接向网卡收发报文,网络性能不再受限于vhost的处理和转发性能,也节省了vhost的资源开销。

但在虚拟机中使用网卡VF也产生了一个问题,就是虚拟机必须使用VF对应的驱动,这就导致虚拟机在不同物理机间的迁移受到了限制。如果两台物理机使用了不同厂商型号的网卡,由于VF驱动不同,热迁移是不可能实现的,冷迁移也要求guest系统有很好的设备自适应和配置能力。此外,如果网卡的固件和功能升级,guest中的VF驱动版本可能也需要升级,这对虚拟机的部署运维来说也是个很麻烦的问题。

在下一篇文章中,我们将讨论vDPA技术,这种技术让SR-IOV网卡的VF提供标准的virtqueue数据面接口,同时保留在驱动中自定义控制面功能的灵活性。从而解决虚拟机对特定网卡和驱动的依赖,同时保留网卡功能的多样性和可扩展性。

网络虚拟化——SR-IOV相关推荐

  1. 华为dra路由方式分为relay和proxy_华为云计算(3)——网络虚拟化

    ​关注微信公众号IT小组,获取更多干货知识~ 一.网络虚拟化 网络虚拟化在介绍网络虚拟化之前,需要考虑一个问题--为什么需要网络虚拟化呢?之所以要对网络进行虚拟化,是因为在没有进行虚拟化之前,每个服务 ...

  2. 华为云05之网络虚拟化

    华为云之网络虚拟化 网络虚拟化有三种实现方式: 1.直接是Domain0来完成网络虚拟化. 2.底层硬件层是一个智能的网卡(INIC),在VM侧装Tools,利用Tools的驱动来使用INIC,不过这 ...

  3. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...

  4. 【微软公有云系列】Hyper-v(WinSer 2012 R2)网络虚拟化(三)租户隔离

    前两章讲了挺多的理论知识,是希望让大家有一点了解,对网络基础不太好的朋友们或许看的会有点(◎﹏◎),不过不要紧,心里大概有个概念就行,接下来的会带给大家一些动手实践的Demo,加深大家对网络虚拟化(N ...

  5. Linux 虚拟化网络技术 — KVM + Linux Bridge 的网络虚拟化解决方案

    目录 文章目录 目录 KVM 虚拟机应用 Linux Bridge + VLAN 实现网络隔离 TSG: Failed to restart network KVM 虚拟机应用 Linux Bridg ...

  6. 网络虚拟化是否需要额外的网络架构?

    这是否是一个绝对的要求?不是.你是否需要一个网络架构来有效运作?在某些时候也许是这样,但事实是,你不需要任何花哨的VXLAN隧道功能也可以在相对传统的以太网交换机中部署网络虚拟化覆盖.对于小型或地理分 ...

  7. linux 的ip 设置lo_linux网络虚拟化: network namespace 简介及实验

    namespace(命名空间)和cgroup是软件容器化(想想Docker)趋势中的两个主要内核技术.简单来说,cgroup是一种对进程进行统一的资源监控和限制,它控制着你可以使用多少系统资源(CPU ...

  8. 天翼云从业认证(1.6)虚拟化技术基础、服务器虚拟化、存储虚拟化和网络虚拟化技术;

    虚拟化技术基础.服务器虚拟化 常见虚拟化技术:vmware.xen.kvm. 虚拟化技术特征:分区.隔离.封装.相对于硬件独立. 全虚拟化:抽象VM具有完全的物理机特征,操作系统在其上运行,不需要任何 ...

  9. esxi6.7虚拟机网卡连接第二个虚拟交换机_Linux云计算底层技术之网络虚拟化

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,第一时间掌握技术干货! 网络虚拟化相对计算.存储虚 ...

最新文章

  1. matlab程序求一个正交的相似变换矩阵,图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现...
  2. Excel删除区域名
  3. capsule 安装_CAPSULE SERVANT安卓版下载-CAPSULE SERVANT手游app安装-菜鸟下载
  4. Java网络编程3---Socket-UDP编程
  5. 关于缓存的几篇好文章
  6. 结对项目开发-电梯调度
  7. java 扫描自定义注解_利用spring 自定义注解扫描 找出使用自定义注解的类
  8. python web全栈工程师招聘_【笔记】Web全栈工程师的自我修养(上)
  9. axure rp8 添加动态面板_AxureRP教程
  10. 经理人必看的10个管理网站
  11. 技术领导者空降后,如何管理全新的团队
  12. GF(256)下的乘法
  13. ansiblea基本使用
  14. 微信如何做好服务器,如何用免费服务器做微信JS开发
  15. Axure嵌入Gis地图--javascript (js)注入
  16. c语言 结构体ppt,C语言知识学习结构体.ppt
  17. 车载通信——CAN收发器与CAN控制器
  18. Java函数的基本知识
  19. Trident state
  20. 清除Windows安全中心保护历史记录方法

热门文章

  1. 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
  2. 剑侠三最新的服务器,《剑网三》新资讯:为何其它三个服务器拒绝与四合一合服?...
  3. wordpress插件_13个适用于WordPress的免费用户管理插件
  4. 【章节总结】理科数学——立体几何
  5. 这回稳了!广和通4G低功耗摄像头解决方案全新来袭
  6. 山西移动E900V21E_S905L3_线刷固件包
  7. mt2503 在MMI版本实现AT+CPBF
  8. mt7621dtsi
  9. springboot和springcloud的区别是什么?
  10. UOS服务器操作系统下载RPM包和依赖