详解:网络虚拟化卸载加速技术的演进

news2025/7/11 15:43:40

在传统的应用场景中,服务器资源过剩情况普遍,为了充分利用服务器资源,产生了虚拟化技术。虚拟化技术以牺牲部分效率为代价提升了资源的使用率,将原来需要硬件完成的工作,通过软件模拟的方式,满足多个云租户的需要。随着5G、8K等新型业务的不断涌现,应用系统对性能提出了更高的要求,云服务也出现了满足不同QoS要求的分化,有(物理机、裸金属)等不同产品形态。各个功能模块的衔接配合,各租户之间的信息交互都需要高效的网络系统来实现。

网络虚拟化

传统数据中心的服务器使用硬件网卡收发包,硬件网卡连接硬件交换机完成跨服务器的通信。硬件场景下,主机发送数据包时:应用程序将数据写入内核分配的内存中,硬件网卡通过DMA将要发的数据从内存搬运到物理网卡的队列中。

主机接收数据包时:硬件网卡收到数据包时按照CPU分配的硬件网卡内存地址,通过DMA功能把数据包写入对应内存中,然后中断CPU进行后续处理。硬件交换机通过MAC进行二层转发。

在云计算场景下,对计算资源进行了切分,物理服务器上运行多个虚拟机,虚拟机之间通过虚拟网卡实现互通,虚拟网卡连接到虚拟交换机上,实现同一个服务器内不同虚拟机之间以及不同服务器上虚拟机之间的流量转发。

网卡的虚拟化

虚拟网卡模拟硬件网卡,工作机制类同。虚拟网卡包括e1000,virtio等实现技术。virtio是目前最为通用的技术框架。virtio提供了虚拟机和物理服务器数据交换的通用机制,得到了大多数hypervisor的支持,成为事实上的标准。

virtio是一种半虚拟化的解决方案。半虚拟化方案中,Guest OS知道自己是虚拟机,通过前端驱动和后端模拟设备互相配合实现IO虚拟化。这种方式与全虚拟化相比,可以大幅度提高虚拟机的IO性能。virtio分为四层,包括guest OS中各种前端驱动模块,hypervisor上的后端驱动模块,中间两层包括前后端通信的virtio层和virtio-ring层。其中,virtio层是虚拟队列接口,负责前后端之间的通知机制(kick,notify)和控制流程。virtio-ring实现了两个环形虚拟队列,分别用于保存前端驱动程序和后端处理程序执行的信息。

图1:virtio架构

virtio-ring是virtio的核心,包括三个部分:描述符数组desc,可用的available ring和使用过的used ring。

Desc:用于存储一些关联的描述符。

Available ring:用于guest端表示当前有哪些描述符是可用的。

Used ring:表示host端哪些描述符已经被使用。

virtio的通信过程

在virtio的通用化实现方式中,有两个非常重要的模块:KVM和QEMU。KVM是linux内核提供的虚拟化架构,可将内核直接充当hypervisor使用。KVM负责CPU虚拟化和内存虚拟化,但是不能模拟其他设备。QEMU模拟IO设备(包括网卡),运行在用户空间。

在virtio的实现框架中,当guest发送数据时,通过函数virtqueue_add_buf将数据buffer添加到virtqueue中(向desc结构指向的buffer中填充数据,并更新available ring),然后调用virtqueue_kick函数,发出EPT violation/misconfig(类似于page fault),形成vm-exit,由host上的kvm内核模块负责后续处理,kvm调用virtqueue_notify函数通知用户态QEMU,通过写入寄存器的方式通知host,host调用virtqueue_get_buf来获取virtqueue中收到的数据(从desc指向的buffer中找到available ring中添加的buffer,并更新used ring)。

在接收网络数据包时,virtio_queue-notify调用virtio-net网络设备注册的数据包接收函数virtio_net_handle_rx,QEMU会把数据复制到对应的队列中,之后再调用qemu_notify_event通知virtio前端,最终通过kvm_set_irq触发vCPU中断以通知virtio前端。

图2:virtio通信过程

virtio的内核态卸载

最初的virtio的通信机制中,guest与用户空间的hypervisor通信,会有多次数据拷贝和CPU特权级的切换。Guest发包给外网络,guest要切换到内核的KVM,然后KVM通知用户空间的QEMU处理guest请求。这种方式通信效率不高。在virtio的后续演进中出现了vhost-net。

Vhost-net是virtio的一种后端实现方案。Vhost-net实现在内核中,是内核的一个模块vhost-net.ko。Vhost与guest直接通信,旁路了KVM和QEMU。Guest和host kernel之间的数据通道通过virtqueue进行,QEMU不参与数据通道,主要负责virtio控制平面。

Vhost与virtio前端的通信通过事件驱动机制来实现。Vhost初始化后会启动一个工作线程监听enventfd,当guest发出kick event后,kvm.ko触发ioeventfd到vhost,vhost通过virtqueue的available ring 获取数据,并设置used ring。当vhost工作线程向guest通信时触发回调call envent,通过kvm.ko触发irqfd通知guest。

图3:virtio的内核态卸载

在单次收发的过程中,数据通道减少了两次用户态与内核态的上下文切换过程。实现了数据通道在内核态的卸载。Vhost-net作为virtio的backend,与虚拟机内部的virtio NIC通过共享内存方式通信。

virtio的DPDK卸载

基于vhost协议,DPDK设计了一套新的用户态协议——vhost-user。该协议将网络包处理(数据平面)卸载到DPDK应用中。控制平面仍然由QEMU来配置Vhost-user。

控制平面要做的事情包括:

1、特性协商:virtio的特性与后端特性通过一定的方式协商(vhost通过ioctl实现,vhost-user通过unix socket实现)。

2、内存区域配置:QEMU配置好内存映射区域,vhost-user使用mmap接口映射。

3、Vring配置:QEMU将Virtqueue的个数与地址发送给vhost(后端)。

4、通知配置:通过eventfd实现前后端通知。

DPDK优化实现了处理器的亲和性、巨页的使用、轮询模式驱动等。

virtio的半硬件卸载

virtio设备虚拟化的功能一直都是由软件来实现,在Host上因虚拟化而产生的额外开销无法避免。为了提升云端服务的性能,可以将virtio功能offload,将与业务无关的任务绕开系统、CPU直接交给专用硬件执行。

vDPA(硬件) 是virtio的半硬件虚拟化实现。该框架由Redhat提出,实现了virtio数据平面的硬件卸载。控制平面仍然采用原来的控制平面协议,当控制信息被传递到硬件中,硬件完成数据平面的配置之后,数据通信过程由硬件设备(智能网卡)完成,虚拟机与网卡之间直通。中断信息也由网卡直接发送至虚拟机不需要主机的干预。这种方式,控制面比较复杂,硬件难以实现。

在硬件vDPA架构中,通过OVS转发的流量首包依然由主机上的OVS转发平面处理,对应数据流的后续报文由硬件网卡直接转发。

在性能方面能够接近SR-IOV设备直通的数据平面。同时,能够保持virtio标准接口,保持云服务的兼容性。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

图4:virtio的半硬件卸载

网络虚拟化技术发展

随着业务对网络性能要求越来越高,能够满足更高性能要求的SR-IOV技术出现了。SR-IOV技术通过对物理网卡实现资源分割,实现了应用与物理网卡的独占,从而大幅度提升了通信效率。

SR-IOV技术最初应用在网卡上。SR-IOV将一个物理网卡虚拟出多个轻量化的PCI物理设备,从而分配给虚拟机使用;同时,在虚拟机/容器和网卡硬件之间提供了一个直接接口,绕过主机CPU和操作系统,将宝贵的CPU资源从I/O任务中释放出来。

但是SR-IOV存在一些问题包括无法实时迁移,需要在客户操作系统上安装网络驱动程序。这些问题阻碍了SR-IOV在云部署中的应用。通常情况下,以性能为中心的应用程序利用SR-IOV加速,数据密集程度较低的应用使用virtio接口或者硬件vDPA。

图5:SR-IOV示意图

virtio的DPU卸载

越来越多的硬件厂商开始原生支持virtio协议,将虚拟化功能Offload到硬件上,把嵌入式CPU集成到SmartNIC中,网卡处理所有网络中的数据,而嵌入式CPU控制路径的初始化并处理异常情况。这种具有Offload的SmartNIC则称为DPU,专门处理数据中心内的各种计算机和存储之间的数据移动和处理。

NVIDIA加速交换和数据包处理技术ASAP2实现了SR-IOV与virtio的融合。virtio-net网卡由DPU上服务virtio-net-controller模拟。

ASAP2的核心是eSwitch。eSwitch是嵌入式交换ASIC,可以提供裸金属服务器网络性能和效率,同时能够提供SD灵活性。DPU通过eSwitch在硬件中完成大部分数据包处理操作,释放主机CPU,提供更高的网络吞吐量。eSwitch处理所有进出服务器的流量,同时也处理VM或容器之间的流量。

小 结

根据NVIDIA的白皮书,基于内核的网络虚拟化能够提供的峰值吞吐率为200Kpps,DPDK 轮询模式能够提供的峰值吞吐率为7.5Mpps(以消耗2个物理核为代价),DPU全卸载模式能够提供的峰值吞吐率为66Mpps。硬件卸载的方式实现的网络虚拟化,性能有跨越式提升。

回归本质,网络虚拟化是为了提升资源使用率,丰富资源的功能性,单纯的虚拟化对CPU占用较大,同时会对性能产生较大的影响。随着DPU的出现,网络虚拟化可以offload到DPU中,实现网络功能的卸载,在提升效率的同时,减轻对CPU的占用。此种方式以增加额外硬件为代价。成本、性能始终是把双刃剑,在具体的应用场景中才会有最优解。

参考资料:

https://www.cnblogs.com/bakari/p/8341133.html

https://zhuanlan.zhihu.com/p/379681768

https://cloud.tencent.com/developer/article/1540284

https://www.cnblogs.com/bakari/p/8309638.html

https://www.cnblogs.com/bakari/p/7858029.html

NVIDIA 白皮书《Comparision of OVS vRouter Acceleration Techniques:SR-IOV vs. Virtio》

原文链接:https://cloud.tencent.com/developer/article/1902466

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

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

相关文章

初识Qt Quick

讲讲最近几年Qt的热门技术Quick这一块了。 啥是Qt? 哦,这是一个宣称可以跨任意平台,开发各种场景应用软件的开发框架。从三个维度来讲,就是开发库framework,集成开发平台IDE,以及成熟的开发思维模式。 Q…

CAS:82055-94-5,Azide-PEG-Azide,N3-PEG-N3,叠氮聚乙二醇叠氮试剂供应

1、名称 英文:Azide-PEG-Azide,N3-PEG-N3 中文:叠氮-聚乙二醇-叠氮 2、CAS编号:82055-94-5 3、所属分类:Azide PEG 4、分子量:可定制,叠氮-PEG-叠氮 2000、叠氮peg叠氮 1000、叠氮-聚乙二醇…

org.activiti.bpmn

org.activiti.bpmn目录概述需求:设计思路实现思路分析1.BpmnAutoLayout2.BPMNLayout参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for ch…

Mybatis概述

1 概述 原来是Apache的一个开源项目,叫iBatis, 2010年6月这个项目由 Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下,从 iBatis3.0正式更名为MyBatis。 MyBatis 是一款优秀的持久层框架,对j…

容器卷挂载的秘密

什么是容器卷 数据卷 (Data Volumes )是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount 行为。 容器挂载原理 containerd创建的容器里的数据存储在下面的目录中 [rootmaster01 httpb…

【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业

目标导航 写在前面 为什么使用文件? 什么是文件? 程序文件 数据文件 认识文件名 文件的打开和关闭 文件指针 文件的打开和关闭 1.以"r"(只读)的方式打开文件 2.以"w"(只写)…

Java#24(常见API--2)

目录 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 扩展:对象克隆 二.Objects Objects是一个对象工具类,提供了一些操作对象的方法 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 方法名 作用 publi…

葡萄糖-聚乙二醇-链霉亲和素|Streptavidins-PEG-Glucose|链霉亲和素-PEG-葡萄糖

链霉亲和素(streptavidin下称SA)是与亲和素(avidin下称AV)是一种蛋白质,链霉亲和素是四聚体蛋白,大小为66KDa。一分子链霉亲和素可以高度特异性地与四分子生物素结合,两者之间的亲和力较为强烈。链霉亲和素分子由4条相同的肽链组成&#xff0…

delete-by-query和复合查询

根据term,match等查询方式去删除大量的文档 Ps:如果你需要删除的内容,是index下的大部分数据,推荐创建一个全新的index,将保留的文档内容,添加到全新的索引 # delete-by-query POST /sms-logs-index/sms-lo…

毕业设计-基于机器视觉的颜色目标识别

目录 前言 课题背景和意义 实现技术思路 什么是彩色空间 怎么利用彩色空间 颜色识别的过程 读取图片进行hsv色域转换 对图片特定颜色识别 本地摄像头对视频流进行颜色识别 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后…

Python基础-面向对象编程之特性(property)

Python面向对象编程之特性(property) 一、统一访问原则 通常,我们访问实例或类的属性时,将返回所存储的相关值。而特性(property)是一种特殊的属性,访问它时会计算它的值。 请看下面的例子: import mat…

基于android的个性闹铃的设计与开发(闹铃,日历,计时器,备忘录)

目 录 摘 要 2 Abstract 2 1 选题的背景和意义 5 1.1 选题的背景 5 1.2 国内外研究现状 5 1.2.1 国内外手机系统现状 5 1.2.2 国内外手机应用现状 7 1.2.3 发展趋势 7 2 需求分析 9 2.1 系统需求 9 2.2 需求分析 9 2.3 约束与限制 10 3 总体设计 11 3.1 系统结构图 11 3.2 总体…

【数论】约数

文章目录一、试除法求n的所有约数二、约数个数三、约数之和四、最大公约数&#xff08;欧几里得算法/辗转相除法&#xff09;一、试除法求n的所有约数 vector<int> getDivisors(int n) {vector<int> ans;for (int i 2; i < n / i; i) {if (n % i 0) {ans.pus…

深度学习Week8-咖啡豆识别(Pytorch)

目录 一、前期准备 1.设置GPU 2. 导入数据 3. 划分数据集 二、手动搭建VGG-16模型 1. 搭建模型​编辑 2. 查看模型详情 三、 训练模型 1. 编写训练函数 2. 编写测试函数 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 *五、优…

[附源码]java毕业设计中达小区物业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

学生家乡网页设计作品静态HTML网页模板源码 广西旅游景点网页设计 大学生家乡主题网站制作 简单家乡介绍网页设计成品

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Packet Tracer - 配置 IPv4 和 IPv6 接口

地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 172.16.20.1 255.255.255.128 不适用 G0/1 172.16.20.129 255.255.255.128 不适用 S0/0/0 209.165.200.225 255.255.255.252 不适用 PC1 NIC 172.16.20.10 255.255.255.128 1…

微服务架构的环境搭建及简单测试

目录 一、系统架构的演变过程 1.0 前言 1.1 单体应用架构 1.2 垂直应用架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 二、微服务架构搭建 2.1 微服务架构简介 2.2 微服务案例准备 2.3 创建父工程、基础模块 2.4 创建微服务 一、系统架构的演变过程 1.0 前言 随着互联网的…

【Queue】- 从源码分析PriorityQueue及其常用方法

文章目录PriorityQueue基础知识概述PriorityQueue内部结构PriorityQueue扩容操作PriorityQueue队列的构造方法PriorityQueue队列的常用方法public boolean offer(E e)public E peek()public boolean remove(Object o)public boolean contains(Object o)public Object[] toArray…

【SU-03T离线语音模块】:学习配置使用

前言 时不可以苟遇&#xff0c;道不可以虚行。 一、介绍 1、什么是语音识别模块 语音识别模块是在一种基于嵌入式的语音识别技术的模块&#xff0c;主要包括语音识别芯片和一些其他的附属电路&#xff0c;能够方便的与主控芯片进行通讯&#xff0c;开发者可以方便的将该模块嵌…