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

news/2024/5/7 16:49:46/文章来源:https://blog.csdn.net/lingshengxiyou/article/details/128043970

在传统的应用场景中,服务器资源过剩情况普遍,为了充分利用服务器资源,产生了虚拟化技术。虚拟化技术以牺牲部分效率为代价提升了资源的使用率,将原来需要硬件完成的工作,通过软件模拟的方式,满足多个云租户的需要。随着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.luyixian.cn/news_show_225716.aspx

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

相关文章

软件测试员如何在恶劣的内卷环境下脱颖而出?

内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。 我一个很要好的朋友,现在就读大三,像很多大学生一样面临着能否顺利毕业的压力和考证的焦虑,看着寝室四个人每天都在玩&…

ShellBrowser Delphi,Delphi组件功能和工具

ShellBrowser Delphi,Delphi组件功能和工具 ShellBrowser基本上被描述为集合的一部分,它能够为用户和开发人员提供Delphi的程序员,以便轻松灵活地访问windows shell性能。ShellBrowserComponents Delphi的使用基本上是能够模拟windows资源管理器的变体。…

gitlab-runner 的安装使用(含 .gitlab-ci.yml 的简单使用)

简介 GitLab Runner 是一个开源项目,用于运行您的作业并将结果发送回 GitLab。它与 GitLab CI 一起使用,GitLab CI 是 GitLab 随附的开源持续集成服务,用于协调作业。 简单理解就是一个服务放在那儿,当你提交代码时,…

Revit修改:网格角度,体量轮廓,梁随斜板

一、Revit中使幕墙系统网格改变角度 绘制幕墙系统时,若幕墙系统出现如下图情况: 若想改变该网格的角度,使其与该幕墙上下边界平行或垂直则选中该幕墙,修改属性栏的中的网格角度。如下图所示: 修改完所需角度后&#xf…

【kafka】五、kafka工作流程

kafka工作流程 工作流程 kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。 topic是逻辑上的概念,而partition是物理上的概念,每一个partition对应一个log文件,该log文件…

QT中的OpenGLWidget

1、在生成的UI中,通过控件OpenGL Widget来布置相应的空间(后续讲通过promoted widget将此控件与派生的OpenGLWidget进行绑定) 2、添加一个widget类,该类派生于 QOpenGLWidget, QOpenGLFunctions_*_*_Core(*代表版本号…

基于VGG与LSTM实现针对图片的问答任务 数据+代码 可以作为毕设

任务描述:本教程将通过深度学习的方式实现一个简单的视觉问答模型,视觉问答的任务内容是将一张图片和一个自然语言问题作为输入,结合这两种信息,机器生成一条自然语言答案。本教程通过数据准备,视觉问答模型构建,视觉问答模型训练,视觉问答模型评估,视觉问答模型预测等…

嵌入式驱动初级-字符设备驱动基础

文章目录前言一、驱动学习预备知识1.什么是设备驱动程序2.向内核添加新功能方法2.1新功能源码与Linux内核源码不在同目录下2.2在Ubuntu下加载和删除ko文件步骤2.3在开发板下加载和删除ko文件步骤2.4内核模块基础代码解析二、字符设备驱动框架2.1Linux内核对设备的分类2.2字符设…

Python(PyQt5)制作帮助文档查看器(可显示后缀名为md的文件)同时显示文本和图片

先看完整效果图: 帮助文档查看器是很多程序中必备要素,而利用Qt中的QTreeView组件可以很方便的查看文件,而QTextBrowser可以直接显示格式化的MarkDown文本。因此可以利用这两个组件制作一个帮助文件查看器。 未优化 效果图: 问题优化: 你会发现QT treeView列宽设置不成功问题…

2023年系统规划与设计管理师-第二章信息技术知识

1. 软件工程 2. 面向对象 3. 开发模型 4. 开发方法 4.1 敏捷开发方法 4.2 RUP 5. 数据仓库和网络技术 5.1 网络七层结构 5.2 各设备位于哪一次 5.3 各层的协议 5.4 TCP分层 5.5 IPv6 VS IPv4 5.6 IPv4 :A类、B类、C类地址的划分 A类地址的第一组数字为1&#xff5…

255-261BFC,媒体的类型,媒体的特性,浏览器前缀,媒体查询,逻辑操作符,

◼ 有时候可能会看到有些CSS属性名前面带有:-o-、-xv-、-ms-、mso-、-moz-、-webkit- ◼ 官方文档专业术语叫做:vendor-specific extensions(供应商特定扩展) ◼ 为什么需要浏览器前缀了?  CSS属性刚开始并没有成为标准,浏览器为了防止后续会修改名字给新的属性添加了浏…

软件测试面试,一定要准备的7个高频面试题(附答案,建议收藏)

收集了2022年最新的面试题后,负责就业的黑马讲师们整理出了7个高频出现的面试题,一起来看看。 高频问题1:请自我介绍下? 高频问题2:请介绍下最近做过的项目? 高频问题3:请介绍下你印象深刻的…

光学测量精度极限—光谱共焦位移传感器的六大行业应用

科技的不断发展,在半导体,高精密制造领域中都是采用微米及以上的加工工艺,并与之匹配高精度测量技术进行品质控制。光谱共焦的测量原理是一束白光经过镜头将不同的波长聚焦到光轴上,色散地形成一条彩虹状分布带,照射到…

力合精密装备科技:操纵盒按键说明

使用摇杆(操纵盒): 不同的控制系统配备不同样式的操作杆,操作杆最常用的功能是用来手动移动机器来进行测量操作; 一般的操作杆上包含以下功能键: 急停按钮:紧急情况时按下急停按钮停止机器运…

ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解析 4.1 将当前帧的描述子转化为BoW向量 4.2 总体解释 1.函数作用 用参考关键帧的地图点来对当前普通帧进行跟踪。 2.步骤 Step 1:将当前普通帧的描述子转化为BoW向量 Step 2:通过词袋BoW加速当前帧与参考帧…

Go运行时的内存分配器以及消耗指定大小的内存(C语言)

对于go语言在运行时的一些内存分配,想要详细的了解,我们会用到自带的runtime.MemStats,有很多具体的细节实现,而不是简单的只看任务管理器中的内存分配。 我们先来看下这个记录内存分配器的结构体 type MemStats struct {Alloc …

一文了解 Go 中的指针和结构体

一文了解 Go 中的指针和结构体前言指针指针的定义获取和修改指针所指向变量的值结构体结构体定义结构体的创建方式小结耐心和持久胜过激烈和狂热。 前言 前面的两篇文章对 Go 语言的基础语法和基本数据类型以及几个复合数据类型进行介绍,本文将对 Go 里面的指针和结…

MySQL索引底层数据结构

索引简介 索引是一个排好序的数据结构,包含着对数据表里所有记录的引用指针,如下图所示。索引文件和数据文件一样都存储在磁盘中,数据库索引的目的是在检索数据库时,减少磁盘读取次数。 常见的索引数据结构包括二叉树、红黑树、…

跬智信息 (Kyligence) 荣获信创“大比武”重要奖项,坚持做大做实国产软件

近日,为期两个月的 2022 信创“大比武”活动圆满闭幕。经过层层筛选和考核,跬智信息 (Kyligence) 凭借“企业级智能多维数据分析解决方案”项目脱颖而出,在整体方案的技术架构、服务体系、安全架构、信创生态等方面得到了评委的高度认可&…

iptables应用大全

iptables四表五链: 1、“四表”是指 iptables 的功能 ——filter 表(过滤规则表):控制数据包是否允许进出及转发 ——nat 表(地址转换规则表):控制数据包中地址转换 ——mangle(修改…