首页 > 其他分享 >高性能网络 SIG 月度动态:ANCK 首次支持 SMCv2.1,virtio 规范支持隧道报文内头部哈希

高性能网络 SIG 月度动态:ANCK 首次支持 SMCv2.1,virtio 规范支持隧道报文内头部哈希

时间:2023-08-22 13:07:34浏览次数:44  
标签:virtio ANCK SIG 哈希 2023 CVE SMC

高性能网络 SIG(Special Interest Group) :在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演着前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网络兴趣组致力于利用 XDP、RDMA、VIRTIO 等新高效通信技术,结合软硬件一体化的思想,打造高性能网络协议栈,提升云计算时代数据中心应用的网络的性能。

01

SIG 整体进展

本月关键进展

1、SIG 本月完成 SMC 在 ANCK 5.10-015 内核的集成和发布,ANCK 成为社区首个实现 SMCv2.1 的内核。ANCK 中 SMC 支持 SMCv2.1 协议新增的链路数量协商、链路承载连接数量协商、Vendor 能力拓展等特性,支持通过 AF_INET 协议族使用 SMC,支持部分场景基于 eBPF 的替换策略,以及其他多个优化与稳定性修复。

2、SIG 推进的关于隧道内头部哈希的 virtio 标准规范,经过 8 个月 445 封邮件的沟通,在本月终于成功进入 virtio SPEC 主线。该提案基于特征协商的机制,为 virtio 提供了隧道报文内头部哈希的能力。


02

ANCK 内核网络

修复

ANCK 5.10-015 版本回合多个 SIG 提交至上游的修复补丁:

  • net/smc: Reset connection when trying to use SMCRv2 fails
  • net/smc: Scan from current RMB list when no position specified
  • net/smc: Dont use RMBs not mapped to new link in SMCRv2 ADD LINK
  • net/smc: Avoid to access invalid RMBs MRs in SMCRv1 ADD LINK CONT

安全

本月网络方向共计修复 13 个 CVE,覆盖 sched/iscsi_tcp/rxrpc/netfilter/tap 等模块,CVE 列表:

ANCK-5.10:CVE-2023-3610,CVE-2023-2006,CVE-2023-2162,CVE-2023-35001,CVE-2023-31248,CVE-2023-3117,CVE-2023-1382。

ANCK-4.19:CVE-2023-35001,CVE-2023-3117,CVE-2023-1077,CVE-2023-1076,CVE-2023-35788,CVE-2023-1829。


特性

  • ANCK 5.10-015 版本网络部分增加多个 SMC 相关新特性,具体可见下方 SMC 一节。
  • ANCK 5.10-015 引入了 devlink 中 SF (Scalable Function) 管理的支持:!1827 devlink 支持 subfunction


03

SMC

本月高性能网络 SIG 在 SMC 领域的工作主要聚焦在:

  • 完成 SMC 在 ANCK 5.10-015 内核的集成和发布,提供生产级别可用性。
  • 推动上游 SMCv2.1 协议的发布并确定 SMC-D 协议拓展的基本方案。

版本发布

本次在 ANCK 5.10-015 内核发布的 SMC 主要包含以下优势:

1. 更强的性能,E2E 测试中 SMC + ERDMA 场景下,Redis 单进程 SMC 对比 TCP 有 40% 以上的性能提升,相同 PPS 下对比 TCP 节省 20% 以上 CPU。

2. 更高的稳定性:通过大规模和 CI 测试,涵盖了大部分的典型 E2E 网络通信场景,共完成 22 个上游或自研特性修复,已合入上游 4 个修复补丁。

3. 更灵活、高效的使用方式:部分场景提供基于 eBPF 透明策略选择以及基于 AF_INET 的高效回退的能力,具备判断应用连接模型并自动加速的能力。

详细的发布日志包括:

1. 社区首个 SMCv2.1 协议的实现,SIG 提出的 SMC 协议扩展从白皮书发布到实现已经全部完成,包含:

  • 在云上 eRDMA 场景下默认使用 SMCv2 协议。
  • 支持 SMCv2.1 版本协议的协商,包括 LGR 连接数、Link 数量和 vendor ID。
  • 提供 vendor 扩展的 RDMA write with IMM 特性支持。
  • 提供 vendor 扩展的基于 credit 流控算法。

2. 支持按 AF_INET 协议簇创建 SMC 套接字,使 fallback 后的性能达到 TCP 的 95%+。

3. 支持部分场景基于 eBPF 的替换策略,支持根据流量模型的连接维度替换。

4. 其他优化,包括支持 RDMA 资源诊断、高阶内存拆分、共享内存扩大等。

5. 大量修复,包括因各类竞争导致的 hung、UAF、memory leak、panic 等问题。

SMC V2.1 协议白皮书

本月 SIG 推动的 SMCv2.1 新特性已随 IBM SMC V2.1 协议白皮书发布,详细内容可见 IBM 白皮书,白皮书包含 SIG 提议的如下特性:

  • 基于 Vendor ID 的协议拓展,支持云厂商提供定制 SMC 特性。
  • 支持容灾链路数量的协商,以优化单链路场景的握手流程,提升建连效率。
  • 支持链路组中连接数量的协商,以适应不同的场景。

SMC-D 方案讨论

本月 SIG 与 IBM 讨论并确定了 SMC-D 设备拓展方案。为支持未来可能出现的 SMC-D 虚拟设备,如 SMC-D loopback 设备,SMC-D 协议将拓展现有 64bits GID 到 128 bits,并计划为虚拟设备预留最高位为 1 的 VCHID。通过这种方式,SMC-D 在完全保留现有 CLC 握手协商流程的前提下,提供了向前兼容的 SMC-D 虚拟设备支持。

04

Virtio

本月高性能网络 SIG 在 virtio 领域的工作,主要聚焦在推动动态中断调节和隧道外部源端口哈希的实现方案上,SIG 推进的关于隧道内头部哈希的 virtio 标准规范,经过 8 个月 445 封邮件的沟通,终于成功进入 virtio spec 主线。

隧道报文内头部哈希

传统隧道协议由于在外头部中缺少足够的熵,导致收包时报文容器汇聚到单个队列上,无法发挥多队列收包的优势;同时,现代隧道协议在某些场景需要通过将同一条流接收在同一个队列上以获得性能收益,而外头部不容易做到此。

基于上述目的,龙蜥社区发起了针对隧道报文进行内头部哈希的提案 [PATCH v21] virtio-net: support inner header hash](),目前该提案取得 OASIS Open: Committees 14 票( 14/16 )通过票,进入规范主线。该提案基于特征协商的机制,为 virtio 提供了隧道报文内头部哈希的能力。该提案中,设备可以通过配置空间为驱动提供设备支持内头部哈希的隧道类型,驱动可以动态配置使能的隧道类型。同时,内头部哈希与 RSS 收包机制互相正交,提升了内头部哈希的扩展灵活性。最后,为了防止使用该特性带来的可能的安全问题,本规范也给出了一些防护的介绍和建议,具体请参见规范补丁。

动态中断调节

Net DIM 动态中断调节算法算法通过统计当前网络中单个队列的流量信息和中断次数,自适应计算中断调整方向和步长,并将结果配置下发到设备,以达到提升网络吞吐量的目的。

SIG 为了让 virtio 获益到动态中断调节算法带来的性能提升,推动了已经进入 virtio 规范标准的 [PATCH v14] virtio-net: support the virtqueue coalescing moderation](),以支持 virtio driver 基于单个队列配置中断汇聚参数。同时正在推进 Linux 社区代码实现的补丁集合:[RFC PATCH 0/6] virtio-net: support dynamic coalescing moderation - Heng Qi]()。

外部源端口号哈希

针对不分应用场景在使用隧道协议时存在对称哈希的需求,我们既可以通过上述的隧道报文内头部哈希解决,也可以通过隧道外部源端口号哈希解决。但是由于某些 virtio 设备的实现可能存在解析资源受限的问题(例如可能最高支持 200B 的 header), 例如 GENEVE 这种 Option 字段就长达 256B 的隧道报文,这种 virtio 设备的实现就无法使用内头部哈希。幸运的是,存在外部传输头的隧道协议,其标准规范会“推荐”使用外部源端口号来唯一的标记一条内部流(由于是“推荐”,而不是“必须”,会存在不可靠的问题),因此,使用外部源端口号计算哈希可以达到对称哈希的目的。高性能网络小组推进了外部源端口号哈希的 virtio 规范提案:[PATCH] virtio-net: support the outer source port hash for UDP-encapsulated packets](),该提案旨在扩展 RSS (Receive Side Scaling) 的能力,让有对称哈希需求且解析资源受限的 virtio 设备可以轻易的达到同一条流散列到同一接收队列的目的。

相关链接:


高性能网络 SIG 主页:

https://openanolis.cn/sig/high-perf-network

注:更多龙蜥 SIG 月度动态可点击这里查看。



—— 完 ——

标签:virtio,ANCK,SIG,哈希,2023,CVE,SMC
From: https://blog.51cto.com/u_15308345/7188037

相关文章

  • c++算法之哈希表
    啥是哈希表 哈希表,类似散列表,是一种存储数据的一种方式。只能说是有点奇葩。他是通过将值转换成数组的下标,也就是f[x]=x的意思,大家估计都能理解吧......
  • 哈希表——解205. 同构字符串及290. 单词规律
    205.同构字符串此题是「290.单词规律」的简化版,需要我们判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,同时t的任意一个字符被s中唯一的字符对应。这也被称为「双射」的关系。以示例2为例,t中的字符a和r虽然有唯一的映射o,但对......
  • 哈希表(实现 Python 中的集合 set)
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-classLinkList:classNode:def__init__(self,item=None):self.item=itemself.next=NoneclassLinkListIterator:def__init__(self,node......
  • 有关C++哈希函数的常用形式,具体解释见注释
    #pragmaonce#include<unordered_set>#include<unordered_map>namespacehash_function{ //将参数传入 template<typename...Types> inlinesize_thash_val(constTypes&...args){ size_tseed=0; hash_val(seed,args...); returnseed;......
  • day07 - 哈希表part02
    454. 四数相加II讲解classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){//mapunordered_map<int,int>map_two;i......
  • 构造一致性哈希算法
    先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0,232-1])将服务器节点放置在这个Hash环上,然后根据数据的key值计算得到其Hash值(其分布也为[0,2^32-1]),接着在Hash环上顺时针查找距离这个key值的Hash值最近的服务器节点,完成key到服务器的映射查找......
  • day06 - 哈希表part01
    242. 有效的字母异位词讲解classSolution{public:boolisAnagram(strings,stringt){if(s.length()!=t.length())returnfalse;map<char,int>map_s;map<char,int>map_t;for(inti=0;i<s.length()......
  • 考研数据结构——每日一题[哈希表]
    840.模拟散列表维护一个集合,支持如下几种操作:Ix,插入一个数x;Qx,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为Ix,Qx中的一种。输出格式对于每......
  • 鲁棒图像哈希
    鲁棒图像哈希标题页:鲁棒图像哈希目录页一、背景介绍图像哈希的概念、意义和应用场景图像哈希面临的问题与研究现状二、关键技术概述基于局部和全局特征的哈希基于特征降维的哈希基于统计特征的哈希基于学习的哈希基于深度学习的哈希方法三、典型算法案例基于Zernik......
  • 字符串哈希
    没有模的版本constintN=1000010;constintm=131;constintmod=1e9+7;intn,T;chars[N];intf[N],p[N];intmain(){ scanf("%s",s+1);n=strlen(s+1); p[0]=1; for(inti=1;i<=n;i++){ f[i]=f[i-1]*m......