文档

共享内存通信(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网络传输。

  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            erdma_0     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 1894397 172.16.14.xxx:45346     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1898550 172.16.14.xxx:45354     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1894399 172.16.14.xxx:45362     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1898552 172.16.14.xxx:45378     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1898554 172.16.14.xxx:45392     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1895027 172.16.14.xxx:45400     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1897069 172.16.14.xxx:45412     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
        ACTIVE         00000 1895852 172.16.14.xxx:45426     172.16.14.xxx:80        0000 SMCR CLNT erdma_0         01   01     0000:0000:0000:0000:0000:ffff:ac10:xxxx  0000:0000:0000:0000:0000:ffff:ac10:xxxx
      • 执行以下命令,查看所有SMC socket信息,包括协议协商失败安全回退到TCP的SMC socket。

        smcss -a

        返回结果示例:

        State          UID   Inode   Local Address           Peer Address            Intf Mode
        ACTIVE         00000 1903782 172.16.14.xxx:42232     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1898075 172.16.14.xxx:42236     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1900819 172.16.14.xxx:42242     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1900821 172.16.14.xxx:42244     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1898077 172.16.14.xxx:42260     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1902717 172.16.14.xxx:42270     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1893237 172.16.14.xxx:42276     172.16.14.xxx:80        0000 TCP 0x03010000
        ACTIVE         00000 1902719 172.16.14.xxx:42292     172.16.14.xxx:80        0000 TCP 0x03010000

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

相关文档

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

  • 本页导读 (1)
文档反馈