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应用透明无损的替换,提供高性能、普惠的硬件卸载网络。

因此,RDMA被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。
过去,RDMA只能在一些数据中心网络中通过网卡和交换机紧密配合使用,部署复杂度高。如今,阿里云弹性RDMA将复杂的RDMA技术带到云上,使普通的ECS用户也能使用高性能的RDMA传输,无需关心底层复杂的网卡、交换机等物理网络环境配置,使其成为一种亲民、普惠的技术。
但是,由于RDMA技术基于IB verbs接口,相较于常用的POSIX socket接口存在巨大的差异。现有socket应用程序迁移至RDMA网络往往面临着大量的改造,使用RDMA技术仍存在较高的技术门槛。
因此,为了充分挖掘弹性RDMA的潜力,为云上用户提供更好的网络性能,Alibaba Cloud Linux 3提供并优化了SMC-R。在高效使用RDMA技术的同时,保留对标准TCP应用的兼容,使更多的应用无需修改便能享受RDMA所带来的性能红利。
核心优势
- 高性能得益于RDMA技术将网络协议栈从内核卸载至硬件网卡,SMC-R相较于传统TCP协议栈在合适的场景下可获得更低的时延、更高的吞吐量,以及更小的CPU负载。
- 硬件卸载。
- 更低的网络时延、更高的吞吐、更少的CPU占用率。
- 高效可靠的远程内存直接访问。
- 透明替换得益于SMC-R对POSIX socket接口的兼容以及协议栈透明替换能力,socket应用程序可以在无修改的情况下完成TCP协议栈到SMC-R协议栈的切换,无需额外的应用改造和开发成本。
- 兼容socket接口的共享内存通信。
- 多维度协议栈无损透明替换。
- 自动协议协商和安全回退机制。
技术架构
- 协议层次与透明替换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充当传输过程中的共享内存。
数据传输过程如下图所示:
应用场景
- 时延敏感的数据查询和处理
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协议,确保数据传输稳定可靠。
- 实例可用连续物理内存。每个SMC-R socket所用的收发缓冲区sndbuf和RMB默认使用物理连续内存,在SMC-R连接建立时分配,大小默认为当前net.smc.wmem和net.smc.rmem值。查看方式:
使用说明
- 创建支持ERI的ECS实例。SMC-R基于RDMA实现,因此使用SMC-R前需要创建支持ERI功能的ECS实例,以获得云上RDMA能力。具体操作,请参见eRDMA使用方法介绍。重要 阿里云ERI eRDMA设备目前不支持IPv6地址,如果应用层未指定网络层协议或者指定使用IPv6地址,会导致连接建链失败。
- 运行以下命令,加载SMC模块。
- 加载SMC模块前,需先关闭本机的IPv6模式,确保ERI下可以正常创建RDMA连接。
sysctl net.ipv6.conf.all.disable_ipv6=1 sysctl net.ipv6.conf.default.disable_ipv6=1
- 加载
smc
和smc_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
卸载SMC模块方式:rmmod smc_diag rmmod smc
自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模块前,需先关闭本机的IPv6模式,确保ERI下可以正常创建RDMA连接。
- 运行以下命令,安装SMC的监控诊断工具集smc-tools。smc-tools是IBM开发的SMC-R监控诊断工具,拥有丰富的运维诊断功能。
yum install -y smc-tools
- 可选:设置收发缓冲区默认大小。如技术架构:基于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.wmem
和sysctl 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大小。
- 基于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
- family为AF_SMC
- type为SOCK_STREAM
- protocol为SMCPROTO_SMC
替换过程如下图所示:在net namespace维度开启透明替换的操作步骤如下:- 运行以下命令,打开net namespace范围全局替换开关net.smc.tcp2smc。
默认情况下,sysctl net.smc.tcp2smc=1
sysctl net.smc.tcp2smc=0
,处在关闭状态。 - 运行以下命令,在此net namespace中运行TCP socket应用程序。
./foo
此时foo应用程序创建的TCP socket将被透明替换为SMC socket。通过SMC-R协议栈处理应用程序网络行为。如技术架构:自动协商和安全回退中所述,如果通信对端同样支持SMC-R协议并协商成功,则两端将基于RDMA网络完成数据传输,否则将安全回退使用TCP网络传输。
- 运行以下命令,关闭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网络传输。
- net namespace维度透明替换
- 跟踪诊断SMC-R连接与RDMA资源。smc-tools工具集为您提供了多个维度的SMC-R跟踪诊断,主要包括:
- smcr:提供SMC-R相关资源统计信息。
- smcss:提供SMC socket相关信息。