阿里云Alibaba Cloud Linux 3操作系统增加了对SMC-R的支持,基于阿里云弹性RDMA技术,实现对TCP应用透明无损的替换,为内存数据库、RPC、大文件传输等场景提供相比TCP更好的性能。本文将为您介绍SMC-R及其使用方法。

背景信息

SMC-R是基于RDMA的共享内存通信(Shared Memory Communications over RDMA)的英文缩写,其实现依赖于RDMA。在了解SMC-R之前,您需要先了解什么是RDMA以及阿里云提供的弹性RDMA服务:

RDMA是一种旁路内核的远程内存直接访问技术,被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。RDMA支撑了阿里云ESSD云盘、PolarDB数据库等核心业务,并在双11等重大场景得到充分验证。

RDMA具有零拷贝、协议栈卸载的特点。RDMA将协议栈的实现下沉至RDMA网卡(RNIC),绕过内核直接访问远程内存中的数据。由于不经过操作系统内核协议栈,RDMA与传统TCP网络相比不仅节省了内核协议栈处理和数据拷贝所需的CPU资源,同时也提高了网络吞吐量、降低了网络通信时延。两者协议栈差异如下图所示:TCPIP vs RDMA工作原理图

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

然而,由于RDMA使用的IB verbs接口和常用的POSIX socket接口存在巨大的差异,普通的应用程序如果要用好RDMA,往往需要面临着大量的业务改造,高效的使用IB verbs接口仍存在较高的技术门槛。

因此,为了充分挖掘弹性RDMA的潜力,为云上用户提供更好的网络性能,Alibaba Cloud Linux 3提供并优化了SMC-R,同时增加了对弹性RDMA的支持。SMC-R是一种对应用提供标准的socket接口,而底层采用RDMA进行通信的技术。其在高效使用RDMA技术的同时,保留对标准TCP应用的兼容,使更多的应用无需做任何修改便能享受RDMA带来的技术红利。

技术架构

SMC-R技术架构说明如下:
  • 协议层级与透明替换
    SMC-R是一套完全兼容socket的可靠、流式的传输协议。SMC-R工作于内核空间,处于socket层和内核IB verbs层之间,向上支持常见的socket接口,向下使用IB verbs内核态接口配合RDMA驱动传输数据。Alibaba Cloud Linux 3提供了控制socket层协议族替换的工具,实现net namespace维度或单个应用维度下的TCP至SMC-R透明替换能力,您无需修改任何网络应用即可完成从TCP到SMC-R的转换,享受RDMA带来的网络性能提升。技术架构图如下所示:透明替换架构图
  • 自动协商和安全回退
    SMC-R具备自动协商、动态回退TCP的能力。SMC-R建立RDMA链路时,首先在内核中与通信对端建立TCP连接,在握手过程中使用特殊的TCP选项表明自身支持SMC-R,并确认对端同样支持SMC-R。
    • 若协商过程中确认两端均使用SMC-R,则SMC-R为用户态网络应用申请所需RDMA资源,包括准备RDMA异步通信模型所需的QP与CQ、创建发送数据缓冲区、创建接收数据缓冲区并将其注册为可被远程节点直接访问的远程内存缓冲区RMB(Remote Memory Buffer),完成RDMA链路的初始化。SMC-R将访问RMB所需的访问密钥以及起始地址封装成远程访问令牌(RToken)告知远程节点,作为其访问RMB的重要验证信息。
    • 若协商过程中发现收发两端其一无法支持SMC-R时,将触发SMC-R回退机制,使用协商时建立的TCP连接完成数据传输,以保障网络的稳定和可靠。
      说明 需要注意的是,SMC-R仅支持连接协商期间回退至TCP协议栈,但不支持数据传输过程中的回退。
    协商和数据传输流如下图所示:回退机制架构图
  • 环形内存和数据收发

    SMC-R实现高性能传输的关键在于高效的RDMA网络和环形共享内存结构。SMC-R使用RDMA WRITE单边操作的方式将网络应用传递至内核的数据直接高效地写入远程节点环形RMB中,并伴随着使用RDMA SEND/RECV双边操作的方式交互连接数据管理CDC(Connection Data Control)消息,用于更新、同步RMB中的数据游标(Cursor)。工作原理说明:

    针对一侧RMB,读者更新数据消费者游标(Consumer Cursor),标识即将读取的下一字节地址。为避免数据丢失,写者不会将数据写入超过消费者游标的RMB空间中。相似的,写者更新生产者游标(Producer Cursor),标识即将写入的下一字节地址,为确保数据的正确性,读者不会读取超过生产者游标的RMB空间中的内容。数据游标的更新与同步伴随着网络数据传输的始终,确保数据传输的安全与可靠。

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

核心优势

SMC-R的优势主要体现在以下几点:
  • 高性能
    得益于RDMA将数据面功能下沉至RNIC并旁路内核直接访问对端环形接收缓冲区,SMC-R相较于传统TCP协议栈在合适的场景下可获得更低的时延、更高的吞吐量,以及更小的CPU负载。详细说明如下:
    • 更轻薄的协议栈。
    • 使用RDMA进行通信,网络时延更低、CPU占用更少、吞吐量更高。
    • 高效可靠的远程环形缓冲区直接访问。
  • 透明替换
    SMC-R兼容POSIX socket接口,通过sysctl和用户态工具支持net namespace或单个应用维度下的TCP至SMC-R协议栈透明替换,在用户无修改的情况下完成新连接协议栈替换,无需额外的应用改造和开发成本。详细说明如下:
    • 兼容socket接口的RDMA RC传输,实现可靠的流式传输协议。
    • 自动协议协商和安全回退TCP机制。
    • net namespace和应用维度的协议栈无损透明替换。
    • 底层兼容弹性RDMA iWARP和RoCE网络。

应用场景

基于SMC-R的高性能、透明替换等优势,该技术的典型应用场景示例如下:
  • 时延敏感的数据查询和处理

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

  • 高吞吐的数据传输

    集群内的大规模数据交互与传输,往往需要占用大量的带宽和CPU资源。得益于SMC高效的通信模型,SMC-R在相同的吞吐性能下,CPU资源使用显著低于传统TCP,为应用节省更多的计算资源。

使用说明

Alibaba Cloud Linux 3提供丰富的SMC-R运维监控工具,向您提供完善的SMC-R状态监控和故障诊断功能。您可以通过下述步骤使用SMC-R:

  1. 加载SMC-R模块。
    SMC-R默认编译为内核模块,您可在系统中手动加载smc与smc_diag内核模块。命令说明如下:
    1. 加载smc内核模块。
      modprobe smc
    2. 加载smc_diag内核模块。
      modprobe smc_diag
  2. 开启透明替换。
    Alibaba Cloud Linux 3支持两个维度的透明替换。具体说明如下:
    • net namespace维度
      Alibaba Cloud Linux 3为您提供了将net namespace范围内所有新创建的TCP socket替换为SMC-R socket的功能。替换过程如下图所示:net namespace维度功能逻辑图在net namespace维度开启透明替换的操作说明如下:
      1. 运行以下命令,打开net namespace范围全局替换。
        sysctl net.smc.tcp2smc=1
        默认情况下,sysctl net.smc.tcp2smc=0。当sysctl net.smc.tcp2smc=1时,应用新创建的socket的协议族将由PF_INET/PF_INET6转变为AF_SMC,即从TCP socket转变为SMC-R socket。
      2. 运行应用。

        若对端同样执行步骤1中所述操作,则两端将使用SMC-R传输数据,否则将回退至TCP协议完成数据传输。协商过程的详细说明,请参见技术架构的自动协商和安全回退

      3. 运行以下命令,关闭net namespace范围全局替换。
        sysctl net.smc.tcp2smc=0
    • 应用维度
      Alibaba Cloud Linux 3还提供了应用维度的TCP替换为SMC-R功能。功能实现需要基于SMC-R的运维监控工具集smc-tools
      说明 smc-tools工具集的安装命令为yum install smc-tools -y。关于smc-tools工具集的更多信息,请参见下文的步骤3。
      利用smc-tools工具集中的脚本smc_run运行应用程序时,smc_run将使用LD_PRELOAD环境变量把smc-tools工具集中的libsmc-preload.so定义为优先加载的动态库。libsmc-preload.so将尝试把应用程序新创建的TCP socket替换为SMC-R socket。smc_run命令的使用说明如下:
      Usage: smc_run [ OPTIONS ] COMMAND
      
      Run COMMAND using SMC for TCP sockets
      例如,当您尝试使用SMC-R运行当前目录下的testApp应用程序时,需要运行以下命令:
      smc_run ./testApp
      与net namespace维度的透明替换类似,需要收发两端均使用smc_run将TCP透明替换至SMC-R,才能在两端间建立SMC-R连接,使用RDMA传输数据。
  3. 使用SMC-R的运维监控工具,对SMC-R进行监控。
    smc-tools工具集为您提供了多个维度的SMC-R跟踪诊断,主要包括:
    • smcr:提供SMC-R相关的linkgroup、device等信息。
    • smcss:提供活跃的SMC socket相关信息。
    1. 运行以下命令,安装SMC-R的运维监控工具集smc-tools
      yum install smc-tools -y
    2. 使用smcr
      smcr用于显示SMC-R linkgroup、device等信息。
      命令说明如下:
      Usage: smcr  [ OPTIONS ] OBJECT {COMMAND | help}
      OBJECT : { linkgroup | device }
              linkgroup
                  Linkgroup(s) or link(s) used by SMC-R.
              device
                  One or more SMC-R devices.
      OPTIONS : {-v[ersion] | -d[etails] | -dd[etails]}
              -v, -version
                  Print the version of the smcr utility and exit.
              -d, -details
                  Print detailed information.
              -dd, -ddetails
                  Print more detailed information.
      使用示例:
      • 您可以运行以下命令,查看支持SMC-R的设备。
        smcr device
        返回结果示例:
        Net-Dev         IB-Dev   IB-P  IB-State  Type          Crit  #Links  PNET-ID
        eth0            erdma_01    1    ACTIVE  0x7ffd          No       0
      • 您可以运行以下命令,查看SMC-R linkgroup的信息。
        smcr linkgroup
        返回结果示例:
        LG-ID    LG-Role  LG-Type  VLAN  #Conns  PNET-ID
        00000100 CLNT     SINGLE      0       1
    3. 使用smcss
      smcss用于显示SMC-R相关socket的详细信息。
      命令说明如下:
      Usage: smcss [ OPTIONS ]
      OPTIONS :
             (none)
                    displays a list of connecting, closing, or connected SMC sockets with basic information.
             -a, --all
                    displays all types of SMC sockets: listening, opening, closing, and connected.
             -l, --listening
                    shows listening sockets only. These are omitted by default.
             -d, --debug
                    displays additional debug information, such as shutdown state.
             -D, --smcd
                    displays additional SMC-D specific information. Shows SMC-D sockets only.
             -h, --help
                    displays usage information.
             -R, --smcr
                    displays additional SMC-R specific information. Shows SMC-R sockets only.
             -v, --version
                    displays program version.
             -W, --wide
                    do not truncate IP addresses.
      使用示例:
      您可以运行以下命令,查看所有的SMC-R sockets的详细信息。
      smcss -a -R -d
      返回结果示例:
      State          UID   Inode   Local Address           Peer Address            Intf Mode Shutd Token    Sndbuf   Rcvbuf   Peerbuf  rxprod-Cursor rxcons-Cursor rxFlags txprod-Cursor txcons-Cursor txFlags txprep-Cursor txsent-Cursor txfin-Cursor  Role IB-device       Port Linkid GID                                      Peer-GID
      ACTIVE         00000 1105985880 192.168.XX.XX:49080    192.168.XX.XX:10003    0000 SMCR  <->  00000001 00020000 00040000 00040000 0001:00026256 0001:00026256 00:00   0001:00026264 0001:00026256 00:00   0003:00006264 0003:00006264 0003:00006264 CLNT erdma_012211    01   01     0016:3e01:2211:0000:0000:0000:0000:0000  0016:3e01:43b4:0000:0000:0000:0000:0000