SMC常见问题

更新时间: 2023-11-07 15:14:34

本文将为您介绍在使用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的问题,请通过下面方法来解决。

  1. 通过uname -r命令检查当前系统安装的内核版本。

    • 如果是5.10.134-12.2版本或高于该版本,直接执行下一步。

    • 如果低于5.10.134-12.2版本,升级内核版本到5.10.134-12.2。

      1. 运行yum install kernel-5.10.134-12.2.al8命令升级内核。

      2. 重启ECS实例。

  2. 载入SMC模块(modprobe smc)并打开配置。

    1. 载入SMC模块。具体操作,请参见使用说明

    2. 运行sysctl net.smc.sysctl_smc_experiments=1命令打开配置。

      说明

      如需持久化该配置,将net.smc.sysctl_smc_experiments=1添加到/etc/sysctl.conf中。

  3. 重新启用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发生回退时会提供回退原因编号,根据回退编号可以帮助分析和定位问题。

解决方案

  1. 运行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连接而回退。

  2. 根据回退编号,从下表中查看可能的原因和解决方案。

    回退原因编号

    说明

    可能原因和解决方案

    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

阿里云首页 云服务器 ECS 相关技术圈