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并持续维护至今,其协议标准可参考RFC 7609。Alibaba Cloud Linux 3操作系统基于阿里云弹性RDMA(elastic RDMA,简称eRDMA)技术首次将SMC-R带上云上场景,实现对TCP应用透明无损的替换,提供高性能、普惠的硬件卸载网络。

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

因此,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负载。
    • 硬件卸载。
    • 更低的网络时延、更高的吞吐、更少的CPU占用率。
    • 高效可靠的远程内存直接访问。
  • 透明替换
    得益于SMC-R对POSIX socket接口的兼容以及协议栈透明替换能力,socket应用程序可以在无修改的情况下完成TCP协议栈到SMC-R协议栈的切换,无需额外的应用改造和开发成本。
    • 兼容socket接口的共享内存通信。
    • 多维度协议栈无损透明替换。
    • 自动协议协商和安全回退机制。

技术架构

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

    Alibaba Cloud Linux 3提供了进程或net namespace维度的TCP至SMC-R协议栈透明替换机制。通过LD_PRELOAD或sysctl net.smc.tcp2smc将应用程序原本的AF_INET协议族socket透明替换为AF_SMC协议族socket,让网络传输运行于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协议栈,但不支持数据传输过程中的回退。
    协商和数据传输流如下图所示:自动协商和安全回退
  • 基于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充当传输过程中的共享内存。
    数据传输过程如下图所示:基于RDMA的共享内存通信

应用场景

基于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:
重要 Alibaba Cloud Linux 3中SMC协议栈处于公测阶段,暂不提供SLA保证。
  1. 创建支持ERI的ECS实例。
    SMC-R基于RDMA实现,因此使用SMC-R前需要创建支持ERI功能的ECS实例,以获得云上RDMA能力。具体操作,请参见eRDMA使用方法介绍
    重要 阿里云ERI eRDMA设备目前不支持IPv6地址,如果应用层未指定网络层协议或者指定使用IPv6地址,会导致连接建链失败。
  2. 运行以下命令,加载SMC模块。
    1. 加载SMC模块前,需先关闭本机的IPv6模式,确保ERI下可以正常创建RDMA连接。
      sysctl net.ipv6.conf.all.disable_ipv6=0
      sysctl net.ipv6.conf.default.disable_ipv6=0
    2. 加载smcsmc_diag内核模块。
      modprobe smc
      modprobe smc_diag
    您可以运行dmesg命令查看内核打印信息。如果看到如下信息,说明加载成功。
    NET: Registered protocol family 43
    smc: adding ib device iwp0s7 with port count 1
    smc:    ib device iwp0s7 port 1 has pnetid
    说明 由于SMC-R+ERI eRDMA实现方式的特殊性,自5.10.134-13版本起,加载SMC模块时将尝试占用当前可访问ERI的net namespace中33800~33815共16个socket端口,用于RDMA带外(OOB)建连。如果端口占用失败将无法加载SMC模块。卸载SMC模块时将解除端口占用。
    内核版本查看方式:
    uname -r

    自5.10.134-13内核版本起,加载与卸载SMC模块时dmesg打印信息更新为:

    • 加载模块时的打印信息
      NET: Registered protocol family 43
      smc: netns ffffffff912dcf40 reserved ports for eRDMA OOB    (5.10.134-13版本起新增)
      smc: adding ib device iwp0s7 with port count 1
      smc:    ib device iwp0s7 port 1 has pnetid
    • 卸载模块时的打印信息
      NET: Unregistered protocol family 43
      smc: removing ib device iwp0s7
      smc: netns ffffffff9d2dcf40 released ports used by eRDMA OOB     (5.10.134-13版本起新增)
      您可以通过以下命令,卸载SMC模块:
      rmmod smc_diag
      rmmod smc
  3. 运行以下命令,安装SMC的监控诊断工具集smc-tools。
    smc-tools是IBM开发的SMC-R监控诊断工具,拥有丰富的运维诊断功能。
    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的初始化值继承自SMC模块加载时当前net namespace的sysctl net.ipv4.tcp_wmem[1]和sysctl net.ipv4.tcp_rmem[1]值。

    除了上述设置SMC-R socket sndbuf和RMB默认值的方法外,当应用程序的socket通过步骤5所述方式运行在SMC-R协议栈上后,应用程序还可以通过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:
      • family为AF_INET
      • type为SOCK_STREAM
      • protocol为IPPROTO_IP或IPPROTO_TCP
      替换为如下SMC socket:
      • family为AF_SMC
      • type为SOCK_STREAM
      • protocol为SMCPROTO_SMC
      替换过程如下图所示:透明替换
      在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工具

      替换过程如下图所示:进程维度透明替换

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

      libsmc-preload.so将把应用程序及其子进程中符合如下条件的TCP socket:
      • family为AF_INET
      • type为SOCK_STREAM
      • protocol为IPPROTO_IP或IPPROTO_TCP
      替换为如下SMC socket:
      • family为AF_SMC
      • type为SOCK_STREAM
      • protocol为SMCPROTO_SMC
    运行以下命令,指定TCP socket程序foo运行在SMC-R协议栈。
    smc_run ./foo

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

  6. 跟踪诊断SMC-R连接与RDMA资源。
    smc-tools工具集为您提供了多个维度的SMC-R跟踪诊断,主要包括:
    • smcr:提供SMC-R相关资源统计信息。
    • smcss:提供SMC socket相关信息。
    1. 使用smcr
      smcr用于显示SMC-R所用RDMA设备、链路等信息。
      使用示例:
      • 运行以下命令,查看smcr指令manual。
        man smcr
      • 运行以下命令,查看SMC-R可用设备。
        smcr device
        返回结果示例:
        Net-Dev         IB-Dev   IB-P  IB-State  Type          Crit  #Links  PNET-ID
        eth0            iwp0s7      1    ACTIVE  0x107f          No       0
      • 运行以下命令,查看SMC-R所用的RDMA链路信息。
        smcr l
        返回结果示例:
        LG-ID    LG-Role  LG-Type  VLAN  #Conns  PNET-ID
        00000100 CLNT     SINGLE      0      32
        00000200 CLNT     SINGLE      0      32
        00000300 CLNT     SINGLE      0      32
        00000400 CLNT     SINGLE      0      32
        00000500 CLNT     SINGLE      0      32
        00000600 CLNT     SINGLE      0      32
        00000700 CLNT     SINGLE      0       8
        以上述信息为例,说明此时客户端SMC-R协议栈共创建了7条RDMA链路,前6条RDMA链路承载32条连接,最后1条RDMA链路承载8条连接。
      • 运行以下命令,查看各类统计信息,包括连接统计、回退统计、发送统计、接收统计、内存使用统计等。
        smcr -dd stats
        返回结果示例:
        SMC-R Connections Summary
          Total connections handled           509
          SMC connections                     509 (client 0, server 509)
            v1                                509
            v2                                  0
          Handshake errors                      0 (client 0, server 0)
          Avg requests per SMC conn       1603405.0
          TCP fallback                          0 (client 0, server 0)
        
        RX Stats
          Data transmitted (Bytes)    17954924988 (17.95G)
          Total requests                408066678
          Buffer full                           0 (0.00%)
          Buffer downgrades                     0
          Buffer reuses                       308
                    8KB    16KB    32KB    64KB   128KB   256KB   512KB  >512KB
          Bufs        0       0       0       0       0     509       0       0
          Reqs   408.1M       0       0       0       0       0       0       0
        TX Stats
          Data transmitted (Bytes)    70595498981 (70.60G)
          Total requests                408066477
          Buffer full                           0 (0.00%)
          Buffer full (remote)                  0 (0.00%)
          Buffer too small                      0 (0.00%)
          Buffer too small (remote)             0 (0.00%)
          Buffer downgrades                     0
          Buffer reuses                       308
                    8KB    16KB    32KB    64KB   128KB   256KB   512KB  >512KB
          Bufs        0       0       0       0     509       0       0       0
          Reqs   408.1M       0       0       0       0       0       0       0
        
        Extras
          Special socket calls                508
            cork                                0
            nodelay                           508
            sendpage                            0
            splice                              0
            urgent data                         0
    2. 使用smcss
      smcss用于显示SMC-R相关socket的详细信息。
      使用示例:
      • 运行以下命令,查看smcss manual。
        man smcss
      • 运行以下命令,查看当前所有的SMC-R sockets的详细信息。
        smcss -R
        返回结果示例:
        State          UID   Inode   Local Address           Peer Address            Intf Mode Role IB-device       Port Linkid GID                                      Peer-GID
        ACTIVE         00000 0141987 192.168.99.21:33144     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
        ACTIVE         00000 0141989 192.168.99.21:33148     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
        ACTIVE         00000 0141991 192.168.99.21:33164     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
        ACTIVE         00000 0141993 192.168.99.21:33168     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
        ACTIVE         00000 0141995 192.168.99.21:33174     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
        ACTIVE         00000 0141997 192.168.99.21:33178     192.168.99.22:8090      0000 SMCR CLNT iwp0s7          01   01     0016:3e08:8b8b:0000:0000:0000:0000:0000  0016:3e10:3fb4:0000:0000:0000:0000:0000
      • 运行以下命令,查看所有SMC socket信息,包括协议协商失败安全回退到TCP的SMC socket。
        smcss -a
        返回结果示例:
        State          UID   Inode   Local Address           Peer Address            Intf Mode
        ACTIVE         00000 0156721 192.168.99.21:60188     192.168.99.22:8090      0000 TCP 0x03010000
        ACTIVE         00000 0156723 192.168.99.21:60194     192.168.99.22:8090      0000 TCP 0x03010000
        ACTIVE         00000 0156725 192.168.99.21:60204     192.168.99.22:8090      0000 TCP 0x03010000
        ACTIVE         00000 0156727 192.168.99.21:60206     192.168.99.22:8090      0000 TCP 0x03010000
        ACTIVE         00000 0156729 192.168.99.21:60214     192.168.99.22:8090      0000 TCP 0x03010000

        回退到TCP协议的连接其Mode列中标识了TCP字样,同时记录了回退原因编号,如上述示例中的0x03010000。回退原因编号的具体含义以及回退的解决方法请参见启用SMC后回退无法使用RDMA加速