在SPDK中体验一下E810网卡ADQ直通车

news2024/12/28 3:53:06

早在2019年,Intel发布第二代Xeon Scalable系列处理器的同时,也推出了E800系列网卡。该网卡的亮点除了支持100Gb,便是新增了ADQ功能。

1. 了解ADQ

ADQ 全称Application Device Queues,是一种队列和控制技术,可提高应用程序性能和可预测性。它可以过滤和隔离应用程序流量,并将其放置在特定硬件的专用通道队列中,这些通道可以以最佳方式连接到应用程序特定的执行线程,减少应用程序延迟,并提高吞吐量。

使用ADQ 就像坐上直通车。例如,我们想在高峰期到达机场,能够多快到达往往取决于路况。如果有一条专用路径,我们就可以准确预测行车时间,更快到达机场,而这也是ADQ处理网络连接所带来的益处,开辟一条用于高优先级应用程序流量的专用快速通道,如下图所示。

4df9ded4756b7d8046e2f2733a28ba1c.png

通过在应用程序线程和设备队列之间建立专用通道,ADQ不仅可以减少资源争用,还可以大大减少或避免同步操作,例如加锁或多线程共享。另外,ADQ使用轮询(Polling)来减少中断处理和上下文交换的次数,可以减少网络流量的混乱,如下图所示。

8d9eb8cd710f80cf0ff3e5f15b6f6ff5.png

要启用ADQ,除了安装Intel的E800系列网卡和驱动外,还需要匹配较新版本的Linux系统内核(4.19以上)。可以使用iproute2、流量控制(TC)、ethtool、cgroup等工具设置ADQ。

2. 试一试最简功能的ADQ

SPDK之前推出过类似的微信文章,分别是《在SPDK中使能E810网卡ADQ 特性》和《CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 - 上/下篇》,我们在这里适时地更新一下部分命令和参数,再补充一些配置步骤和验证结果。

2.1 准备工作

关于软硬件系统先决条件,请参阅《CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 - 上篇》。这里以Intel E810网卡最新的ice-1.9.7驱动为例,下载地址:

https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html

fb3a88b74ed44475feb1dd7607f939a7.png

上图是SPDK NVMe/TCP与ADQ测试拓扑结构。如果是双机运行,使用绿色箭头方式连接。如果是单机运行,使用黄色箭头方式连接。注意,单机方式需要设置网络命名空间,类似下面这样,以便使数据流真正通过指定网卡环回,而不是仅仅通过内核。具体设置请查看代码spdk/test/nvmf/common.sh的nvmf_tcp_init()函数。网络命名空间设置后,涉及到网口操作的命令,都需要加上ip netns exec 前缀。

ip netns add eth10_ns_spdk

ip link set eth10 netns eth10_ns_spdk

2.2 运行自动化脚本

SPDK代码里已经准备好了应用ADQ运行FIO的自动化脚本,只需执行下面的命令。

./test/nvmf/target/perf_adq.sh --transport=tcp --iso

2.3 单步讲解

为了更好地理解上面的脚本,我们来详细剖析一下具体的步骤,包括ADQ相关的配置,SPDK所需的步骤和验证ADQ生效的方法。

2.3.1 ADQ相关的配置

# 启用向硬件添加流开关

ethtool --offload eth10 hw-tc-offload on

# ADQ驱动默认开启下面开关,我们需要关闭它进行SPDK测试

ethtool --set-priv-flags eth10 channel-pkt-inspect-optimize off

# SPDK使用非阻塞套接字,并且在轮询组轮询期间,将调用epoll_wait(在POSIX实现中使用),且超时值为0。由于套接字是非阻塞的,因此net.core.busy_read的非零值就足够了。

sysctl -w net.core.busy_poll=1

sysctl -w net.core.busy_read=1

# 这里创建 2 个流量类别和 2 个tc1队列(q2和q3),具体原理请看2.4章节

/usr/sbin/tc qdisc add dev eth10 root mqprio num_tc 2 map 0 1 queues 2@0 2@2 hw 1 mode channel

/usr/sbin/tc qdisc add dev eth10 ingress

# 配置流量类别后,将使用target地址(traddr)和端口号(trsvcid)配置tc过滤器以控制数据包

/usr/sbin/tc filter add dev eth10 protocol ip parent ffff: prio 1 flower dst_ip 10.0.0.2/32 ip_proto tcp dst_port 4420 skip_sw hw_tc 1

2.3.2 SPDK所需的步骤

Target端,创建块设备,建立子系统并监听,等待连接请求。并且作为socket应用程序,通过setsockopt()设置socket的SO_PRIORITY。

# 开启一个server,占用核0、1、2、3

build/bin/nvmf_tgt -i 0 -e 0xFFFF -m 0xF --wait-for-rpc

# 变量替换执行RPC命令

rpc_py=scripts/rpc.py

# 打开 enable_placement_id的选项,用于开启基于NAPI_ID的调度算法

$rpc_py sock_impl_set_options --enable-placement-id 1 --enable-zerocopy-send-server -i posix

$rpc_py framework_start_init

# 传输方式为tcp。硬件队列 tc1 与 SPDK 关联,tc1用于nvmf_tgt应用程序流量,优先级 1 映射到 tc1。 因此,sock-priorty 应设置为 1,以引导 Tx 数据包通过 tc1 队列。

$rpc_py nvmf_create_transport -t tcp -o --io-unit-size 8192 --sock-priority 1

# 创建malloc块设备

$rpc_py bdev_malloc_create 64 512 -b Malloc1

# 创建子系统,添加命名空间并建立监听

$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001

$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Malloc1

$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t tcp -a 10.0.0.2 -s 4420

Initiator端,运行perf(fio工具)。

# 连接到server,占用核4、5、6、7,读写类型randread,运行时间100秒

build/examples/perf -q 64 -o 4096 -w randread -t 100 -c 0xF0 -r 'trtype:tcp \

adrfam:IPv4 traddr:10.0.0.2 trsvcid:4420 subnqn:nqn.2016-06.io.spdk:cnode1'

2.4 了解tc配置

配置流量类别(traffic class,简称tc)和队列,是用好ADQ的关键。2.3.1的例子是建立2个tc。下面的例子是建立3个tc,方便起见分别用3种颜色表示。命令中@的左边表示占用cpu核的个数,右边表示从第几号核开始。

/usr/sbin/tc qdisc add dev eth10 root mqprio num_tc 3 map \

2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 queues 4@0 6@4 2@10 hw 1

关键字“map”之后的字符串表示tc的map优先级。它将每个优先级0-15映射到指定的tc。映射中的索引(从零开始)是优先级,索引值指定tc编号。硬件队列根据命令末尾的配置映射到每个tc。所以,4@0 6@4 2@10表示:

tc0从队列0开始有4个队列(q0-q3)

tc1从队列4开始有6个队列(q4-q9)

tc2从队列10开始有2个队列(q10,q11)

再看优先级和队列的映射关系:

2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2表示tc2 tc2 tc1 tc0 tc2 tc2 tc2 tc2 tc2 tc2 tc2 tc2 tc2 tc2 tc2 tc2,排列顺序对应0-15优先级,如下图:

0a77706a0c23edbba244c8c3ce5e9c5e.png

本例中,网卡硬件队列q0-q11对应CPU的core0-core11,那么可以看到:

优先级3映射到tc0,具有硬件队列q0-q3

优先级2映射到tc1、tc1,具有硬件队列q4-q9

优先级0、1、4-15映射到tc2,具有硬件队列q10和q11

这就很好地解释,为什么tc1的优先级在这里没有顺序映射,而是从第4个开始。

2.5 判断ADQ是否生效的几个方法

2.5.1 中断

ADQ启用时,FIO的过程中理想的状态下是没有系统中断的。下面的bash函数check_ints_result()可以判断有没有中断。

3fd8f854a24a6325039409b4439ee74a.png

2.5.2 pkt_busy_poll计数器

本例中,tc1所在队列q2和q3,其Tx和Rx计数器均应处于活动状态。同时,不应有任何数据包通过tc0(即硬件队列0和1)。

watch -d "sudo ethtool -S eth0 | column" 

c22307ac1e13d15a63322d60a1943370.png

9f03f3c3bcb933f0ed8e377429910157.png

上面的屏幕截图显示了对称队列正在工作。如果Tx流量通过队列0或1,则表明未配置套接字优先级。理想情况下,tc1所在队列q2和q3的pkt_busy_poll计数器将增加。

2.5.3 busy_count数量

SPDK的RPC命令thread_get_pollers能够显示active_poller的busy_count参数。如果tc1有两个队列q2和q3,这里也应该有两个busy_count在增加。

ddf4ece1cc58b358f8b71aa9f1bb1174.png

 3. 结 语

本文旨在演示在SPDK中实现ADQ最简功能的验证。用户还可以通过set_irq_affinity将网卡中断轮询绑定到多个cpu核心来提升性能。总的来说,ADQ 的目标是通过动态减少抖动和干扰来确保高优先级应用程序获得可预测的高性能。

4. Reference

1.《在SPDK中使能E810网卡ADQ 特性》

2.《CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 - 上篇》

3.《CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 -下篇》

4. Application Device Queues (ADQ) Resource Center (https://www.intel.co.uk/content/www/uk/en/architecture-and-technology/ethernet/adq-resource-center.html)

fe5ae508fbfebc0cf752ebf469e73092.jpeg

转载须知

DPDK与SPDK开源社区

公众号文章转载声明

推荐阅读

云端数据“上榜”了!

DPDK Release 22.11

Release notes for VPP 22.10

剖析SPDK读写NVMe盘过程--从hello_world开始

06207fd17d234b564dbb628a2afcf6e9.jpeg

94cc4902b67ce38ab9900bbe51b77f16.gif

点点“赞”“在看”,给我充点儿电吧~

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

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

相关文章

44. 含并行连结的网络(GoogLeNet)

GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进。 这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟,以前流行的网络使用小到1 * 1,大到11 * 11的卷积核。 本文的一个观点是,有时使用不同大小的卷积…

unreal engine 增强输入的使用分析

由于ue5以前的输入 系统已经提示被弃用了,因此建议使用新版本 首先 分别新建输入操作 新建映射情景 image.png打开新建的输入操作 根据下图可以得出结论,此东西用于描述 是何种类型映射,以及是否消耗事件 不传递 image.pngimage.png打开情景上…

用Python绘制一朵玫瑰花,送给特别的她

前言 哈喽哈喽,跨年倒计时三天九小时 上次发了烟花的文章,看来还是蛮多人需要代码的 今天就来搞一朵唯一的花吧~(送给你喜欢的那个她) 效果 话不多说 咱先直接看看效果,毕竟搞的不好看我也拿不出手 提前先说 我尽…

CANopen3.0-数据格式

一、CAN消息 一帧CAN消息的通信协议如下: 其中, id: CAN消息的标识符,通常是11bits rtr: 0–消息帧,普通消息;1–远程帧,远程传输请求消息,这种类型的消息不能包含数据帧; dn: 数据帧,一帧普通CAN消息包括0~8bytes数据 在CANOpen中需要自己实现CAN发送消息接口,类似…

小型水库水雨情监测预警自动测报平台 辅助水利在线监测水库水位+雨量

平升电子小型水库水雨情监测预警自动测报平台辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能,有效提升了雨水情信息的时效性和准确度,为保障…

网络常见配置及Nmcli配置使用

1.查看网络配置 /etc/services 可以查看协议的tcp/udp端口 IP common ip addr show #查看设备或IP信息也可以通过ifconfig查询。 ip -s link show eno16777734 #可以发送或接收包的状态ip route #查看路由信息ping 测试通讯连接,用ctrlc结束 Meth : ping [opting]…

中间件:SpringBoot-JAVA整合MQTT通信

1、环境Win10; 2、JDK 1.8; 3、SpringBoot 2.7.5; 4、MQTTV3 1.2.5 5、EMQX服务器本地安装使用参考:MQTT学习记录(一、Windows)_我也不清楚的博客-CSDN博客_mqtt默认密码 6、MQTTX 官方客户端可视化工具安装参考&#…

Ae:段落面板

◆ ◆ ◆段落面板Ae菜单:窗口/段落Window/Paragraph快捷键:Ctrl 7对于点文本,默认一行为一个段落。每按一次回车键,就多出一个段落。对于段落文本,一段可能有多行,具体取决于定界框的尺寸。末尾有回车符…

路由基础:

1、路由中包含以下信息: 目的网络 掩码 出接口 下一跳 对路由条目的管理实际上就是路由器管理、维护路由信息的具体实现,路由表中只会保存“最优”路由。 2、路由获取方式: 直连 静态 动态 * 直连&a…

RHCSA 第四天笔记

文本内容在命令行的操作 文本过滤:grep 文本三剑客: gerp sed awk grep 选项 关键的字符串 文件 grep root /etc/passwd 查找root(交集查找) ^ 以……为开头 $ 以……为结尾 Grep ^root /etc/passwd …

MATLAB | MATLAB不会画图?官方团队来教你

让我看看是哪个小傻瓜还没用过MATLAB官方gallery,常见的图直接MATHWORKS搜索一下就能找到,一些有意思的组合图,以及一些特殊属性的设置MATHWORKS官方是有专门去整理的,虽然一些很特殊的图还是没有(哈哈哈弦图小提琴图啥的官方没有…

第004课 - 项目微服务架构图

文章目录 项目架构图项目架构图 外网部署就是面向公众访问的,部署前端项目。 可以有手机app,也可以有web网站。 内网部署后端系统。 客户端发送请求,请求是先来到我们的nginx集群。 nginx将请求转交给我们的后台服务。 nginx是先将请求转交给api网关。 api网关我们使用…

论文浅尝 | 通过依赖掩码语法引导预训练提升关系抽取

笔记整理:王大壮链接: https://aclanthology.org/2022.findings-acl.147v1.pdf动机关系抽取是一项重要的自然语言处理任务,旨在预测给定文本中两个给定实体之间的关系。其中,对文本上下文信息的良好理解对于实现出色的模型性能至关重要。在不…

CMMI之项目规划

项目规划(Project Planning)的目的是为项目的研发和管理工作制定合理的行动纲领(即《项目计划》),以便所有相关人员按照该计划有条不紊地开展工作。 为了避免词义混淆,这里把动词Planning译为规划&#xf…

用 Python 写一个经典飞机大战

当年微信 5.0 发布时,首页被设置成了一款新推出的小游戏,它就是微信版飞机大战,游戏一经推出便是火爆异常,铅笔画风格的游戏界面也受到了很多人的喜欢。 最近重温了一下这款小游戏,尽管时隔多年,但无论是游…

双向循环神经网络(隐马尔可夫模型)

在双向循环神经网络中,每个时间步的隐状态由当前时间步的前后数据同时决定。 双向循环神经网络与概率图模型中的“前向-后向”算法具有相似性。 双向循环神经网络主要用于序列编码和给定双向上下文的观测估计。 由于梯度链更长,因此双向循环神经网络的…

网站Nginx服务安装https免费证书配置一条龙流程

搜索小程序 成语典故查询 Let’s Encrypt 安装https免费证书配置 1.http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 www.163.com,其网页上的文字、图片、 CSS 、 JS 等文件都是通过 http 协议传输到我们的浏览器,然后被我们看到。 而 …

生物药、创新药、仿制药新项目立项调研、评估的重要手段

当前,随着我国制药行业与国际的高速接轨,研发和产业环境也迎来了崭新的局面。制药企业的核心竞争力是研发,而研发中的立项是直接影响新药开发成功与否的关键因素,那么如何有效的规避开发的风险,立项论证显得极其重要,也是每个医药…

车道线标注案例分析

车道线标注属性细分规则确认点 常见车道线的标注分类属性包括5个维度:颜色、线型、线数、车道、职能 颜色标签:如白色、黄色、蓝色、橙色、黄白色等 线型标签:如实线、虚线、锯齿线等 线数标签:单线、双线,特殊情况…

【高阶数据结构】二叉树的非递归遍历

🌈欢迎来到数据结构专栏~~二叉树的非递归遍历 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自…