【LC3开源峰会网络技术系列之二】阿里云开发智能网卡的动机、功能框架和软转发程序

简介: 摘要 这篇文章介绍了阿里云开发智能网卡的动机、功能框架和软转发程序以及在软转发过程中发现的问题和优化方法。 主讲人陈静 阿里云高级技术专家 主题Zero-copy Optimization for DPDK vhost-user Receiving 分论坛Network & Orchestration 项目背景 在VPC产品部署中虚拟交换Virtual Switch承担着overlay层和underlay层进行网络协议的加解密encap/decap功能在多租户虚拟机或者容器的主机上也需要进行二三层的路由转发、Qos、限流、安全组等。

摘要: 这篇文章介绍了阿里云开发智能网卡的动机、功能框架和软转发程序,以及在软转发过程中发现的问题和优化方法。

主讲人:陈静 阿里云高级技术专家

主题:Zero-copy Optimization for DPDK vhost-user Receiving

分论坛:Network & Orchestration


18cbb5e488b1e8687e538c10dc1f3c1a806289d4

项目背景

在VPC产品部署中,虚拟交换(Virtual Switch)承担着overlay层和underlay层进行网络协议的加解密(encap/decap)功能;在多租户(虚拟机或者容器)的主机上,也需要进行二三层的路由转发、Qos、限流、安全组等。虚拟交换现在业界有比较被广泛接受的OVS开源项目,在阿里云上,我们也开发了针对自身业务相契合的AVS项目。AVS有和OVS类似的功能,也同样是纯软件的实现方式,在我们使用过程中,发现了一些问题,从而催生了智能网卡项目。

首先,AVS占用主机资源。AVS作为软件,需要占用主机侧的计算资源、内存资源,当吞吐量大时,还会占用大量的LLC cache资源,而本来这些资源更好的利用方式是交给客户,增加资源的利用率。

其次,性能瓶颈。在云上业务部署过程中,应用对网络带宽的要求在不断提高,纯软件的方式已经慢慢跟不上这种需求,因此有必要用对AVS进行加速。

基于这两个原因,我们进行了智能网卡项目。

Virtio or SRIOV?

众所周知采用PCI-E SRIOV技术的VF设备,通过PASS-THROUGH的方式呈现在VM,具有高性能、功能丰富的特点。但是缺点也同样明显,比如热迁移(hot-plug)不方便;不同厂家提供的VF接口不一致;需要额外的驱动等等。virtio作为业界比较通用的一种虚拟设备接口方式可以解决之上的各种问题,但是问题在于目前暂时没有完全支持virtio接口设备的硬件厂商,其是使用软件模拟实现的一种方式,因此性能不是很好。那么,有没有一种又有高性能,同时支持virtio的解决方案呢?

 

087294d85aecebba8d5a887a6b303a68fe12ce0d

 

我们结合virtio和SRIOV的优势,设计了一套基于软转发的方案。

 

智能网卡方案

下图是我们的智能网卡的框架设计,在卡上有一个标准的网卡ASIC和一个片上系统,片上系统自带内存和CPU。AVS运行在片上系统,把快速路径(fast-path)卸载到ASIC中,而自身只负责慢速路径(slow-path)的处理。通过快慢速路径分离的方式,不但减轻了软件AVS的处理负载,也大大提高了吞吐率。

3778c6e7b32debb78a03b5d0ed91aade845d20f5

在智能网卡实现过程中,由于我们的标卡没法做到virtio-net的硬化,所以对host的输出只是一个提供商定义(vendor-specific)的VF接口。同时,在客户侧(VM
),我们期望用户不用做任何的修改,沿用virtio-net接口。在这种需求下,我们开发了一个简单的、基于DPDK的软转发程序。由于AVS在网卡已经完成了所有的策略、逻辑、路由、多队列的所有功能,VF和virtio-net前端有一一对应的关系,而软转发程序只需要完成VF和virtio-net的接口转换和报文传递即可。同时,我们也不能为该软转发程序分配很多资源,否则就和我们最初做智能网卡的初衷背道而驰。因此,软转发的性能成为了我们非常重要考量的指标。在描述我们的优化方法之前,我们先了解一下常规路径。

报文接收路径

在讲到报文接收路径之前,有必要介绍一下DPDK中接收队列的初始化方式。首先,软件需要在内存中分配一段缓冲区作为队列,队列中的数据结构称为描述符(descriptor),这是软件和硬件交互的接口;如果是virtio-net这中para-virtualized模拟设备,前端驱动和后端驱动交互的接口。除此之外,软件还需要一个内存池(memory pool),里面都是固定大小的数据缓冲区,用来承载网卡发送过来的网络报文。

a9e80baa356044bad27868c2ee48d089580209a4

初始化接收队列之后,网卡就可以开始正常工作了。当从网络中接收到报文之后,按照下图所示进行处理,最终送达到对应的虚拟机。

22b08105c4d9f8a4c936b141cb90c2959c3303c1

首先,报文缓存在智能网卡上,然后进行快速路径或者慢速路径的处理,最终判断是发送到哪一个VF,哪一个接收队列。

接着,网卡会从对应的VF接收队列读取描述符,获得存储报文的地址,然后进行DMA操作,最后,回写描述符到接收队列,描述符中包含了报文长度、类型、错误标志位等信息。

软转发程序通过VF接收队列的描述符发现收到了一个报文,接着会读取VM中的virtio-net的接收队列描述符,获得需要拷贝的虚机中的DMA数据地址,通过memcpy的方式拷贝报文;接着,更新virtio-net的描述符信息,通知前端驱动,整个逻辑完成。

优化后的零拷贝接收

从之上的过程可以发现在报文送到虚拟机的整个路径中,报文被拷贝了两次:一次是硬件DMA到主机内存,另外一次是软转发程序拷贝报文到虚拟机的Guest memory。特别是后一次是非常消耗CPU时间的操作。从我们后来的性能profiling也可以看到内存拷贝占用了很大的比例。那么,能不能减少一次拷贝呢?

综合以上的需求,我们设计了接收端的零拷贝方案。主要是设计了一个队列同步模块,如下所示。

db3691c4d272e4f015131925e4277254bf1cc26f

它主要的作用有以下几个:

1.    在前端virtio-net和SRIOV VF队列的描述建立1:1的映射关系。

2.    监控前端virtio-net 接受队列描述符的改变,同步到VF的接收队列中。这样,在VF的接受队列中就不需要内存池来缓存从网卡上收到的报文,而直接用虚拟机传递的缓存。

3.    进行虚机物理地址(Guest Physical Address, GPA)到主机物理地址(Host Physical Address, HPA)的转换。在virtio-net的VF中,驱动填充的是GPA地址,在没有利用IOMMU的情况下,需要把GPA转换成HPA,这样智能网卡才能进行DMA传送。

 

在有了队列同步模块之后,报文的接收过程如下图所示。

主要改进在于智能网卡直接DMA到虚拟机指定的内存中去,并且硬件还不感知这个变化。软转发程序只是简单的将VF接受队列的描述符信息进行转换,填充到前端virtio-net的接受队列中去。

c350567dcb9b1064af569f102946296569bc4086

零拷贝的优势

经过测试和分析,我们觉得零拷贝有如下的优势:

l、  性能

  • 接收端减少了内存拷贝
  • Footprint减少,避免cache-coherency
  • 总体性能提高了40%

2、时延

  • 减少拷贝带来的时间开销

目录
相关文章
|
4月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
110 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
2月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
2月前
|
安全 网络性能优化 网络虚拟化
网络交换机分类与功能解析
接入交换机(ASW)连接终端设备,提供高密度端口与基础安全策略;二层交换机(LSW)基于MAC地址转发数据,构成局域网基础;汇聚交换机(DSW)聚合流量并实施VLAN路由、QoS等高级策略;核心交换机(CSW)作为网络骨干,具备高性能、高可靠性的高速转发能力;中间交换机(ISW)可指汇聚层设备或刀片服务器内交换模块。典型流量路径为:终端→ASW→DSW/ISW→CSW,分层架构提升网络扩展性与管理效率。(238字)
754 0
|
2月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
223 0
|
2月前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
156 0
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
331 61
|
2月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
136 0
|
5月前
|
机器学习/深度学习 API TensorFlow
BayesFlow:基于神经网络的摊销贝叶斯推断框架
BayesFlow 是一个基于 Python 的开源框架,利用摊销神经网络加速贝叶斯推断,解决传统方法计算复杂度高的问题。它通过训练神经网络学习从数据到参数的映射,实现毫秒级实时推断。核心组件包括摘要网络、后验网络和似然网络,支持摊销后验估计、模型比较及错误检测等功能。适用于流行病学、神经科学、地震学等领域,为仿真驱动的科研与工程提供高效解决方案。其模块化设计兼顾易用性与灵活性,推动贝叶斯推断从理论走向实践。
185 7
BayesFlow:基于神经网络的摊销贝叶斯推断框架
|
5月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
5月前
|
监控 安全 网络协议
恶意软件无处逃!国内版“Manus”AiPy开发Windows沙箱工具,进程行为+网络传输层级监控! 头像 豪气的
NImplant.exe 是一款后渗透测试工具,可实现远程管理与持久化控制。其优点包括无文件技术、加密通信和插件扩展,但也存在被检测风险及配置复杂等问题。为深入分析其行为,我们基于 aipy 开发了 Windows 沙箱工具,针对桌面上的 NImplant.exe 进行多维度分析,涵盖进程行为、网络连接(如 TCP 请求、目标 IP/域名)、文件控制等,并生成传输层监控报告与沙箱截图。结果显示,aipy 工具响应迅速,报告清晰易读,满足分析需求。

热门文章

最新文章