如果您在Alibaba Cloud Linux 3系统中启用了共享内存通信SMC(Shared Memory Communication),在使用过程中若遇到无法正常通信、部分端口不可用以及与TCP相比应用性能未见提升等问题,可以参考本文提供的方案进行排查并解决。
启用SMC后应用性能对比TCP没有提升
问题描述
使用SMC加速应用TCP连接之后,应用的性能与直接使用TCP对比并没有提升。
问题原因及解决方案
由于某些原因,导致应用创建的SMC连接回退到TCP,此时无法使用RDMA加速网络通信。详细的回退排查和解决方法,请参见启用SMC后回退无法使用RDMA加速。
应用的网络通信开销在整个应用中占比较小。例如应用是倾向于CPU密集型,网络通信在应用中占比较低。
由于RDMA数据包相较于TCP需要占用更多的头部空间以携带与RDMA相关的信息,因此在带宽满载的情况下,RDMA传输的数据带宽会略低于TCP。您可以考虑启用巨型帧(Jumbo Frames)来缓解这个问题。更多信息,请参见巨型帧(Jumbo Frames)。
应用的网络通信模型不适用SMC。例如:
频繁建立、销毁连接(短连接)的场景。SMC创建连接涉及到RDMA资源创建和申请等慢速路径,根据不同应用短连接的占比,性能对比TCP可能没有收益。
资源受限的场景。SMC通信所使用的资源受限于机器内存和eRDMA网卡规格,资源不足可能导致SMC回退到TCP。更多信息,请参见共享内存通信(SMC)使能和配置说明。
启用SMC后无法正常通信
问题描述
使用Alibaba Cloud Linux 3开启SMC之后,访问某些地址(例如某些公网服务)不通,但是可以ping通。关闭SMC之后恢复正常。
问题原因
某些服务器实现上没有严格遵守TCP规范,在处理TCP options时,可能重放TCP options,导致SMC协议识别出现问题。
A TCP implementation MUST (MUST-6) ignore without error any TCP Option it does not implement, assuming that the option has a length field.更多信息,请参见RFC 9293。
如果用于表征支持SMC的TCP option被重放,就会使得本端误认为对端服务具备SMC能力,引起握手错误,导致请求(例如curl)失败,而ping(ICMP协议)成功的现象。
您可以通过通信链路检查诊断此类问题。
解决方案
对于重放SMC TCP option的非预期现象,由于是网络中间节点或对端的错误行为,无法从根本上避免,建议通过基于BPF策略的SMC协商控制,避免此链路访问使用SMC通信。
通过smc_run启用SMC无效
问题描述
根据共享内存通信(SMC)使能和配置说明通过smc_run ./foo
在应用程序维度启用SMC后,使用smcr l
观察发现没有成功创建的link group,使用smcss -a
也看不到连接或是看到一侧连接出现回退。
问题原因
smc_run
透明启用SMC的原理是通过LD_PRELOAD将smc-tools中提供的动态链接库优先于其他库之前加载,在优先加载的动态链接库的socket(2)中对socket的family和protocol进行修改。因此,若应用程序并非通过动态方式链接(如静态链接),则smc_run
无法成功透明启用SMC。
解决方案
根据共享内存通信(SMC)使能和配置说明提供的sysctl net.smc.tcp2smc
启用SMC。
启用SMC后导致部分端口不可用
问题描述
加载SMC后,65500后的16个端口(即65500~65515)不可用,bind(2)这些端口会导致返回EADDRINUSE
。
问题原因
由于SMC-R+eRDMA实现方式的特殊性,SMC模块将会占用ERI所在net namespace下65500开始的16个端口作为OOB建连的预留端口,在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模块无法使用eRDMA设备。
解决方案
卸载SMC模块后将会释放这些端口。卸载方法请参见在阿里云ECS上使用SMC。
启用SMC后使用IPv6地址出现回退
问题描述
在使用IPv6地址的应用程序中启用SMC,通过smcss
命令可以观察到SMC回退到TCP协议栈的现象,回退原因代码为0x03030000
或0x0x09990000
。
问题原因
阿里云eRDMA设备与SMC目前均不支持使用IPv6地址。如果应用层使用IPv6地址,会导致SMC回退到TCP协议栈。
解决方案
在对新建连接启用SMC前,根据实际需求选择以下任意一种方法禁用IPv6地址。
方案一:禁用IPv6地址。
执行以下命令,禁用所有网络接口的IPv6地址。
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1
执行以下命令,禁用特定网络接口的IPv6地址。
<NetInName>
替换为具体的网络接口名。sudo sysctl -w net.ipv6.conf.<NetInName>.disable_ipv6=1
方案二:在
5.10.134-17.3
及更高版本的内核上,使用IPv4-mapped IPv6
地址。
在极限PPS场景下SMC性能不如TCP
问题描述
当网络压力达到ECS实例规格定义的网络收发包PPS上限时,启用SMC使用eRDMA后应用程序的QPS(Queries Per Second)表现不如TCP。
TCP流量:通过
sar -n DEV 1
命令查看网络接口每秒传输包数量rxpck/s
和txpck/s
,确定网络压力是否达到PPS上限。SMC的eRDMA流量:通过
eadm stat -d <ibdev_name> -l
命令来查看eRDMA网络接口每秒传输包数量,确定网络压力是否达到PPS上限。更多eadm
的信息,请参见使用eadm工具进行eRDMA故障诊断和排查。
问题原因
由于RDMA协议的网络包设计与TCP不同,RDMA对于相同数量网络请求产生的网络包数量更多,更易达到实例规定的PPS上限,导致应用程序的QPS无法继续增长。
解决方案
该问题仅出现在达到PPS上限的极限网络压力情况下,例如使用benchmark压测时。在实际场景中网络流量压力极少会达到实例PPS上限。如果确实出现因PPS上限导致SMC性能劣于TCP的实际场景,则建议不在此场景下使用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连接而回退。
根据回退编号,从下表中查看可能的原因和解决方案。
启用SMC后常见网络运维工具的数据与预期不符
问题描述
使用Alibaba Cloud Linux 3开启SMC-R之后,常见的网络分析工具tcpdump、Wireshark等,网络监控工具ss(Socket Statistics)、netstat等,观察到的网络流量与预期不符或无法观察到预期流量。
问题原因
这是因为SMC-R是基于RDMA的网络通信技术,目前常见的网络运维工具只能分析或监控TCP流量,无法识别RDMA的网络数据报文。这会导致实际的网络数据和网络运维工具中显示的数据不匹配。
解决方案
可以尝试使用RDMA相关的运维工具进行数据分析或监控。更多信息,请参见监测和诊断eRDMA。
在GPU或SCC实例上加载SMC模块不可用
问题描述
在GPU或SCC实例上加载SMC模块,模块不可用。
问题原因
这类实例中安装了Mellanox厂商版本OFED驱动,默认加载的是OFED中的SMC模块,不具备实际功能。且由于安装Mellanox OFED驱动后RDMA相关函数的符号发生变化,加载内核自带的SMC模块会出现Unknow symbol
错误而无法加载成功。
解决方案
目前Alibaba Cloud Linux 3 SMC模块不支持在GPU或SCC等实例中使用。
启用SMC后setsockopt/getsockopt部分SOL_SOCKET或SOL_TCP层选项效果与预期不符
问题描述
启用SMC并替换应用的TCP连接后,原本作用于TCP连接的部分SOL_SOCKET或SOL_TCP层选项通过setsockopt或getsockopt设置失败,或设置成功但无法起到预期效果。
问题原因
使用SMC替换TCP协议栈后,数据路径上基于共享内存完成通信,协议栈设计和数据传递方式都与TCP有着很大的不同。因此,部分SOL_SOCKET或SOL_TCP层选项不再适用。
解决方案
对照下表查看Alibaba Cloud Linux 3中SMC对SOL_SOCKET或SOL_TCP层选项的支持情况。
SMC对SOL_SOCKET或SOL_TCP层选项的支持情况可以分为以下3种类型:
Y:支持,设置/获取选项返回成功,并且能够达到预期效果。
M:不支持,设置/获取返回成功,但由于SMC与TCP设计的不同,无法达到预期效果。
N:不支持,设置/获取返回失败,回退到TCP(回退原因编号:0x03060000或0x03010001)。