高性能网络 SIG 月度动态:联合 IBM 就 SMC v2.1 协议升级达成一致,ANCK 率先完成支持

简介: 高性能网络 SIG 月度动态送达,一键了解 5 月各项目进展。

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

01 SIG 整体进展

本月高性能网络 SIG 的主要工作聚焦在 ANCK 内核网络、SMC 和 virtio 上。

本月关键进展:

  • SIG 本月与 IBM SMC 团队就 SMCv2.1 协议的关键特性达成一致。SMCv2.1 较 SMCv1 具有更强的可拓展性,是 SMC 社区的未来发展趋势。SMCv2.1 相较 SMCv2 的主要差异是引入了 SIG 提出的:

a) LGR 支持单 Link。

b) LGR 支持协商最大连接数。

c) 支持 RDMA write with immediate。

d) 支持 vendor 特定特性等内容。

  • SIG 本月发起的 [Proposal] Relationship between XDP and rx-csum in virtio-net 提案解决了 virtio-net 支持 XDP 和 rx checksum 存在冲突的问题,实现了两者的共存。

02 ANCK 内核网络

修复

修复了网卡多队列、大深度场景下发生 cpu stall 的问题:bugzilla 链接

安全

本月网络方向共计修复 6 个 CVE,覆盖 wifi/net_sched/mpls/netfilter 等模块,CVE 列表:CVE-2022-47929, CVE-2023-32233, CVE-2023-1075, CVE-2023-26545, CVE-2023-28466, CVE-2023-1380。

03 SMC

本月工作主要聚焦在新版本龙蜥内核(ANCK)的开发工作,众多 SMC 关键特性预计将在 ANCK 5.10-015 (7 月发布) 中可用,稳定性也得到更充分的验证。这个版本 ANCK 的 SMC 网络栈具备取代 TCP,默认启用并加速应用通信的能力。用户不再担心回退或短链接等场景劣化网络性能。同时 SMC 可观测性和运维能力也得到了增强。

基于 eBPF 的策略协商

SMC 的连接建立依赖于 TCP 握手交换双方信息,并创建 RDMA QP(如需)和 MR 等,理论上建立连接的开销较大。对于某些类型的应用,频繁创建和释放连接的场景下,SMC 并不具有优势甚至性能下降。我们在最新的 ANCK 内核中引入了基于 eBPF 策略协商机制,当 eBPF 程序探测到用户频繁创建和释放连接时,将会自动切换至 TCP 模式。对于长链接,则会优先使用 SMC 加速应用通信。

首次支持并启用 SMCv2.1

龙蜥社区和 IBM 在 SMC 上保持密切的合作,当前我们提出的 SMC 协议关键特性,都会体现在 SMC 协议规范中。SMCv1 协议由于扩展性差等原因,所有的协议扩展将合并至 SMCv2 的扩展协议 v2.1 中,并提供向下兼容。龙蜥 ANCK 是社区中首个支持 SMCv2.1 协议的内核,我们在此版本默认启用 v2.1 协议,并进行了充分的测试,发现了多个 v2 的隐藏问题并已经修复合入到 ANCK 和上游社区版本。

RDMA write with immediate(WI) 支持

当前 SMC-R 每个请求会通过一次 RDMA_SEND 和一次 RDMA_WRITE 将数据和描述信息发送给对端,对应至少需要两个数据包。对于云上的场景小包的场景,意味着会增加一倍的数据包,而云上虚拟机往往 PPS 会根据实例规格会有限制,导致在数据包很多且大部分都是小包的场景,如 Redis 很容易打到 PPS 的限速影响性能。

针对此问题与解决方案,龙蜥社区高性能网络 SIG 和 IBM SMC 团队经过多轮沟通基本达成一致,SMC 协议将会引入 WI 特性的支持优化此问题。

其他特性

本次版本还包括众多关键特性,我们也将在龙蜥社区持续分享:

  • AF_INET 协议族下的 SMC 协议实现,将 SMC 回退 TCP 的开销缩小在 2% 以内。配合 eBPF 策略协商可以提供近乎透明的网络加速体验。
  • SMC 内存资源限制,当收发缓冲区达到上限时,将自动回退到 TCP,对于内存受限的小规格容器更友好。
  • 全面支持 SMCv2.1 协议,除 SMC WI 外,还提供了 LGR 协商,单 link 支持和 vendor 扩展支持。

04 virtio

virtio-net 支持 AF_XDP zerocopy

AF_XDP 是一个 bypass 内核协议栈的新收发包框架。它可以把驱动的收包直接传递到用户态, 也可以把包直接从用户态传递到驱动发送出去。它的性能相比于内核的 UDP 协议栈可以提升 3-7 倍 PPS。

Anolis 社区目前正在和 virtio 社区合作,积极推进 virtio 针对 AF_XDP 的标准化的支持。这个工作分成几个部分, 本月主要推进 "virtio core 支持 DMA premapped"

本月和 virtio 社区完成多轮沟通,目前已经转向了一些实现的细节问题, 主要关注的点在于 virtio 对于 premapped 的支持是 desc chain 粒度不是 vq 粒度的。

  • desc chain 粒度地, 要增加一些运行态的状态记录, 增加内存使用, 可能引入一些 cache line 相关的问题。
  • vq 粒度, 可以不用引入每一个 desc chain 粒度的纪录, 但是在回收这方面会带来一些麻烦。

目前讨论的结果是向 vq 粒度转移, 这要对 virtio core 进行一些改造, 增加一些新的 helper。

virtio-net 支持 XDP 和数据包 checksum offloading 共存

目前,virtio-net 支持 XDP 和 rx checksum 存在冲突,这是由[1][2]提出的问题引起的,即 XDP 可能会修改/覆盖 Partial CheckSum 相关的信息,导致协议栈验证校验和失败而丢包。但是,这也直接导致了我们不能享受 Unnecessary CheckSum offloading 节省软件 cpu 资源的能力。注意,rx CHECKSUM_PARTIAL 主要存在于虚拟化环境中,因此非虚拟化的硬件网卡没有此问题。

龙蜥社区的目标是实现 XDP 和 VIRTIO_NET_F_GUEST_CSUM 的共存,并发起了 [Proposal] Relationship between XDP and rx-csum in virtio-nethttps://lists.oasis-open.org/archives/virtio-dev/202305/msg00291.html 的提案。龙蜥社区在其中提出了四种可能的解决方案:

  • 不让 virtio-net 驱动收到被标记为 VIRTIO_NET_HDR_F_NEEDS_CSUM 的数据包(partial checkSum ),此可以通过在 virtio specification 规范中添加新的特性完成。
  • 修改 XDP 加载框架,新增一种标记 XDP 程序为只读的标记。XDP 的重要应用方向之一是作为监控/防火墙,其并不会修改数据包。此时我们可以为只读 XDP 的加载打开 rx checksum offloading。
  • 直接打开 VIRTIO_NET_F_GUEST_CSUM。这取决于我们信任虚拟化环境是可靠的,并且数据包进入协议栈后可能不会被转发。
  • 对经过 XDP 修改的 partial checksum 数据包进行流解析,以获取 transport/ip 头的信息重置 csum_{start, offset} 的信息,并重新计算伪头部校验和。

目前,上游社区认可此问题的存在,并且已经基本和上游社区达成一致,即优先尝试第四种入侵最小的解决方案。

[1] virtio-net: disable guest csum during XDP set

[2] virtio-net: fail XDP set if guest csum is negotiated

virtio-net 支持 inner header hash

隧道协议分为两种,一种是没有传输头的 legacy 协议,例如 GRE (RFC 2784, RFC 2890),IPIP (RFC 2003),这种隧道协议由于没有外部端口号,因此在 RSS 队列选择时会因为缺乏熵而导致队列分布不散,进而影响收包性能;另外一种是有传输头的 modern 协议,例如 VXLAN (RFC 7348), GENEVE (RFC 8926), NVGRE (RFC 7637) 等,这种隧道协议虽然可能根据外部端口号可以获取熵,但是他们没有稳定可靠的方法通过外头部标识同一条 flow。

龙蜥社区发起的 inner header hash 的提案,本月和 virtio 社区经过 v13->v15 的讨论,针对兼容未来 modern 协议的扩展性问题和硬编码协议类型的缺陷,上游社区推荐引入一个选项来使用 outer source UDP port 来做达到可能的对称哈希的需求,原因是各个隧道协议 RFC 都隐含/推荐的表示了 outer souce UDP port 需要标识一条流,社区的代码实现中也使用了一致性哈希保证了这点。

相关链接:

高性能网络 SIG 主页:

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

—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。

相关文章
|
1月前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
3月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
52 1
|
3月前
|
网络协议 C++ 网络架构
【革命性升级】OSPFv3 vs OSPFv2:揭秘IPv6时代下的网络协议革新之旅!
【8月更文挑战第22天】OSPFv2与OSPFv3分别是用于IPv4和IPv6网络的路由协议。OSPFv2绑定于32位IPv4地址,而OSPFv3支持128位IPv6地址并具备地址独立性,LSA不再包含具体IPv6地址。OSPFv3引入多实例能力,可在同一接口上运行多个实例,支持多种IPv6地址族。邻居发现机制方面,OSPFv3使用NDP而非ARP。此外,OSPFv3支持更细粒度的路由聚合。这些改进使OSPFv3更适应当今网络需求。
107 1
|
3月前
|
安全 网络安全 网络虚拟化
优化大型企业网络架构:从核心到边缘的全面升级
大型企业在业务运作中涉及多种数据传输,涵盖办公应用、CRM/ERP系统、数据中心、云环境、物联网及安全合规等多个方面。其复杂的业务生态和全球布局要求网络架构具备高效、安全和可靠的特性。网络设计需全面考虑核心层、汇聚层和接入层的功能与冗余,同时实现内外部的有效连接,包括广域网连接、远程访问策略、云计算集成及多层次安全防护,以构建高效且可扩展的网络生态系统。
优化大型企业网络架构:从核心到边缘的全面升级
|
3月前
|
敏捷开发 网络协议 测试技术
阿里云云效产品使用合集之在vpc网络里,如何升级agent
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
运维 网络安全 iOS开发
厉害!外国网络工程师用Ansible给思科IOS设备升级!
厉害!外国网络工程师用Ansible给思科IOS设备升级!
|
5月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【6月更文挑战第22天】Java网络编程中,URL是资源定位器,用于解析和创建网络地址;URLConnection接口负责建立到URL资源的连接。示例展示了如何使用URL类获取协议、主机、端口和路径,以及如何通过HttpURLConnection进行GET/POST请求,设置超时并处理响应。思维导图概述了从创建URL到设置请求属性、发送请求及处理响应的完整流程,帮助理解两者在网络编程中的作用。
44 4
|
6月前
|
存储 人工智能 搜索推荐
社区供稿 | YuanChat全面升级:知识库、网络检索、适配CPU,手把手个人主机部署使用教程
在当下大语言模型飞速发展的背景下,以大模型为核心的AI助手成为了广大企业和个人用户最急切需求的AI产品。然而在复杂的现实办公场景下,简单的对话功能并不能满足用户的全部办公需求,为此我们发布了最新版的YuanChat应用
|
5月前
|
Java 程序员 数据处理
【技能升级】JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
【6月更文挑战第21天】在Java中,URL是网络资源的位置标识,如`http://www.example.com/resource.txt`,而URLConnection是与这些资源交互的接口。创建URL对象后,通过`openConnection()`获取URLConnection实例以读取或写入资源。读取时,设置请求头,获取输入流并读取数据;写入(POST)时,设置输出流并写入数据。处理网络操作时,别忘了异常处理、使用连接池以优化性能、设置超时以及恰当使用请求头和响应头。这些最佳实践能助你高效、稳定地进行网络编程。
44 0