DPDK基础入门(十):虚拟化

I/O虚拟化

在这里插入图片描述

全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。

半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟化。客户机中的驱动程序为前端,宿主机提供的与客户机通信的驱动程序为后端。前端驱动将客户机的请求通过与宿主机间的特殊通信机制发送给后端驱动,后端驱动在处理完请求后再发送给物理驱动。

IO透传:直接把物理设备分配给虚拟机使用,这种方式需要硬件平台具备I/O透传技术,例如Intel VT-d技术。它能获得近乎本地的性能,并且CPU开销不高。

DPDK支持半虚拟化的前端virtio和后端vhost,并且对前后端都有性能加速的设计。而对于I/O透传,DPDK可以直接在客户机里使用,就像在宿主机里,直接接管物理设备,进行操作。

I/O透传

I/O透传技术(如SR-IOV)通过直接将硬件设备的访问权限分配给虚拟机(VM),提供高性能的网络和存储操作。这主要是利用Intel® VT-d的支持,减少虚拟机操作时对宿主机的干预,从而避免性能瓶颈。

Intel® VT-d:该技术允许虚拟机直接访问物理设备,减少了传统虚拟化中常见的“VM-Exit”(虚拟机退出到宿主机的开销)
SR-IOV(单根I/O虚拟化):允许一个物理网卡通过虚拟化生成多个虚拟网卡。这些虚拟网卡可以分配给不同的虚拟机,使每个虚拟机能获得几乎独立的网络设备访问,从而提升性能。

VT-d主要给宿主机软件提供了以下的功能:

  • I/O设备的分配:可以灵活地把I/O设备分配给虚拟机,把对虚拟机的保护和隔离的特性扩展到I/O的操作上来。

  • DMA重映射:可以支持来自设备DMA的地址翻译转换。

  • 中断重映射:可以支持来自设备或者外部中断控制器的中断的隔离和路由到对应的虚拟机。

  • 可靠性:记录并报告DMA和中断的错误给系统软件,否则的话可能会破坏内存或影响虚拟机的隔离。

SR-IOV

在这里插入图片描述

SR-IOV技术是由PCI-SIG制定的一套硬件虚拟化规范,全称是Single Root IO Virtualization(单根IO虚拟化)。SR-IOV规范主要用于网卡(NIC)、磁盘阵列控制器(RAID controller)和光纤通道主机总线适配器(Fibre Channel Host Bus Adapter,FC HBA),使数据中心达到更高的效率。SR-IOV架构中,一个I/O设备支持最多256个虚拟功能,同时将每个功能的硬件成本降至最低。SR-IOV引入了两个功能类型:

  • PF(Physical Function,物理功能):这是支持SR-IOV扩展功能的PCIe功能,主要用于配置和管理SR-IOV,拥有所有的PCIe设备资源。PF在系统中不能被动态地创建和销毁(PCI Hotplug除外)。
  • VF(Virtual Function,虚拟功能):“精简”的PCIe功能,包括数据迁移必需的资源,以及经过谨慎精简的配置资源集,可以通过PF创建和销毁。

在这里插入图片描述

Virtio网络设备

在客户机操作系统中实现的前端驱动程序一般直接叫Virtio,在宿主机实现的后端驱动程序目前常用的叫Vhost。

Linux内核驱动设计

Virtio网络设备Linux内核驱动主要包括三个层次:底层PCI-e设备层,中间Virtio虚拟队列层,上层网络设备层。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

DPDK用户空间virtio设备的优化

DPDK用户空间驱动和Linux内核驱动相比,主要不同点在于DPDK只暂时实现了Virtio网卡设备,所以整个构架和优化上面可以暂时只考虑网卡设备的应用场景。

关于单帧mbuf的网络包收发优化:将描述符表和可用环表(用于管理数据包)的映射关系固定。这意味着每个环表项(用于描述网络数据包的内存位置)和描述符表中的位置是一一对应的。在接收数据时,每个可用环表项固定指向一个描述符表的位置;发送数据时,描述符表的映射被优化以加速数据处理。固定映射减少了不同CPU核之间的缓存迁移开销,也节省了描述符表的分配和释放操作。

Indirect特性在网络包发送中的支持:发送网络包时,通常需要两个描述符来管理一个数据包:一个描述符用于指向数据包本身,另一个用于管理数据包的头部信息。支持间接描述符的特性允许将这两个描述符的需求简化为一个描述符。这个描述符指向一个额外分配的内存区域(间接描述符表),这个表可以包含多个描述符的信息。通过这种方式,不论是发送单个小数据包还是巨型帧(大数据包),只需要一个描述符就能管理。这减少了描述符的开销和管理复杂性,提高了发送效率。

在这里插入图片描述

Vhost

Virtio-net 的后端驱动经历了以下演进过程:

  • Virtio-net 后端:最初的虚拟网络设备驱动直接在虚拟化管理程序中实现,用于处理虚拟机中的网络数据。

  • 内核态 Vhost-net:为了提高性能,引入了 Vhost-net 框架,将数据路径的一部分移到内核空间,减少了用户态和内核态之间的开销。

  • 用户态 Vhost-user:进一步提高性能和灵活性,通过将 Vhost 的实现移到用户态,使虚拟化管理程序可以更灵活地管理网络数据,同时保持高效的性能。

Vhost 是一个框架,它最初在内核态实现了高效的虚拟设备操作,后续的 Vhost-user 将这个框架扩展到了用户态,以支持更灵活的虚拟化场景。

virtio-net

virtio-net后端驱动的最基本要素是虚拟队列机制、消息通知机制和中断机制。虚拟队列机制连接着客户机和宿主机的数据交互。消息通知机制主要用于从客户机到宿主机的消息通知。中断机制主要用于从宿主机到客户机的中断请求和处理。

Tap设备(Tap Interface)是一个虚拟网络接口,用于将虚拟机的网络流量传输到宿主机的网络栈。它通常用于虚拟化环境中,使虚拟机能够与宿主机或其他网络设备进行通信。

QEMU(Quick Emulator)是一个开源的虚拟机管理程序和模拟器。它可以模拟各种硬件平台,并提供虚拟化支持,使得多个虚拟机可以在一个物理机上运行。QEMU通过处理虚拟机的硬件请求、管理虚拟机的资源来实现虚拟化。

在这里插入图片描述

数据通道的瓶颈:

  • 从Tap设备到QEMU:Tap设备是虚拟网络接口,用于处理虚拟机的网络流量。数据包从Tap设备接收后,需要复制到QEMU(虚拟机管理程序)。这意味着数据包需要经过一个拷贝操作才能从Tap设备转移到QEMU。
  • 从QEMU到客户机:QEMU处理完数据包后,再将其发送到虚拟机的网络栈。这也需要一个拷贝操作。这两个拷贝操作(Tap设备到QEMU,QEMU到虚拟机)都增加了延迟和处理开销,成为性能瓶颈。

消息通知路径的瓶颈:

  • 内核到QEMU的通知消息:当数据包到达Tap设备时,内核需要通知QEMU有新的数据可供处理。这个通知过程涉及内核发出一个消息,告知QEMU有数据到达。
  • IOCTL请求和中断:QEMU在接收到内核的通知后,会使用IOCTL(输入输出控制)调用请求KVM(内核虚拟机管理程序)发送一个中断。中断用于通知虚拟机有新的数据到达。
  • KVM到客户机的中断:KVM接到QEMU的中断请求后,向虚拟机发送中断信号。这个中断信号让虚拟机知道有新的数据包需要处理。

Linux内核态vhost-net

vhost-net通过卸载virtio-net在报文收发处理上的工作,使Qemu从virtio-net的虚拟队列工作中解放出来,减少上下文切换和数据包拷贝,进而提高报文收发的性能。除此以外,宿主机上的vhost-net模块还需要承担报文到达和发送消息通知及中断的工作。

报文接收仍然包括数据通路和消息通知路径两个方面:

  • 数据通路是从Tap设备接收数据报文,通过vhost-net模块把该报文拷贝到虚拟队列中的数据区,从而使客户机接收报文。
  • 消息通路是当报文从Tap设备到达vhost-net时,通过KVM模块向客户机发送中断,通知客户机接收报文。

在这里插入图片描述

用户态vhost

Linux内核态的vhost-net模块需要在内核态完成报文拷贝和消息处理,这会给报文处理带来一定的性能损失,因此用户态的vhost应运而生。用户态vhost采用了共享内存技术,通过共享的虚拟队列来完成报文传输和控制,大大降低了vhost和virtio-net之间的数据传输成本。

数据通路不再涉及内核,直接通过共享内存发送给用户态应用(如DPDK,OVS)

消息通路通过Unix Domain Socket实现,是一种在同一台计算机上进程间通信(IPC)的方法。与网络套接字不同,它不涉及网络协议栈,数据通过内存中的文件描述符进行传输。

DPDK vhost

DPDK vhost支持vhost-cuse(用户态字符设备)和vhost-user(用户态socket服务)两种消息机制,它负责为客户机中的virtio-net创建、管理和销毁vhost设备。

当使用vhost-user时,首先需要在系统中创建一个Unix domain socket server,用于处理Qemu发送给vhost的消息。

在这里插入图片描述

DPDK示例程序vhost-switch是基于vhost lib的一个用户态以太网交换机的实现,可以完成在virtio-net设备和物理网卡之间的报文交换。还使用了虚拟设备队列(VMDQ)技术来减少交换过程中的软件开销,该技术在网卡上实现了报文处理分类的任务,大大减轻了处理器的负担。

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

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

相关文章

【STM32】CAN总线基础入门

CAN总线基础入门 一、CAN简介二、主流通信协议对比三、CAN物理层1、CAN硬件电路2、CAN电平标准3、CAN收发器 – TJA1050(高速CAN)4、CAN物理层特性 四、帧格式1、CAN总线帧格式2、数据帧3、数据帧各部分用途简介4、数据帧的发展历…

大模型参数高效微调技术原理综述(八)-MAM Adapter、UniPELT

MAM Adapter 背景 近年来提出了多种参数高效的迁移学习方法,这些方法仅微调少量(额外)参数即可获得强大的性能。虽然有效,但人们对为什么有效的关键要素以及各种高效微调方法之间的联系知之甚少。 下图展示了不同的微调方法&am…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言:本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday,作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整,总文数大量下降&#xf…

ACM模式下算法题输入输出攻略【C++】

文章目录 [TOC] 1. 核心代码模式与ACM模式1.1 ACM模式介绍1.2 注意事项 2. C常用的输入输出方法2.1 输入2.1.1 cin注意事项2.1.2 getline()注意事项2.1.3 getchar()注意事项 2.2 输出 3. 案例3.1 一维数组输入3.1.1 固定长度的一维数组3.1.2 不固定长度的一维数组 3.2 二维数组…

使用ddns-go实现自动配置IPv6的DDNS

正文共:888 字 17 图,预估阅读时间:1 分钟 前面说到通过PPPoE拨号获取到的IPv6地址没有发生变化(企业路由器配置IPv6家用宽带的PPPoE拨号示例),结果说完就打脸了。中间家里停了一次电,路由器重新…

Transformer模型详细步骤

Transformer模型是nlp任务中不能绕开的学习任务,我将从数据开始,每一步骤都列举出来,然后对应重点的代码进行讲解 ------------------------------------------------------------------------------------------------------------- Trans…

物品识别——基于python语言

目录 1.物品识别 2.模型介绍 3.文件框架 4.代码示例 4.1 camera.py 4.2 interaction.py 4.3 object_detection.py 4.4 main.py 4.5 运行结果 5.总结 1.物品识别 该项目使用Python,OpenCV进行图像捕捉,进行物品识别。我们将使用YOLO&#xff08…

re题(23)BUUFCTF-[FlareOn4]login

BUUCTF在线评测 (buuoj.cn) 下载后打开看到是一个txt和一个html 分别打开看看,txt是提示,html应该就是要破解的网页 打开网页,查看源代码 找到程序,变灰的部分是关键,是指如果是前13个字母就加13,如果是…

小程序开发设计-第一个小程序:注册小程序开发账号②

上一篇文章导航: 小程序开发设计-小程序简介①-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142217803?sharetypeblogdetail&sharerId142217803&sharereferPC&sharesourceqq_60872637&spm1011.2480.3001.8118 须知:不…

C++设计模式——Prototype Pattern原型模式

一,原型模式的定义 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。 原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化…

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库,分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去,就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…

【可视化大屏系列】数据列表自动滚动效果

要实现列表的自动滚动效果,这里提供两种解决方案: 1.vue插件 官方文档:链接: vue-seamless-scroll (1)安装依赖 npm install vue-seamless-scroll --save(2)全局注册(main.js中&a…

【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)

BUU UPLOAD COURSE 1 1 上课用~ 点击启动靶机。 解法 疑似存在文件包含漏洞。 http://15a5666e-1796-4f76-b892-0b69cf97df8e.node5.buuoj.cn:81/index.php?fileupload.php查看网页源代码。判断是后端检查。 <!DOCTYPE html> <html lang"zh-cn"> &…

多目标优化算法求解LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集,MATLAB代码

LSMOP&#xff08;Large-Scale Multi-Objective Optimization Problem&#xff09;测试集是用于评估大规模多目标优化算法性能的一组标准测试问题。这些测试问题通常具有大量的决策变量和目标函数&#xff0c;旨在模拟现实世界中的复杂优化问题。 LSMOP测试集包含多个子问题&am…

element-plus的面包屑组件el-breadcrumb

面包屑组件主要用来显示当页面路径&#xff0c;以及快速返回之前的页面。 涉及2个组件 el-breadcrumb 和el-breadcrumb-item, el-breadcrumb的spearator指定item的分隔符 el-breadcrumb-item的to和replace属性和vue-router的一致&#xff0c;需要结合vue_router一起使用 用法…

通过python提取PDF文件指定页的图片

整体思路 要从 PDF 文件中提取指定页和指定位置的图片&#xff0c;可以分几个步骤来实现&#xff1a; 1.1 准备所需工具与库 在 Python 中处理 PDF 和图像时&#xff0c;需要使用几个库&#xff1a; PyMuPDF (fitz)&#xff1a;用于读取和处理 PDF 文件&#xff0c;可以精确…

RabbitMQ高级篇,进阶内容

强烈建议在看本篇博客之前快速浏览文章&#xff1a;RabbitMQ基础有这一篇就够了 RabbitMQ高级篇 0. 前言1. 发送者的可靠性1.1 生产者重试机制1.2 生产者确认机制1.3 实现生产者确认 2. MQ的可靠性2.1 MQ持久化2.2 LazyQueue 3. 消费者的可靠性3.1 消费者确认机制3.2 失败重试策…

Web植物管理系统-下位机部分

本节主要展示上位机部分&#xff0c;采用BSP编程&#xff0c;不附带BSP中各个头文件的说明&#xff0c;仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信&#xff0c;有两位数据验证头&#xff08;verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…

STM32外设之LTDC/DMA2D—液晶显示(野火)

文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么&#xff0c;有几种屏&#xff0c;有什么组成。 怎么控制&#xff0c;不同屏幕控…