SR-IOV学习笔记

参考:《深入浅出DPDK》&前人的各种博客
SR-IOV全称Single Root IO Virtualization,单根虚拟化(多么高大上的名字>.<),是 Intel 在 2007年提出的一种基于硬件的虚拟化解决方案。

虚拟化背景

那什么又是虚拟化呢?抽象来说,虚拟化是资源的逻辑表示,虚拟化层将下层的资源抽象成另一种形式的资源,提供给上层调用。通过空间上分割(你用一部分我用一部分),时间上的分时(你用一秒我用一秒)以及模拟,虚拟化可以将一份资源抽象成多份。反过来说,虚拟化也可以将多份资源抽象成一份,比如说,通过对CPU、内存和I/O设备的虚拟化,可以为一个虚拟机提供完整的硬件能力的支持。
总的来说,虚拟化抽象了硬件层,允许多种不同的负载能共享一组资源。
虚拟化的优点非常明显,他可以显著提高服务器的使用率,能够进行动态分配,管理资源和负载的相互隔离,并提供高安全性和自动化。虚拟化还可以提供按需的服务配置和软件定义的资源编排,可以根据实际业务需求在云平台上扩展某类业务。

大致也可以看出俩,虚拟化实现主要有三部分的实现:

  • CPU虚拟化
  • 内存虚拟化
  • I/O虚拟化

CPU虚拟化和内存虚拟化,这里不大关注,我们可以重点看一下I/O虚拟化。

I/O虚拟化

I/O虚拟化包括管理虚拟设备和共享的物理硬件之间的IO请求的路由选择。实现方式有

  • I/O全虚拟化
  • I/O半虚拟化
  • I/O透传
    区别在于处理客户机和宿主机通信以及宿主机和宿主机架构上分别采用了不同的处理方式。
    在这里插入图片描述

I/O全虚拟化

如图所示,该方法可以模拟一些真实设备,一个设备的所有功能或总线结构(中断、DMA等)都可以在宿主机中模拟。客户机所能看到的就是一组统一的IO设备。宿主机截获客户机对IO设备的访问请求,通过软件模拟真实的硬件。
这种方式对客户急非常透明,无需考虑底层硬件的情况,不需要修改操作系统。但宿主机必须从硬件设备的最底层开始模拟,客户机完全感受不到这是在一个模拟的环境中,但这种效率比较低。

I/O半虚拟化

半虚拟化的意思是说,客户机操作系统能感知到自己时虚拟机,如上图所示,IO半虚拟化系统通过前端驱动/后端驱动实现的。客户机的驱动程序为前端,宿主机提供的与客户机通信的驱动程序为后端
前端驱动将客户机的请求通过与宿主机间的特殊通信机制发送给后端驱动,后端驱动在处理完请求再发送给物理驱动。比如,DPDK支持半虚拟化的前端virtio后端vhost
半虚拟化虽然和全虚拟化一样,都是使用软件完成虚拟化工作,但是机制不同。在全虚拟化中,所有对模拟IO设备的访问都会造成VM-Exit(虚拟机暂停运行,并将控制权交还给VMM或hypervisor),而在半虚拟化场景中,通过亲啊后端驱动程序的协商,使得数据传输中对共享内存的读写操作不会VM-Exit。
这种方式比较简单,软件处理起来也不会太慢,性能还算可以,但仍然达不到物理硬件的速度

I/O透传

这非常好理解,直接把物理设备分配给虚拟机使用,比如直接分配一个硬盘或者网卡给虚拟机(咋感觉这种处理已经偏离初始化了…),如上图所示。这种方式需要硬件平台具备IO透传技术,也就是网卡直通(passthough, 又是一个非常高大上的词)比如,Intel VT-d技术,这种方式可以获得近乎本地的性能,并且CPU开销不高。
这种方式优缺点很明显:

  • 高性能
  • 由于Intel VT-d的技术支持,其执行/O操作是大量减少,甚至避免VM-Exit
    缺点:
  • x86平台上的PCI和PCI-e设备有限,大量使用VT-d独立分配设备给客户机,会显著增加硬件成本(硬件厂商狂喜)
  • PCI/PCI-e透传的设备,动态迁移功能(从一台物理服务器迁移到另一台服务器上)受限。因为宿主机无法感知透传设备的内部状态。

其实说白了,一台物理机上可用的物理网卡有限,该如何实现实现水平扩展呢,于是乎,SR-IOV技术应运而生。

PCI-e SRIOV

SR-IOV是一组硬件标准,允许一个PCIe设备(如网络接口卡)在硬件层面虚拟化,分割成多个虚拟功能(Virtual Functions, VFs),每个虚拟功能可以独立地被虚拟机使用。
理解起来还是比较简单的,它的工作方式是,SRIOV 依靠两个驱动程序,一个由 VM 系列管理,称为 VF(Virtual Function 虚拟功能),另一个由主机(虚拟机管理程序)管理,称为 PF(Physical Function物理功能),如图:
在这里插入图片描述

图片来源:https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA14u000000HAixCAG&lang=en_US%E2%80%A9

简而言之,虽然只有有限的PCIe设备资源,但是可以通过一个PCIe设备资源的PF去创建不同的虚拟化资源(VF)供虚拟机使用。
但是很多人都会陷入一个误区:PF就是物理网卡。但PF并不是真实的物理网卡。PF仅代表物理网络接口卡(NIC)上的一个完整功能的实例。PF提供了完整的PCIe功能集,可以管理和控制该物理网卡。物理网卡上,可以有一个或多个PF。每个PF可以创建多个VF,让虚拟机独立使用这些VF。
启用SRIOV之后,物理NIC将通过VF与虚拟机(VF driver)进行数据交互,反之亦然。那么这样一来即可跳过中间的虚拟化堆栈(即VMM层),以达到近乎于纯物理环境的性能,完美的实现了I/O透传的优点,避免了其缺点。

但但但,它真就那么完美吗,它就没有缺点吗???那肯定不至于,毕竟现在SRIOV并没有占据所有市场,我们可以来简单的挑挑刺儿

  • VF虚拟机不能在线迁移,这在云网络的环境中是硬伤
  • SRIOV从物理网卡接收到的数据包将直接到达客户机的接收队列,或者从客户机发送队列发出的包将直接到达其他客户机(如同一个PF的VF)的接收队列,或者直接从物理网卡发出,绕过了宿主机的参与。但在很多场景,有需求要求网络包必须先经过宿主机的处理(如防火墙、负载均衡等)
  • 可扩展性差,由于VF是通过BDF(bus device function)号进行隔离的,所以每个VF都需要各自的配置空间,产生的额外开销较大,一些intel网卡中最大支持数量只有256。

由于这些局限,才有了后来Intel的scalable IOV和Nvida Mellnox的Scalale function(看看~大佬们的起名都这么相似)以及I/O半虚拟化的发展,感兴趣的可以去搜一搜。

  • 参考
    https://blog.csdn.net/wangdd_199326/article/details/90476728
    https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA14u000000HAixCAG&lang=en_US%E2%80%A9
    https://blog.csdn.net/weixin_60043341/article/details/126467233
    https://docs.nvidia.com/networking/display/bluefielddpuosv385/scalable+functions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

HDF4文件转TIF格式

HDF4 HDF4&#xff08;Hierarchical Data Format version 4&#xff09;是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式&#xff0c;用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术&#xff0c;HDF5解决了HDF4的一些重要缺陷。因此&am…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Docker-基础

一&#xff0c;Docker简介&#xff0c;功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器…

vue计算属性 computed

计算属性 computed 模板语法的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 模板语法&#xff1a;模板语法链接 <template…

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…

【C++】B树及其实现

写目录 一、B树的基本概念1.引入2.B树的概念 二、B树的实现1.B树的定义2.B树的查找3.B树的插入操作4.B树的删除5.B树的遍历6.B树的高度7.整体代码 三、B树和B*树1.B树2.B*树3.总结 一、B树的基本概念 1.引入 我们已经学习过二叉排序树、AVL树和红黑树三种树形查找结构&#x…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

关于HTTP的攻击实验

实验原理&#xff1a;1. 根据ARP中间人攻击&#xff0c;获取 用户和服务器之间的数据2. 将获取到的数据 通过一定的技术来复原&#xff0c;进而获取用户的信息或者 相关权限实验拓扑图 将 kali 的网卡改为桥接模式&#xff0c;查看Kali和本机的ip 启动ettercap&#xff0c;…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

阿里云OSS文件上传不配置环境变量使用显式AccessKey验证

问题背景 在中阿里云官方文档中介绍文件上传时&#xff0c;推荐配置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这里用简单的方法&#xff0c;直接在Demo.java中显式指定accessKeyId和accessKeySecret&#xff0c;同时修改OSSClientBuilder()的入参。 解决方法 首先…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针&#xff08;一&#xff09; 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;​2.2 指针变量和解引用操作符&#xff08;*&#xff09;​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…

Java线上接口耗时分析神器 Arthas

介绍 程序员的日常&#xff0c;总是离不开“调优”和“排查”。尤其当线上环境出现问题&#xff0c;性能瓶颈把人逼疯。这时候&#xff0c;你就需要一款像 Arthas 这样的神器来救场。 什么是 Arthas&#xff1f; 简单来说&#xff0c;Arthas 是阿里巴巴开源的 Java 诊断工具…

String类对象比较:==和equals的具体细节

public class test {public static void main(String[] args) {String name1 "zzz";String name2 "zzz";String name3 new String("zzz");// hashCode() 方法&#xff1a;基于字符串的内容计算哈希值&#xff0c;因此内容相同的字符串对象其 …

在 PostgreSQL 中,如何处理多个长时间运行的查询对系统资源的竞争?

文章目录 一、问题分析二、解决方案&#xff08;一&#xff09;优化查询语句&#xff08;二&#xff09;限制资源使用&#xff08;三&#xff09;调整数据库参数&#xff08;四&#xff09;监控和分析查询性能&#xff08;五&#xff09;分区表&#xff08;六&#xff09;异步处…

Ratf协议图解、Nacos CP集群源码分析

文章目录 Nacos CP集群说明Raft协议leader选举重新选举leader多个Candidate情况更新操作&#xff0c;日志复制网络分区 源码实现服务注册leader选举leader心跳包 Nacos CP集群 说明 CAP原则 C 一致性 ConsistencyA 可用性 Availability分区容错性 Partition tolerance 分区…