英特尔DSA-加速DPDK Vhost

本文介绍了如何使用英特尔数据流加速器(Intel DSA)来优化DPDK Vhost,以解决数据包拷贝带来的性能瓶颈。实验表明,对于数据包大小超过256字节的情况,Intel DSA可以显著提升DPDK Vhost的性能,实现更高的数据包转发速率。通过异步卸载流水线,数据包拷贝和上层业务逻辑可以并行执行,从而提高整体吞吐量。
摘要由CSDN通过智能技术生成

1. 介绍

VirtIO是一个虚拟接口标准,用于虚拟机(Virtual Machine, VM)访问其他设备,如网络设备和块设备。一个VirtIO设备由一个运行在主机上的后端和一个存在于虚拟机中的前端组成。

数据面开发工具包(DPDK)的Vhost库是一个VirtIO网络设备的后端实现,它被广泛用于软件交换机,实现高速地接收来自虚拟机的数据包和传输数据包给虚拟机。尽管DPDK Vhost库已利用多种技术进行了优化(例如,循环解卷和使用内联函数来避免函数调用开销),但当数据包较大时,很高比例的CPU计算资源被用于数据包拷贝,从而导致Vhost的数据包发送和接收速速率迅速下降。

英特尔®数据流加速器是第四代英特尔®至强®可扩展处理器(代号Sapphire Rapids)中的高性能数据移动和转换加速器。它为数据移动提供了高带宽和低延时,可用于卸载DPDK Vhost中的数据包拷贝操作。

我们在DPDK Vhost中把数据包拷贝交给英特尔数据流加速器,这样Vhost的处理Core可以避免进行繁重的数据包拷贝。我们还提出了一个异步卸载流水线,使用户程序能够将Intel DSA的数据包拷贝和上层业务执行并行起来。我们的实验表明,当数据包大小超过256字节时,英特尔数据流加速器可以为DPDK Vhost带来显著的性能提升。

作者:

胡嘉瑜 姜诚 丁旋 贺星光

2. 概述

DPDK Vhost库是一个高性能的VirtIO网络设备的后端实现,它是Open vSwitch中广泛使用的虚拟网络接口。在本文的后续章节中,我们将使用“DPDK Vhost” 一词来指代DPDK Vhost库。

2.1 DPDK Vhost

DPDK Vhost由一组控制路径和数据路径的应用程序编程接口(API)组成。控制路径API用于映射VM内存,设置VirtIO Virtqueue,并与VirtIO前端协商功能。通过两个关键的数据平面操作(enqueue和dequeue),数据路径API用于发送或接收数据包到或从VirtIO前端。在enqueue时,Vhost通过将数据包插入到Virtqueue中实现传输数据包到VirtIO前端,而在dequeue时,Vhost通过从Virtqueue中取出数据包实现接收来自VirtIO前端的数据包。因此,至少需要两个VirtIO Virtqueue才能实现Vhost和VirtIO前端之间的双向数据传输。

一个enqueue或dequeue操作可以分为以下三个子操作,如图1所示。

  1. 首先,从Virtqueue中获取描述VM内存中可用缓冲区的描述符。然后,从这些描述符中读取稍后用于数据包操作的内存地址。对于enqueue,这些可用描述符指向可用于存储数据包的空缓冲区;对于dequeue,可用描述符指向VirtIO前端发送的数据包缓冲区。

  2. 其次,对于enqueue,将数据包从主机复制到已获取的缓冲区;对于dequeue,将数据包从已获取的数据包缓冲区复制到主机。

  3. 最后,将已使用描述符写回到Virtqueue,并向VM发送通知。

这三个子操作按顺序由DPDK Vhost的处理Core执行。在完成enqueue或dequeue操作后,DPDK Vhost的处理Core就可以为应用程序执行上层应用逻辑。

f78cc513527792e39c359a0f6f5ebf1a.png

图1. Enqueue/Dequeue操作流程

DPDK Vhost支持两种Virtqueue格式:Split Virtqueue和Packed Virtqueue, 分别在VirtIO Spec版本0.95和1. 1中引入。Split Virtqueue 由三部分组成:一个描述符表、一个可用环和一个已用环。与Split Virtqueue 不同,Packed Virtqueue 将 Virtqueue 的三个部分合并为一个, 它只包含一个具有不同描述符格式的描述符环。在下文中,我们将使用Split Virtqueue 来演示enqueue和dequeue操作的工作流程。

Split Virtqueue 由描述符表、可用环和已用环组成。描述符表是描述数据包缓冲区的描述符数组,每个可用环和已用环都是指向描述符表中描述符的索引数组。可用环和已用环之间的区别在于,可用环存储 Vhost 可用的描述符索引,但使用的环存储 VirtIO 前端可用的描述符索引。每个环还有一个尾部指针,用于指示 VirtIO 前端(用于可用环)或 Vhost(用于使用环)将放置下一个描述符索引的位置,并且在将描述符索引填充到环后,尾指针会增加。尾部指针分别称为可用环和已用环的avail_idx和used_idx。

图2 展示了  VirtIO 前端  发送四个数据的示例  ,Vhost  将它们从Split Virtqueue 中dequeue 。VirtIO 前端将数据包缓冲区信息存储在前四个描述符中,即从描述符表中的索引 0 到索引 3。然后它在可用环中填充 0~3,并将avail_idx增加 4。在主机端,Vhost 读取可用环以获取四个数据包缓冲区地址,然后将数据包从 VM 内存复制到主机内存中。复制完四个数据包缓冲区后,Vhost 将 0~3 写回使用的环,并将used_idx增加 4,以通知前端 Vhost 已收到四个数据包缓冲区。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值