文档

共享内存通信(SMC)使用说明

更新时间:

Alibaba Cloud Linux 3提供的共享内存通信SMC(Shared Memory Communication)是一种兼容socket层、使用共享内存技术实现的高性能内核网络协议栈。根据共享内存技术的不同,SMC又可以细分为基于Internal Shared Memory(ISM)技术的SMC over DMA(SMC-D)和基于Remote Direct Memory Access(RDMA)技术的SMC over RDMA(SMC-R)。本文为您介绍SMC-R及其使用方法。

背景信息

SMC-R由IBM于2017年开源至Linux 4.11并持续维护至今,其协议标准可参考IETF RFC 7609。Alibaba Cloud Linux 3操作系统基于阿里云弹性RDMA(elastic RDMA,简称eRDMA)技术首次将SMC-R带上云上场景,实现对TCP应用透明无侵入的替换,提供高性能、普惠的软硬件协同网络。

SMC-R的共享内存数据交互模型依赖RDMA提供的内存操作原语。RDMA技术将网络协议栈下沉至RDMA网卡(RNIC)实现,使网络节点能够绕过内核直接访问远程内存。与TCP网络相比,RDMA网络可以减少数据在内存间拷贝的次数,降低网络传输过程中消耗的CPU资源,进而提高网络吞吐、降低网络时延。两者协议栈差异如下图所示:

image

因此,RDMA被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。

过去,RDMA只能在一些数据中心网络中通过网卡和交换机紧密配合使用,部署复杂度高。如今,阿里云弹性RDMA将复杂的RDMA技术带到云上,使普通的ECS用户也能使用高性能的RDMA传输,无需关心底层复杂的网卡、交换机等物理网络环境配置,使其成为一种亲民、普惠的技术。

但是,RDMA技术基于IB verbs接口,与常用的POSIX socket接口存在巨大的差异。现有socket应用程序迁移至RDMA网络往往面临大量的改造,使用RDMA技术仍存在较高的技术门槛。

因此,为了充分挖掘弹性RDMA的潜力,为云上用户提供更好的网络性能,Alibaba Cloud Linux 3提供并优化了SMC-R。在高效使用RDMA技术的同时,保留对标准TCP应用的兼容,使更多的应用无需修改便能享受RDMA所带来的性能红利。

核心优势

SMC-R的优势主要体现在以下几点:

  • 高性能

    得益于RDMA技术将网络协议栈从内核卸载至硬件网卡,SMC-R相较于TCP协议栈在合适的场景下可获得更低的时延、更高的吞吐量,以及更小的CPU负载。具体表现在:

    • 基于RDMA的硬件卸载。

    • 高效可靠的远程内存直接访问设计。

  • 透明替换

    得益于SMC-R对POSIX socket接口的兼容以及协议栈透明替换能力,socket应用程序可以在无修改的情况下完成TCP协议栈到SMC-R协议栈的切换,无需额外的应用改造和开发成本。具体表现在:

    • 兼容socket接口的共享内存通信。

    • 进程或net namespace维度的透明协议替换。

    • 自动协议协商和安全回退机制。

技术架构

SMC-R技术架构说明如下:

  • 协议层次与透明替换

    SMC-R工作于内核空间,向上支持用户态程序通过socket接口描述的网络行为,向下使用IB verbs接口实现RDMA网络传输。RDMA资源的使用、管理与维护均由SMC-R协议栈完成,应用程序不会感知到内核中的RDMA实体。技术架构如下图所示:

    image

    Alibaba Cloud Linux 3提供了进程或net namespace维度的TCP至SMC-R协议栈透明替换机制。通过LD_PRELOAD或sysctl net.smc.tcp2smc等方式让网络传输运行于SMC-R协议栈,使应用程序无需修改即可享受RDMA带来的网络性能提升。

  • 自动协商和安全回退

    SMC-R具备自动协商、动态回退TCP的能力。建立SMC-R通信前,协议栈首先在内核中与通信对端建立TCP连接,在握手过程中使用特殊的TCP选项表明自身支持SMC-R,并确认对端同样支持SMC-R。

    • 如果协商成功,通信两侧SMC-R协议栈将创建新的或者复用已有的RDMA资源,建立可用的RDMA RC链路。从此网络传输将基于RDMA网络完成。

    • 如果协商失败,例如一侧不具备RDMA设备,SMC-R协议栈将自动回退到TCP协议栈,使用协商时建立的TCP连接完成数据传输。

      说明

      SMC-R仅支持连接协商期间回退至TCP,但不支持数据传输过程中的回退。

    协商和数据传输流如下图所示:

    image
  • 基于RDMA的共享内存通信

    完成协议协商并建立连接后,协议栈为SMC-R socket分配一块用于缓存待发送数据的环形缓冲区sndbuf和一块用于缓存待接收数据的环形缓冲区RMB(Remote Memory Buffer)。

    • 发送端应用程序通过socket接口将待发送数据拷贝到本侧sndbuf中,由SMC-R协议栈通过RDMA WRITE操作直接高效地写入对侧节点的RMB中。同时伴随着使用RDMA SEND/RECV操作交互连接数据管理消息,用于更新、同步环形缓冲区中的数据游标。

    • 接收端SMC-R协议栈感知到RMB中填入新数据后,通过epoll等方式告知接收端应用程序将RMB中的数据拷贝到用户态,完成数据传输。所以在SMC-R中,RMB充当传输过程中的共享内存。

    数据传输过程如下图所示:

    image

应用场景

基于SMC-R的高性能、透明替换等优势,适用于网络通信占比高的场景,该技术的典型应用场景示例如下:

  • 时延敏感的数据查询和处理

    Redis、Memcached、PostgreSQL等高性能数据查询与处理的场景,对网络性能有极高的要求。SMC-R为应用提供无侵入式透明替换TCP协议栈的能力,无需应用二次开发和适配,即可为应用提供最高50%的QPS(Queries Per Second)提升。

  • 高吞吐的数据传输

    集群内的大规模数据交互与传输,往往需要占用大量的带宽和CPU资源。得益于RDMA技术带来的远程内存直接访问,SMC-R在相同的吞吐性能下,CPU资源使用显著低于TCP协议栈,为应用节省更多的计算资源。

说明
  • SMC-R握手涉及到RDMA资源创建和申请,所以对于频繁建立、销毁连接(短链接)场景没有收益。

  • SMC-R支持的连接规模受限于如下资源:

    • 实例可用的物理内存大小。每个SMC-R socket所用的收发缓冲区sndbuf和RMB默认使用物理连续内存,在SMC-R连接建立时分配,大小默认为当前net.smc.wmem和net.smc.rmem值。查看方式:

      sysctl net.smc.wmem        # 每个SMC-R socket sndbuf默认大小,单位:字节
      sysctl net.smc.rmem        # 每个SMC-R socket RMB默认大小,单位:字节
    • ERI eRDMA规格。SMC-R为连接创建的RDMA资源(例如QP、MR、CQ、PD等)上限由实例ERI eRDMA规格决定。更多信息,请参见在企业级实例上配置eRDMA

    当SMC-R无法获取到所需资源时将会安全回退到TCP协议,确保数据传输稳定可靠。

使用说明

Alibaba Cloud Linux 3提供并优化了SMC-R内核协议栈,配合SMC-R状态监控和故障诊断工具,您可以通过以下步骤使用SMC-R:

  1. 创建支持ERI的ECS实例。

    SMC-R基于RDMA实现,因此使用SMC-R前需要创建支持ERI功能的ECS实例,以获得云上RDMA能力。具体操作,请参见在企业级实例上配置eRDMA

    重要

    阿里云ERI eRDMA设备与SMC目前均不支持使用IPv6地址。如果应用层使用IPv6地址,会导致SMC回退到TCP协议栈。

  2. 执行以下命令,加载smcsmc_diag内核模块。

    modprobe smc
    modprobe smc_diag

    您可以执行dmesg命令查看内核打印信息。如果看到如下信息,说明加载成功。

    smc: smc: load SMC module with reserve_mode
    NET: Registered protocol family 43
    smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB
    smc: adding ib device erdma_0 with port count 1
    smc:    ib device erdma_0 port 1 has pnetid
    说明

    由于SMC支持ERI eRDMA方式的特殊性,自ANCK 5.10.134-015内核版本起,SMC内核模块加载时将尝试占用当前可访问ERI设备的net namespace中65500~65515共16个socket端口,用于RDMA带外(OOB)建连。如果端口占用失败将无法在SMC模块中使用ERI eRDMA设备(但仍可以加载SMC模块)。卸载SMC模块时将自动解除端口占用。

    • 查看内核版本:

      uname -r
    • SMC模块加载时因端口占用失败而无法使用ERI eRDMA设备的dmesg警告信息:

      smc: smc: load SMC module with reserve_mode
      NET: Registered protocol family 43
      warning: smc: netns <netns ID> reserved ports <占用失败的端口号> FAIL for eRDMA OOB
    • 卸载SMC模块:

      rmmod smc_diag
      rmmod smc
    • 卸载模块时的打印信息:

      NET: Unregistered protocol family 43
      smc: removing ib device erdma_0
      smc: netns <netns ID> released ports [65500 ~ 65515] used by eRDMA OOB
  3. 执行以下命令,安装SMC的运维工具集smc-tools。

    yum install -y smc-tools
  4. (可选)设置收发缓冲区默认大小。

    技术架构:基于RDMA的共享内存通信中所述,SMC-R协议栈会为每个SMC-R socket分配一块用于缓存待发送数据的环形缓冲区sndbuf和一块用于缓存待接收数据的环形缓冲区RMB。SMC-R中sndbuf与RMB概念可类比于TCP协议中的send buffer与receive buffer,有效值范围为16 KB到512 KB。

    对于注重吞吐性能的网络模型可以通过下述方式调整SMC-R socket sndbuf和RMB的默认大小,以获得最佳的SMC-R网络加速效果。

    Alibaba Cloud Linux 3提供了sysctl net.smc.wmem和sysctl net.smc.rmem来设置当前net namespace中所有新建SMC-R socket的sndbuf和RMB的默认大小,已建立连接的SMC-R socket的sndbuf和RMB不受影响。具体步骤为:

    sysctl net.smc.wmem=<sndbuf 指定值,以字节为单位>
    sysctl net.smc.rmem=<RMB 指定值,以字节为单位>

    sysctl net.smc.wmemsysctl net.smc.rmem的初始化值为 256 KB。

    除了上述设置SMC-R socket的sndbuf和RMB默认值的方法,应用程序还可以通过setsockopt()系统调用,在建立连接前设置SMC-R socket的SO_SNDBUF和SO_RCVBUF选项值,进而改变SMC-R socket所使用的sndbuf和RMB大小。

  5. 基于SMC协议栈运行TCP socket应用程序。

    Alibaba Cloud Linux 3支持两个维度的透明替换。具体说明如下:

    • net namespace维度透明替换

      Alibaba Cloud Linux 3提供了net namespace维度的协议透明替换功能,可以通过sysctl net.smc.tcp2smc将net namespace中所有符合如下条件的TCP socket替换为SMC socket。

      • family为AF_INET

      • type为SOCK_STREAM

      • protocol为IPPROTO_IP或IPPROTO_TCP

      替换过程如下图所示:

      image

      在net namespace维度开启透明替换的操作步骤如下:

      1. 执行以下命令,打开net namespace范围全局替换开关net.smc.tcp2smc。

        sysctl net.smc.tcp2smc=1

        默认情况下,sysctl net.smc.tcp2smc=0,处在关闭状态。

      2. 执行以下命令,在此net namespace中运行TCP socket应用程序。

        ./foo

        此时foo应用程序创建的TCP socket将被透明替换为SMC socket。通过SMC-R协议栈处理应用程序网络行为。如技术架构:自动协商和安全回退中所述,如果通信对端同样支持SMC-R协议并协商成功,则两端将基于RDMA网络完成数据传输,否则将安全回退使用TCP网络传输。

      3. 执行以下命令,关闭net namespace范围全局替换开关net.smc.tcp2smc。

        sysctl net.smc.tcp2smc=0
    • 进程维度透明替换

      Alibaba Cloud Linux 3还提供了进程维度的协议透明替换功能,该功能实现需要基于SMC-R的监控诊断工具smc-tools。smc-tools的安装操作,请参见安装smc-tools工具

      替换过程如下图所示:

      image

      使用smc-tools工具集中的脚本smc_run运行应用程序时,smc_run通过环境变量LD_PRELOAD将smc-tools工具集中的libsmc-preload.so定义为优先加载的动态库。

      libsmc-preload.so将把应用程序及其子进程中符合如下条件的TCP socket替换为SMC socket。

      • family为AF_INET

      • type为SOCK_STREAM

      • protocol为IPPROTO_IP或IPPROTO_TCP

    执行以下命令,指定TCP socket程序foo运行在SMC-R协议栈。

    smc_run ./foo

    此时foo应用程序创建的TCP socket将被透明替换为SMC socket。通过SMC-R协议栈处理应用程序网络行为。如技术架构:自动协商和安全回退中所述,如果通信对端同样支持SMC-R协议并协商成功,则两端将基于RDMA网络完成数据传输,否则将安全回退使用TCP网络传输。

监控诊断

在使用SMC过程中,您可以使用smc-tools工具监控和诊断SMC内核协议栈,了解和掌握SMC网络流量的各类指标,判断网络健康状况。更多信息,请参见共享内存通信(SMC)监控和诊断

常见问题

如果您在使用SMC过程中无法正常通信、遇到部分端口不可用等问题,您可以参考共享内存通信(SMC)常见问题进行解决。