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资源,进而提高网络吞吐、降低网络时延。两者协议栈差异如下图所示:
因此,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实体。技术架构如下图所示:
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,但不支持数据传输过程中的回退。
协商和数据传输流如下图所示:
基于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充当传输过程中的共享内存。
数据传输过程如下图所示:
应用场景
基于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:
创建支持ERI的ECS实例。
SMC-R基于RDMA实现,因此使用SMC-R前需要创建支持ERI功能的ECS实例,以获得云上RDMA能力。具体操作,请参见在企业级实例上配置eRDMA。
重要阿里云ERI eRDMA设备与SMC目前均不支持使用IPv6地址。如果应用层使用IPv6地址,会导致SMC回退到TCP协议栈。
执行以下命令,加载
smc
和smc_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
执行以下命令,安装SMC的运维工具集smc-tools。
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
的初始化值为 256 KB。除了上述设置SMC-R socket的sndbuf和RMB默认值的方法,应用程序还可以通过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替换为SMC socket。family为AF_INET
type为SOCK_STREAM
protocol为IPPROTO_IP或IPPROTO_TCP
替换过程如下图所示:
在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替换为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)常见问题进行解决。