SMC常见问题
本文将为您介绍在使用SMC过程中的一些常见问题及解决方案。
Alibaba Cloud Linux 3中SMC协议栈处于公测阶段,暂不提供SLA保证。
启用SMC后应用性能对比TCP没有提升
问题描述
使用SMC加速应用TCP连接之后,应用的性能对比直接使用TCP并没有提升。
问题原因及解决方案
由于某些原因,导致应用创建的SMC连接回退到TCP,此时无法使用RDMA加速网络通信。详细的回退排查和解决方法,请参见启用SMC后回退无法使用RDMA加速。
应用的网络通信开销在整个应用中占比较小。例如应用是倾向于CPU密集型,网络通信在应用中占比较低。
应用的网络通信模型不适用SMC。例如:
频繁建立、销毁连接(短链接)的场景。SMC创建连接涉及到RDMA资源创建和申请等慢速路径,根据不同应用短连接的占比,性能对比TCP可能没有收益。
资源受限的场景。SMC通信所使用的资源受限于机器内存和eRDMA网卡规格,资源不足可能导致SMC回退到TCP。更多信息,请参见SMC使用说明。
启用SMC后无法正常通信
问题描述
使用Alibaba Cloud Linux 3开启SMC-R之后,访问某些地址(例如内网OSS地址)不通,但是可以ping通。关闭SMC-R之后恢复正常。
问题原因
某些服务在处理TCP options时,例如网关或者反向代理服务器时,SMC通过TCP握手时所携带的SMC TCP options可能会被重放或者丢弃,对端误认SMC能力支持,导致请求(例如curl)失败,而ping(ICMP协议)正常。经过验证,互联网中的服务仅存在少数服务异常,大多数服务可以正常建连。
解决方案
对于丢弃SMC TCP options的问题,建议不替换该连接为SMC。对于重放SMC TCP options的问题,请通过下面方法来解决。
通过
uname -r
命令检查当前系统安装的内核版本。如果是5.10.134-12.2版本或高于该版本,直接执行下一步。
如果低于5.10.134-12.2版本,升级内核版本到5.10.134-12.2。
运行
yum install kernel-5.10.134-12.2.al8
命令升级内核。重启ECS实例。
载入SMC模块(modprobe smc)并打开配置。
载入SMC模块。具体操作,请参见使用说明。
运行
sysctl net.smc.sysctl_smc_experiments=1
命令打开配置。说明如需持久化该配置,将
net.smc.sysctl_smc_experiments=1
添加到/etc/sysctl.conf
中。
重新启用SMC,并验证通信两端能否正常通信。
启用SMC后导致部分端口不可用
问题描述
加载SMC后,33800后的16个端口(即33800~33815)不可用,bind(2)这些端口会导致返回EADDRINUSE
。
问题原因
由于SMC-R+eRDMA实现方式的特殊性,SMC-R模块将会占用ERI所在net namespace下33800开始的16 个端口作为OOB建连的预留端口,如果端口占用失败则SMC模块加载失败。
解决方案
卸载SMC模块后将会释放这些端口。卸载方法请参见使用说明。
启用SMC后回退无法使用RDMA加速
问题描述
启用SMC并替换应用的TCP连接,此时运行smcss -a
命令可以看到建立的连接已经自动回退(fallback)到TCP。
问题原因
SMC建立连接时,如果发生异常会自动回退到TCP连接,此时SMC连接仍然可以正常通信,但是无法享受RDMA带来的性能提升。SMC发生回退时会提供回退原因编号,根据回退编号可以帮助分析和定位问题。
解决方案
运行
smcss -a
命令,查看SMC连接的回退编号。返回结果示例:
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 1202539 172.16.4.189:44780 172.16.4.190:1811 0000 SMCR
其中第一条记录Mode列为TCP,意味着该SMC连接回退到TCP,同时回退编号为0x03010000。第二条记录Mode列为SMCR,则说明已经正常建立SMC-R连接。如果Mode列显示的回退编号为两个(例如0x05000000/0x03030001),其中第一个回退编号为本地的回退原因,第二个回退编号为对端的回退原因,通常是由于对端回退导致了本机无法正常建立SMC连接而回退。
根据回退编号,从下表中查看可能的原因和解决方案。
回退原因编号
说明
可能原因和解决方案
0x01010000
机器内存不足,导致资源创建失败。
原因:机器的空余内存不足,不足以创建SMC建立连接所需要的数据结构和读写内存。
解决方案:释放机器的内存,例如停止不必要的进程。
0x02010000
通过CLC或者LLC握手时,等待RDMA链路确认超时。
原因1:RDMA网卡或者链路发生故障,导致LLC连接(通过RDMA链路通信)消息回复超时。
解决方案1:确认RDMA网卡的状态是否正常。
原因2:以太网卡或者TCP/IP网络发生故障或者异常,导致CLC连接(通过TCP连接通信)消息回复超时。
解决方案2:确认以太网卡的状态是否正常。
0x02020000
通过LLC创建link超时。
预留字段,当前未使用。
0x03000000
配置错误,无法获取正确的IP地址。
原因:建立连接时,构建proposal时获取CLC socket对应的IP地址失败。
解决方案:检查当前CLC连接(基于TCP协议)和所对应的设备是否正常后重试。
0x03010000
对端不支持或未使用SMC。
原因:如果支持SMC协议,将会在建立连接时的CLC连接(基于TCP协议)的SYN(客户端)或SYNACK(服务端)报文头中携带SMC TCP option标志位。
解决方案:检测本地或者对端是否已将应用的协议栈替换为SMC,通过 smcss命令(smc-tools包提供)可查看当前SMC的连接状态。如果没有找到应用的连接和端口,请重新替换为SMC并创建新的连接。
0x03020000
不支持IPSec。
原因:替换的连接使用IPSec,但是当前SMC并不支持IPSec。
解决方案:不使用IPSec。
0x03030000
未找到可用的SMC-D或SMC-R设备。
原因1:SMC建立连接使用时,未找到可用的SMC-R(RDMA)设备。
解决方案1:执行
smcr d
命令,检查当前是否有SMC-R(RDMA)设备。如果没有返回任何设备,在使用阿里云eRDMA的场景下,请检查ECS控制台是否正确配置ERI设备,并确保操作系统中正确安装ERI的驱动。
原因2:在当前的SMC PNET中找不到对应的SMC-R(RDMA)设备。
解决方案2:执行
smcr d
命令,检查当前是否有SMC-R(RDMA)设备。如果有,请检查该设备的PNET-ID,并执行smc_pnet
列出当前的netns中所有的PNET,检查设备所在的PNET项目中的以太网卡名、RDMA设备和建立连接时所对应的设备是否一致,如果不一致,请重新修改PNET配置。
原因3:如果启用RDMA设备的独占模式,SMC只会在当前创建socket的net namespace中寻找RDMA设备。
解决方案3:执行
rdma system
命令,如果返回的结果中包含netns exclusive
则说明为独占模式。如果需要在某个netns中使用该RDMA设备,请执行命令rdma dev set <RDMA 设备名> netns <NETNS 名>
,将RDMA设备移至该netns。如果RDMA设备为RoCE和iWARP,请将所需的以太网设备也一并移动到该netns。
0x03030001
未找到可用的SMC-D设备。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x03030002
未找到可用的SMC-R设备。
原因1:SMC创建连接过程中,已经选中的RDMA设备失效。
解决方案1:执行
smcr d
命令,检查当前系统中是否有可用的 SMC-R(RDMA)设备,如果所需的RDMA设备为阿里云eRDMA设备,请确保该ERI设备已经在ECS控制台中添加并正确安装和配置ERI驱动。
原因2:在当前的SMC PNET中找不到对应的SMC-R(RDMA)设备。
解决方案2:执行
smcr d
命令,检查当前是否有SMC-R(RDMA)设备。如果有,请检查该设备的PNET-ID,并执行smc_pnet
列出当前的netns中所有的PNET,检查设备所在的PNET项目中的以太网卡名、RDMA设备和建立连接时所对应的设备是否一致,如果不一致,请重新修改PNET配置。
原因3:如果启用RDMA设备的独占模式,SMC只会在当前创建socket的net namespace中寻找RDMA设备。
解决方案3:执行
rdma system
命令,如果返回的结果中包含netns exclusive
则说明为独占模式。如果需要在某个netns中使用该RDMA设备,请执行命令rdma dev set <RDMA 设备名> netns <NETNS 名>
,将RDMA设备移至该netns。如果RDMA设备为RoCE和iWARP,请将所需的以太网设备也一并移动到该netns。
0x03030003
SMC-D设备不支持ISMv2协议。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x03030004
对端不支持SMCv2协议的拓展。
原因:本地启用了SMC v2协议,但对端不支持SMC v2协议。SMC协议栈通过底层设备能力自动选择使用SMC或SMC v2协议。在使用阿里云eRDMA和RoCE的场景下,均为SMC协议。在使用RoCE v2的场景下,将使用SMC v2协议。
解决方案:保证通信两端所有RDMA设备类型相同,则两端SMC协议版本相同。可通过
smcr d
查看SMC-R所用设备,在type
一栏中可以看到设备类型,如RoCE_Express、RoCE_Express2、或0x107f(即阿里云eRDMA)。
0x03030005
对端不支持SMC-Dv2协议的拓展。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x03030006
对端缺失SEID。
预留字段,当前未使用。
0x03030007
未找到可用的SMC-D v2设备。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x03030008
对端缺少UEID。
原因:启用了SMC v2协议,但没有设置UEID。
解决方案:两个思路,一是将通信两端运行于SMC协议,底层RDMA设备使用阿里云ERDMA或RoCE (非RoCE v2) 时将自动运行于SMC 协议;二是仍然使用SMC v2,但SMC-R v2要求通信两侧拥有相同的UEID,可通过smc-tools设置相同的UEID,指令为
smcr ueid {show | add | del}
。
0x03040000
本地和对端的SMC设备模式不匹配 (SMC-D 或 SMC-R)。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x03050000
对端RMBE中包含eyecatcher非法字段。
预留字段,Linux实现中未使用。
0x03060000
连接使用了不支持MSG_FASTOPEN。
原因:SMC暂不支持MSG_FASTOPEN选项。
解决方案:创建socket时移除MSG_FASTOPEN选项。
0x03070000
本地和对端的IP前缀/子网不匹配。
原因:关闭sysctl net.smc.allow_different_subnet后,SMC会检查本地和对端是否在同一个子网。
解决方案:如果不需要子网检查,请重新启用sysctl net.smc.allow_different_subnet(设置为1为启用,默认已启用)。
0x03080000
获取设备VLAN ID失败。
原因:创建连接时,SMC会尝试获取socket对应设备的VLAN ID。
解决方案:检查该五元组创建的TCP连接和对应的以太网设备是否正常。
0x03090000
ISM设备注册VLAN ID失败。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x030a0000
LGR中无可用SMC-R RDMA链路。
原因:创建连接时,将会为每一个连接指定一个该连接所属LGR的link,如果没有可用的link,则无法使用RDMA加速。
解决方案:执行
smcr d
命令,检查ECS的RDMA卡是否正常。如果所需的RDMA设备为阿里云eRDMA设备,请确保该ERI设备已经在ECS控制台中添加并正确安装和配置ERI驱动。
0x030b0000
客户端找不到服务端提供的RDMA链路。
原因:客户端创建连接时,根据服务端提供的QPN、GID和MAC等信息寻找对应的link并创建连接,如果找不到正确的RDMA link则无法使用RDMA加速。
解决方案:执行
smcr d
命令,检查ECS的RDMA卡是否正常。如果所需的RDMA设备为阿里云eRDMA设备,请确保该ERI设备已经在ECS控制台中添加并正确安装和配置ERI驱动。
0x030c0000
本地和对端的SMC版本不匹配。
预留字段,当前未使用。
0x030d0000
SMC-D DMB数量超越上限。
当前云场景暂未提供可用的SMC-D设备,如出现该错误请联系阿里云技术支持。
0x030e0000
SMC-R v2连接对端不可达。
原因:建连过程中,SMCv2协议中,客户端需要根据服务端提供的地址寻找正确的路由信息,当前无法根据本地和远端IP地址找到对应的路由项。
解决方案:检查该五元组创建的TCP连接和对应的以太网设备是否正常、可达,例如系统的以太网卡、IP配置和路由项配置等。
0x030f0000
SMC-R v2连接非直连标志位设置错误。
原因:建连过程中,SMCv2 协议中,客户端根据服务器设置的gateway标志位判断是否经过网关,但是根据本地和远端IP查到的路由项指出并没有经过网关,二者不一致。
解决方案:检查该五元组创建的TCP连接和对应的以太网设备是否正常、可达,是否经过相同的网络路径,例如系统的以太网卡、IP配置和路由项配置等。
0x04000000
服务端和客户端复用LGR错误。
原因:建连过程中,服务端复用LGR,但是客户端想要创建LGR,二者行为错误。
解决方案:执行
smcr d
命令,检查ECS的RDMA卡是否正常。如果所需的RDMA设备为阿里云eRDMA设备,请确保该ERI设备已经在ECS控制台中添加并正确安装和配置ERI驱动。
0x05000000
握手过程中对端拒绝。
原因:建立连接过程中,对端回复的CLC消息拒绝建立RDMA连接。
解决方案:执行
smcss
命令,根据五元组信息找到对应的连接,并找到回退原因,包含本地和对端回退原因,根据对端回退编号确定具体原因。
0x09990000
RDMA相关资源创建错误。
原因:当使用阿里云eRDMA时,eRDMA暂时不支持IPv6,而应用程序使用IPv6地址创建RDMA连接。
解决方案:执行
smcss
命令,检查连接的本地和远端地址是否为 IPv6,如果是请在应用中显式使用AF_INET,或者停用操作系统的IPv6,命令如下:sysctl net.ipv6.conf.all.disable_ipv6=1和 sysctl net.ipv6.conf.default.disable_ipv6=1
。如果需要持久化该sysctl配置,可以将配置加入/etc/sysctl.conf
文件中。
0x09990001
RDMA rtoken增加失败。
SMC协议栈错误,如出现该错误请联系阿里云技术支持。
0x09990002
初始化RDMA QP资源失败。
原因:建立连接时,如果需要创建新的link(对应为一个RDMA QP)资源,SMC会依次调用IB verbs接口初始化并修改RDMA QP,而在此过程中发生异常。
解决方案:执行
smcr d
命令,检查当前是否有SMC-R(RDMA)设备。如果使用阿里云eRDMA,请检查ECS控制台是否正确配置ERI设备,并确保操作系统中正确安装ERI的驱动。
0x09990003
RDMA内存注册(MR)失败。
原因:使用RDMA通信时,需要注册内存区域用以RDMA网卡访问和写入数据,如果使用的MR数量或者大小超过了RDMA设备的规格,则会报错。
解决方案:执行
smcr d
命令,找到SMC所使用的RDMA设备名。再执行ibv_devinfo -d <RDMA 设备名> -v | grep max_mr
,其中max_mr
为RDMA设备支持的最多MR数量,max_mr_size
为 RDMA设备支持的最大MR大小;通常情况下为MR的数量达到瓶颈,此时请减少SMC的连接数量。
0x09990004
SMC流控所需的credit初始化失败。
原因:RDMA网卡或者链路发生故障,导致credit通告消息(通过RDMA链路通信)发送失败。
解决方案:确认RDMA网卡的状态是否正常。
启用SMC-R后常见网络运维工具的数据与预期不符
问题描述
使用Alibaba Cloud Linux 3开启SMC-R之后,常见的网络分析工具tcpdump、Wireshark等,网络监控工具ss(Socket Statistics)、netstat等,观察到的网络流量与预期不符或无法观察到预期流量。
问题原因
这是因为SMC-R是基于RDMA的网络通信技术,目前常见的网络运维工具只能分析或监控TCP流量,无法识别RDMA的网络数据报文。这会导致实际的网络数据和网络运维工具中显示的数据不匹配。
解决方案
可以尝试使用RDMA相关的运维工具进行数据分析或监控。更多信息,请参见监测和诊断eRDMA。