关于内核:系列解读SMCR透明无感提升云上-TCP-应用网络性能一-龙蜥技术

10次阅读

共计 8221 个字符,预计需要花费 21 分钟才能阅读完成。

文 / 龙蜥社区高性能网络 SIG

引言

Shared Memory Communication over RDMA (SMC-R) 是一种基于 RDMA 技术、兼容 socket 接口的内核网络协议,由 IBM 提出并在 2017 年奉献至 Linux 内核。SMC-R 可能帮忙 TCP 网络应用程序通明应用 RDMA,取得高带宽、低时延的网络通信服务。阿里云云上操作系统 Alibaba Cloud Linux 3 以及龙蜥社区开源操作系统 Anolis 8 配合神龙弹性 RDMA (eRDMA) 首次将 SMC-R 带上云上场景,助力云上利用取得更好的网络性能:《技术揭秘:阿里云公布第四代神龙,SMC-R 让网络性能晋升 20%》。

因为 RDMA 技术在数据中心畛域的宽泛应用,龙蜥社区高性能网络 SIG 认为 SMC-R 将成为下一代数据中心内核协定栈的重要方向之一。为此,咱们对其进行了大量的优化,并踊跃将这些优化回馈到上游 Linux 社区。目前,龙蜥社区高性能网络 SIG 是除 IBM 以外最大的 SMC-R 代码奉献个人。因为 SMC-R 相干中文材料极少,咱们心愿通过一系列文章,让更多的国内读者理解并接触 SMC-R,也欢送有趣味的读者退出龙蜥社区高性能网络 SIG 一起沟通交流(二维码见文末)。

本篇作为系列文章的第一篇,将从宏观的角度率领读者初探 SMC-R。

一、从 RDMA 谈起

Shared Memory Communication over RDMA 的名称蕴含了 SMC-R 网络协议的一大特点——基于 RDMA。因而,在介绍 SMC-R 前咱们先来看看这个高性能网络畛域中的相对主力:Remote Direct Memory Access (RDMA) 技术。

1.1 为什么须要 RDMA ?

随着数据中心、分布式系统、高性能计算畛域的疾速倒退,网络设备性能提高显著,支流物理网络带宽已达到了 25-100 Gb/s,网络时延也进入了十微秒的时代。

然而,网络设备性能晋升的同时一个问题也逐步露出:网络性能与 CPU 算力逐步失配。传统网络中,负责网络报文封装、解析和用户态 / 内核态间数据搬运的 CPU 在高速增长的网络带宽背后逐步显得力不从心,面临越来越大的压力。

以 TCP/IP 网络的一次数据发送与接管过程为例。发送节点 CPU 首先将数据从用户态内存拷贝至内核态内存,在内核态协定栈中实现数据包封装;再由 DMA 控制器将封装好的数据包搬运到 NIC 上发送到对端。接收端 NIC 取得数据包后通过 DMA 控制器搬运到内核态内存中,由内核协定栈解析,层层剥离帧首或包头后再由 CPU 将无效负载 (payload) 拷贝到用户态内存中,实现一次数据传输。

(图 / 传统 TCP/IP 网络传输模型)

在这一过程中,CPU 须要负责:
1)用户态与内核态间的数据拷贝。
2)网络报文的封装、解析工作。

这些工作“反复低级”,占用了大量 CPU 资源 (如 100 Gb/s 的网卡跑到满带宽须要打满多个 CPU 核资源),使得 CPU 在数据密集型场景下无奈将算力用到更无益的中央。

所以,解决网络性能与 CPU 算力失配问题成为了高性能网络倒退的要害。思考到摩尔定律逐步生效,CPU 性能短时间内发展缓慢,将网络数据处理工作从 CPU 卸载到硬件设施的思路就成为了支流解决方案。这使得以往专用于特定高性能畛域的 RDMA 在通用场景下失去愈来愈多的利用。

1.2 RDMA 的劣势

RDMA (Remote Direct Memory Access) 是一种近程内存间接拜访技术,自提出以来通过 20 余年的倒退曾经成为了高性能网络的重要组成。那么 RDMA 是如何实现一次数据传输的呢?

(图 / 用户态 RDMA 网络传输模型)

RDMA 网络 (用户态模式) 中,具备 RDMA 能力的网卡 RNIC 间接从发送端用户态内存中获得数据,在网卡中实现数据封装后传输到接收端,再由接收端 RNIC 将数据解析剥离,将无效负载 (payload) 间接放入用户态内存中实现数据传输。

这一过程中 CPU 除了必要的管制面性能外,简直不必参加数据传输。数据就像是通过 RNIC 间接写入到近程节点的内存中一样。因而,与传统网络相比,RDMA 将 CPU 从网络传输中解放了进去,使得网络传输就像是近程内存间接拜访一样方便快捷。

(图 / 传统网络与 RDMA 网络协议栈比照)

比照传统网络协议,RDMA 网络协议具备以下三个特点:

1. 旁路软件协定栈
RDMA 网络依赖 RNIC 在网卡外部实现数据包封装与解析,旁路了网络传输相干的软件协定栈。对于用户态应用程序,RDMA 网络的数据门路旁路了整个内核;对于内核应用程序,则旁路了内核中的局部协定栈。因为旁路了软件协定栈,将数据处理工作卸载到了硬件设施,因此 RDMA 可能无效升高网络时延。

2.CPU 卸载
RDMA 网络中,CPU 仅负责管制面工作。数据门路上,无效负载由 RNIC 的 DMA 模块在利用缓冲区和网卡缓冲区中拷贝 (利用缓冲区提前注册,受权网卡拜访的前提下),不再须要 CPU 参加数据搬运,因而能够升高网络传输中的 CPU 占用率。

3. 内存间接拜访
RDMA 网络中,RNIC 一旦取得近程内存的拜访权限,即可间接向近程内存中写入或从近程内存中读出数据,不须要近程节点参加,非常适合大块数据传输。

二、回到 SMC-R

通过上述介绍,置信读者对 RDMA 次要特点以及性能劣势有了初步的理解。不过,尽管 RDMA 技术可能带来可喜的网络性能晋升,然而想应用 RDMA 通明晋升现有 TCP 利用的网络性能仍有艰难,这是因为 RDMA 网络的应用依赖一系列新的语义接口,包含 ibverbs 接口与 rdmacm 接口(后统称 verbs 接口)。

局部 ibverbs 与 rdmacm 接口[1]

相较于传统 POSIX socket 接口,verbs 接口数量多,且更靠近硬件语义。对于已有的基于 POSIX socket 接口实现的 TCP 网络应用,想要享受 RDMA 带来的性能红利就不得不对应用程序进行大量革新,老本微小。

因而,咱们心愿可能在应用 RDMA 网络的同时沿用 socket 接口,使现有 socket 应用程序通明的享受 RDMA 服务。针对这一需要,业界提出了以下两个计划:

其一,是基于 libvma 的用户态计划。libvma 的原理是通过 LD_PRELOAD 来将利用所有 socket 调用引入自定义实现,在自定义实现中调用 verbs 接口,实现数据收发。然而,因为实现在用户态,libvma 一方面短少内核对立资源管理,另一方面对 socket 接口的兼容性较差。

其二,是基于 SMC-R 的内核态计划。作为内核态协定栈,SMC-R 对 TCP 利用的兼容性相较于用户态计划会好很多,这种 100% 兼容意味着极低的推广和复用老本。此外,实现在内核态使得 SMC-R 协定栈中的 RDMA 资源可能被用户态不同过程共享,进步资源利用率的同时升高频繁资源申请与开释的开销。不过,齐全兼容 socket 接口就意味着须要就义极致的 RDMA 性能 (因为用户态 RDMA 程序能够做到数据门路旁路内核与零拷贝,而 SMC-R 为了兼容 socket 接口,无奈实现零拷贝),但这也换来兼容与易用,以及比照 TCP 协定栈的通明性能晋升。将来,咱们还打算拓展接口,以就义小局部兼容性的代价将零拷贝个性利用于 SMC-R,使它的性能失去进一步改善。

2.1 通明替换 TCP

SMC-R is an open sockets over RDMA protocol that provides transparent exploitation of RDMA (for TCP based applications) while preserving key functions and qualities of service from the TCP/IP ecosystem that enterprise level servers/network depend on!

摘自:

https://www.openfabrics.org/i…

SMC-R 作为一套与 TCP/IP 协定平行,向上兼容 socket 接口,底层应用 RDMA 实现共享内存通信的内核协定栈,其设计用意是为 TCP 利用提供通明的 RDMA 服务,同时保留了 TCP/IP 生态系统中的要害性能。

为此,SMC-R 在内核中定义了新的网络协议族 AF_SMC,其 proto_ops 与 TCP 行为完全一致。

/* must look like tcp */
static const struct proto_ops smc_sock_ops = {
  .family    = PF_SMC,
  .owner    = THIS_MODULE,
  .release  = smc_release,
  .bind    = smc_bind,
  .connect  = smc_connect,
  .socketpair  = sock_no_socketpair,
  .accept    = smc_accept,
  .getname  = smc_getname,
  .poll    = smc_poll,
  .ioctl    = smc_ioctl,
  .listen    = smc_listen,
  .shutdown  = smc_shutdown,
  .setsockopt  = smc_setsockopt,
  .getsockopt  = smc_getsockopt,
  .sendmsg  = smc_sendmsg,
  .recvmsg  = smc_recvmsg,
  .mmap    = sock_no_mmap,
  .sendpage  = smc_sendpage,
  .splice_read  = smc_splice_read,
};

因为 SMC-R 协定反对与 TCP 行为统一的 socket 接口,应用 SMC-R 协定非常简单。总体来说有两个办法:

(图 /SMC-R 的应用办法)

其一,应用 SMC-R 协定族 AF_SMC 开发。通过创立 AF_SMC 类型的 socket,应用程序的流量将进入到 SMC-R 协定栈;

其二,通明替换协定栈。将应用程序创立的 TCP 类型 socket 通明替换为 SMC 类型 socket。通明替换能够通过以下两种形式实现:

  • 应用 LD_PRELOAD 实现协定栈通明替换。在运行 TCP 应用程序时预加载一个动静库。在动静库中实现自定义 socket() 函数,将 TCP 应用程序创立的 AF_INET 类型 socket 转换为 AF_SMC 类型的 socket,再调用规范 socket 创立流程,从而将 TCP 利用流量引入 SMC-R 协定栈。
int socket(int domain, int type, int protocol)
{
  int rc;

  if (!dl_handle)
    initialize();

  /* check if socket is eligible for AF_SMC */
  if ((domain == AF_INET || domain == AF_INET6) &&
      // see kernel code, include/linux/net.h, SOCK_TYPE_MASK
      (type & 0xf) == SOCK_STREAM &&
      (protocol == IPPROTO_IP || protocol == IPPROTO_TCP)) {dbg_msg(stderr, "libsmc-preload: map sock to AF_SMC\n");
    if (domain == AF_INET)
      protocol = SMCPROTO_SMC;
    else /* AF_INET6 */
      protocol = SMCPROTO_SMC6;

    domain = AF_SMC;
  }

  rc = (*orig_socket)(domain, type, protocol);

  return rc;
}

开源用户态工具集 smc-tools 中的 smc_run 指令即实现上述性能[2]。

  • 通过 ULP + eBPF 实现协定栈通明替换。SMC-R 反对 TCP ULP 是龙蜥社区高性能网络 SIG 奉献到上游 Linux 社区的新个性。用户能够通过 setsockopt() 指定新创建的 TCP 类型 socket 转换为 SMC 类型 socket。同时,为防止应用程序革新,用户能够通过 eBPF 在适合的 hook 点 (如 BPF_CGROUP_INET_SOCK_CREATE、BPF_CGROUP_INET4_BIND、BPF_CGROUP_INET6_BIND 等) 注入 setsockopt(),实现通明替换。这种形式更适宜在容器场景下能够根据自定义规定,批量的实现协定转换。
static int smc_ulp_init(struct sock *sk)
{
    struct socket *tcp = sk->sk_socket;
    struct net *net = sock_net(sk);
    struct socket *smcsock;
    int protocol, ret;
    
    /* only TCP can be replaced */
    if (tcp->type != SOCK_STREAM || sk->sk_protocol != IPPROTO_TCP ||
        (sk->sk_family != AF_INET && sk->sk_family != AF_INET6))
        return -ESOCKTNOSUPPORT;
    /* don't handle wq now */
    if (tcp->state != SS_UNCONNECTED || !tcp->file || tcp->wq.fasync_list)
        return -ENOTCONN;
    
    if (sk->sk_family == AF_INET)
        protocol = SMCPROTO_SMC;
    else
        protocol = SMCPROTO_SMC6;
    
    smcsock = sock_alloc();
    if (!smcsock)
        return -ENFILE;
    
    <...>
}

SEC("cgroup/connect4")
int replace_to_smc(struct bpf_sock_addr *addr)
{int pid = bpf_get_current_pid_tgid() >> 32;
    long ret;
    
    /* use-defined rules/filters, such as pid, tcp src/dst address, etc...*/
    if (pid != DESIRED_PID)
        return 0;
    
    <...>
        
    ret = bpf_setsockopt(addr, SOL_TCP, TCP_ULP, "smc", sizeof("smc"));
    if (ret) {bpf_printk("replace TCP with SMC error: %ld\n", ret);
        return 0;
    }
    return 0;
}

综合上述介绍,TCP 应用程序通明应用 RDMA 服务能够体现在以下两个方面:

2.2 SMC-R 架构


(图 /SMC-R 架构)

SMC-R 协定栈在零碎外部处于 socket 层以下,RDMA 内核 verbs 层以上。是一个具备 “hybrid” 特点的内核网络协议栈。这里的 “hybrid” 次要体现在 SMC-R 协定栈中混合了 RDMA 流与 TCP 流:

数据流量基于 RDMA 网络传输

SMC-R 应用 RDMA 网络来传递用户态应用程序的数据,使应用程序通明的享受到 RDMA 带来的性能红利,即上图中黄色局部所示。

发送端应用程序的数据流量通过 socket 接口从利用缓冲区来到内核内存空间;接着通过 RDMA 网络间接写入近程节点的一个内核态 ringbuf (remote memory buffer, RMB) 中;最初由近程节点 SMC-R 协定栈将数据从 RMB 拷贝到接收端利用缓冲区中。


(图 /SMC-R 共享内存通信)
显然,SMC-R 名称中的共享内存通信指的就是基于近程节点 RMB 进行通信。与传统的本地共享内存通信相比,SMC-R 将通信两端拓展为了两个拆散的节点,利用 RDMA 实现了基于“近程”共享内存的通信。


(图 / 支流 RDMA 实现)

目前,RDMA 网络的支流实现有三种:InfiniBand、RoCE 和 iWARP。其中,RoCE 作为在高性能与高老本中衡量的计划,在应用 RDMA 的同时兼容以太网协定,既保证了不错的网络性能,同时也升高了网络组建老本,因而倍受企业青眼,Linux 上游社区版本的 SMC-R 也因而应用 RoCE v1 和 v2 作为其 RDMA 实现。

而 iWARP 则是基于 TCP 实现了 RDMA,冲破了其余两者对无损网络的刚性需要。iWARP 具备更好的可拓展性,十分实用于云上场景。阿里云弹性 RDMA (eRDMA) 基于 iWARP 将 RDMA 技术带到云上。阿里云操作系统 Alibaba Cloud Linux 3 与龙蜥社区开源操作系统 Anolis 8 中的 SMC-R 也进一步反对了 eRDMA (iWARP),使云上用户通明无感的应用 RDMA 网络。

依赖 TCP 流建设连贯

除 RDMA 流外,SMC-R 还会为每个 SMC-R 连贯装备一条 TCP 连贯,两者具备雷同的生命周期。TCP 流在 SMC-R 协定栈中次要负担以下职责:

1)动静发现对端 SMC-R 能力

在 SMC-R 连贯建设前,通信两端并不知道对端是否同样反对 SMC-R。因而,两端会首先建设一条 TCP 连贯。在 TCP 连贯三次握手的过程中通过发送携带非凡的 TCP 选项的 SYN 包示意反对 SMC-R,同时测验对端发送的 SYN 包中的 TCP 选项。

(图 / 示意 SMC-R 能力的 TCP 选项)

2)回退

若在上述过程中,通信两端其一无奈反对 SMC-R 协定,或是在 SMC-R 连贯建设过程中无奈持续,则 SMC-R 协定栈将回退至 TCP 协定栈。回退过程中,SMC-R 协定栈将应用程序持有的文件描述符对应的 socket 替换为 TCP 连贯的 socket。应用程序的流量将通过这条 TCP 连贯承载,以保障数据传输不会中断。

3)帮忙建设 SMC-R 连贯

若通信两端均反对 SMC-R 协定,则将通过 TCP 连贯替换 SMC-R 连贯建设音讯 (建连过程相似 SSL 握手)。此外,还须要应用此 TCP 连贯替换两侧的 RDMA 资源信息,帮忙建设用于数据传输的 RDMA 链路。

通过上述介绍,置信读者对 SMC-R 总体架构有了初步的理解。SMC-R 作为一个 “hybrid” 解决方案,充分利用了 TCP 流的通用性和 RDMA 流的高性能。前面的文章中咱们将对 SMC-R 中的一次残缺通信过程进行剖析,届时读者将进一步领会到 “hybrid” 这一特点。

本篇作为 SMC-R 系列文章的首篇,心愿可能起到一个引子的作用。回顾本篇,咱们次要答复了这几个问题:

1、为什么要基于 RDMA?
因为 RDMA 可能带来网络性能晋升 (吞吐 / 时延 /CPU 占用率);

2、为什么 RDMA 可能带来性能晋升?
因为旁路了大量软件协定栈,将 CPU 从网络传输过程中解放出来,使数据传输就像间接写入近程内存一样简略;

3、为什么须要 SMC-R?
因为 RDMA 利用基于 verbs 接口实现,已有的 TCP socket 利用若想应用 RDMA 技术改造老本高;

4、SMC-R 有什么劣势?
SMC-R 齐全兼容 socket 接口,模仿 TCP socket 接口行为。使 TCP 用户态应用程序可能通明应用 RDMA 服务,不做任何革新就能够享受 RDMA 带来的性能劣势。

5、SMC-R 的架构特点?
SMC-R 架构具备 “hybrid” 的特点,交融了 RDMA 流与 TCP 流。SMC-R 协定应用 RDMA 网络传输利用数据,应用 TCP 流确认对端 SMC-R 能力、帮忙建设 RDMA 链路。

参考援用阐明:
[1]:
https://network.nvidia.com/pd…
[2]:https://github.com/ibm-s390-l…
—— 完 ——

退出龙蜥社群

退出微信群:增加社区助理 - 龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;退出钉钉群:扫描下方钉钉群二维码。欢送开发者 / 用户退出龙蜥社区(OpenAnolis)交换,独特推动龙蜥社区的倒退,一起打造一个沉闷的、衰弱的开源操作系统生态!

对于龙蜥社区

龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、集体等在被迫、平等、开源、合作的根底上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、凋谢的 Linux 上游发行版社区及翻新平台。

龙蜥社区成立的短期指标是开发龙蜥操作系统 (Anolis OS) 作为 CentOS 停服后的应答计划,构建一个兼容国内 Linux 支流厂商的社区发行版。中长期指标是摸索打造一个面向未来的操作系统,建设对立的开源操作系统生态,孵化翻新开源我的项目,凋敝开源生态。

目前,龙蜥 OS 8.4 已公布,反对 X86_64、Arm64、LoongArch 架构,欠缺适配飞腾、海光、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密反对。

欢送下载:

https://openanolis.cn/download

退出咱们,一起打造面向未来的开源操作系统!

https://openanolis.cn

正文完
 0