写点什么

性能提升 57% ,SMC-R 透明加速 TCP 实战解析

  • 2022-05-20
  • 本文字数:1420 字

    阅读完需:约 5 分钟

性能提升 57% ,SMC-R 透明加速 TCP 实战解析

TCP 协议作为当前使用最为广泛的网络协议,场景遍布移动通信、数据中心等。对于数据中心场景,通过弹性 RDMA 实现高性能网络协议 SMC-R,透明替换应用 TCP 协议,实现应用网络透明加速。

为什么需要新的内核网络协议栈?



Linux 内核网络协议栈没有银弹,当前 Linux 网络协议栈是在性能(吞吐、CPU 使用率)、时延和通用性权衡下的实现。


在真实场景中,我们可能需要高性能但是并不通用的用户态协议栈,亦或是通用、更高性能更低时延的方案,但是基于传统以太网卡的方案很难有大幅度的提升,更多是基于硬件的红利,例如 100G/400G 网络。


鉴于此,我们考虑是否可以基于其他高性能网络,提供 TCP 兼容的行为和 socket 接口,提供更优的性能。

基于共享内存的网络通信


在谈跨主机通信之前,我们先把视线放到单机维度,如何在单机维度实现 IPC?下面是几种常见的 IPC 方式:



不出意外,共享内存是最快的 IPC 方式,但是缺少一种 OS 层面的统一实现和接口,多数是在语言的 library 中提供。


这里我们分解一下单机维度的共享内存 IPC 流程:


  1. 发送方写到预先分配好的一块内存区域;

  2. 通知对端,并更新新写入内存的偏移量;

  3. 接收方按照新更新的偏移量读取数据;

  4. 接收方更新读取内存的偏移量。



如果有一种技术,可以实现在两台机器间“搬运”内存,那么我们可以把这种高性能 IPC 方案从单机维度拓展到不同的主机间。很显然,Remote Direct Memory Access RDMA 可以帮助我们高效地搬运内存。


相对于单机的共享内存通信流程,基于 RDMA 的流程:


  • 发送方写到本机预先分配好的一块内存区域;

  • 通过 RDMA 将该内存写入到对端维护的内存区域的相同位置;

  • 通过 RDMA 通知接收方,并更新新写入内存的偏移量;

  • 接收方按照新更新的偏移量读取数据;

  • 接收方通过 RDMA 更新读取内存的偏移量。



基于 RDMA 的共享内存模型,SMC-R 应运而生,SMC-R 缩写即为 Shared Memory Communcation over RDMA。


下面让我们看下 SMC-R 是如何加速 TCP 应用。



SMC-R 是一种混合协议,即通过 TCP 实现建联时信息交互,通过 RDMA 网络实现数据路径高性能数据传输。同时,一旦 RDMA 链路建联失败,可以 fallback 到 TCP,实现兜底 TCP 的能力。除此之外,SMC-R 借助多个 RNIC,可以实现运行时的故障迁移,确保运行时可靠性。



RDMA 本身提供了 verbs 接口供应用使用,SMC-R 基于共享内存的模型,提供了一套完全兼容 TCP socket 的内核接口,可以通过 LD_PRELOAD 基于 eBPF 的规则替换等方式,实现将 TCP socket 透明替换成 SMC socket,进而实现透明替换和加速。


基于 SMC-R 透明替换,我们测试了几种应用场景,其中 Redis 有最高 57% 的性能提升,此时 Redis 无需进行任何改造,即可享受 SMC-R 带来的性能加速。


使用 SMC-R 加速应用


透明替换并加速 TCP 应用,可以使用下面三种方案:


  1. 使用 LD_PRELOAD 的方式,这种方式原理是将动态链接的二进制文件中,关于 socket 创建的 SOCK_STREAM 协议,替换为 AF_SMC 协议,从而实现将 TCP 透明替换 SMC 协议;

  2. 通过 net namespace 级别的 sysctl,可以实现网络命名空间(容器等)纬度的所有 TCP 连接的替换;

  3. 通过 eBPF 规则(例如五元组、进程 ID 等),动态匹配需要替换的连接进行替换。



SMC-R 在龙蜥


在龙蜥社区中,我们也正在持续不断地增强优化 SMC,包括性能、使用场景、稳定性和透明替换。参与龙蜥社区贡献的半年时间内,共为 Linux 上游社区贡献了 60+ 的补丁。



相关链接地址:

1、代码仓库:hpn-cloud-kernel

2、高性能网络 SIG 地址:https://openanolis.cn/sig/high-perf-network

2022-05-20 13:251829

评论 1 条评论

发布
用户头像
2022-05-21 11:48
回复
没有更多了
发现更多内容

软件技术从1996年以后就停滞不前了!?难道软件技术难返“春天”了么?

三掌柜

试用期 签约计划 人气作者 TOP10

【架构实战营】第 6 模块作业

swordman

架构实战营

Bzz矿机分币APP,深圳云矿机系统开发

简单实现springmvc中的请求处理

赵镇

springmvc

JavaScript 学习(五)

空城机

JavaScript 大前端 6月日更

网络攻防学习笔记 Day48

穿过生命散发芬芳

网络攻防 6月日更

Kubernetes手记(15)- dashboard

雪雷

k8s 6月日更

科技进步道阻且长,仍未来可期

架构精进之路

科技 6月日更

架构实战营 - 模块 6- 作业

泄矢的呼啦圈

架构实战营

第六次作业

Geek_9cf7b5

【21-11】PowerShell文件 IO 操作

耳东@Erdong

PowerShell 6月日更

上云赋智的企业们,也许是这届618的最大赢家

脑极体

Kubernetes手记(16)- 网络通信

雪雷

6月日更

架构实战营模块6作业

Vic

架构实战营

Nike上货提醒:监控到商品尺码SKU

木头

Nike监控 上货监控 SKU监控

解读SpringBoot和SpringMVC中配置类的@Impot等导入是如何解析的

赵镇

spring

新视界 | 透过鸿蒙OS看手机操作系统

架构精进之路

操作系统 HarmonyOS 6月日更

ServeMux详解

Rayjun

HTTP Go 语言

Linux之cd命令

入门小站

Linux

☕【JVM性能调优】「CMS垃圾回收器」调优化方案

洛神灬殇

CMS GC jvm调优 6月日更

我曾与纪伯伦的对话

卢卡多多

6月日更

深入浅出 Ajax 的核心原理

悟空聊架构

ajax 架构 大前端 6月日更 悟空聊架构

项目经理如何才能不背锅

escray

学习 极客时间 朱赟的技术管理课 6月日更

JSON转Excel

入门小站

工具分享

Java常用的几个Json库,性能强势对比!

xcbeyond

性能优化 6月日更

JAVA面向对象(六)--类和对象

加百利

Java 6月日更

微服务的由来

卢卡多多

微服务 6月日更

「SQL数据分析系列」7. 数据生成、转换以及操作

Databri_AI

数据库 sql

自然语言处理技术

Qien Z.

nlp 6月日更

【Vue2.x 源码学习】第十八篇 - 根据 render 函数,生成 vnode

Brave

源码 vue2 6月日更

【Flutter 专题】100 何为 Flutter Widgets ?

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

性能提升 57% ,SMC-R 透明加速 TCP 实战解析_文化 & 方法_龙蜥社区高性能网络SIG_InfoQ精选文章