本文将介绍SMC故障诊断和定位手段。
前提条件
已安装Alibaba Cloud Linux 3提供的SMC运维工具集smc-tools
。
如未安装,执行以下命令安装smc-tools
工具集。
sudo yum install -y smc-tools
回退诊断
SMC协议栈在建连时会与对端自动协商是否使用SMC通信,在不满足SMC通信条件时安全回退到使用TCP通信。可通过smcss
指令查看各SMC连接的回退原因。具体操作,请参见连接监控。
抓包诊断
SMC协议栈采用RDMA等内存直接访问技术进行数据传输,绕过了传统网络协议栈,因此无法直接利用传统的嗅探点进行数据包和控制包的流量捕获。
Alibaba Cloud Linux 3系统内核自ANCK 5.10.134-18
版本起,提供了一种在SMC协议栈上捕获数据包和控制包的方案:
SMC内核协议栈在接收或发送连接控制消息和共享内存中数据块时,构建UDP skb指向目标数据内存,将其发送到指定的虚拟网络设备(dummy device)上。skb最终被虚拟网络设备静默地消费掉,不会真正进入到网络中。在这个过程中,skb会经过内核现存的嗅探点(图中的
dev_queue_xmit_nit()
),如此一来就可以通过tcpdump
和libpcap
在虚拟网络设备上捕获到SMC协议栈发送或接收的数据包和控制包。而SMC握手流程中的TCP网络包仍在原本的以太网卡上抓取。
总结来说,上述两个阶段的数据包抓取方式如表所示。
数据包类型 | 流量承载设备 | 抓取设备 | 抓取报文格式 |
数据包类型 | 流量承载设备 | 抓取设备 | 抓取报文格式 |
SMC握手协商TCP包 或fallback到TCP协议栈后的数据包 | 以太网卡(例如 | 以太网卡(例如 | TCP报文 |
SMC数据包或控制包 | RDMA网卡(例如 | 虚拟网卡(例如 | UDP报文 |
smc-tools
提供了基于此方案的抓包工具smcdump-ex
,它是tcpdump
工具的再封装脚本,用于便捷地抓取SMC通信全流程。smcdump-ex
会在当前net namespace
中创建名称为smc-dummy{4字母随机字符}
的虚拟网络设备,并开启SMC数据包和控制包的抓取功能,按要求在以太网设备或虚拟网络设备上使用tcpdump
抓取SMC握手协商包、数据包和控制包。收到SIGINT(Ctrl + C)信号后将结束抓取、关闭抓取功能并销毁虚拟网络设备。
工具用法
执行以下命令,查看
smcdump-ex
具体用法。smcdump-ex目前为实验性工具,使用方式在未来可能发生变化。
smcdump-ex -h usage: smcdump-ex [-h] [-m {all,smc,smcd,smcr}] [-t {all,raw,cdc}] [--param PARAM] [--filter FILTER] [--legacy] SMC Dump - SMC Traffic Capture (Experimental) optional arguments: -h, --help show this help message and exit -m {all,smc,smcd,smcr}, --mode {all,smc,smcd,smcr} Select the mode (default: smc) -t {all,raw,cdc}, --type {all,raw,cdc} Select the packet type (default: all) --param PARAM Additional parameters for tcpdump. e.g. --param '-w packets.pcap' --filter FILTER Additional filter expressions for tcpdump. e.g. --filter 'host xxx.xxx.x.x and port 8080' --legacy Use the legacy SMC dump header format
使用
-m
设置数据抓取模式可选抓取模式有:
all
:在所有网络接口上抓包(等同于调用tcpdump -i any
)。即在以太网接口抓取SMC握手协商包,在新建的虚拟网络接口抓取SMC数据包和控制包。在此模式下,建议同时使用--filter
设置额外的tcpdump
过滤表达式,缩小网络包抓取范围,以便精确抓取到SMC协商包,具体内容请参见--filter
。smc
,smcr
,smcd
:仅在新建的虚拟网络接口(等同于调用tcpdump -i smc-dummy{4字母随机字符}
)上抓取SMC/SMC-R/SMC-D的数据包和控制包。
使用
-t
设置抓取的网络包类型可选待抓取网络包类型有:
all
:SMC数据包和控制包。raw
:仅SMC数据包。cdc
:仅SMC控制包。
使用
--param
设置其他tcpdump
参数例如:
--param '-w smcdata.pcap'
,设置抓包内容转储到文件。使用
--filter
设置其他tcpdump
过滤规则例如:
--filter 'host <ip> and port <port>'
,设置欲抓取数据包的IP地址和端口,以便准确捕获SMC协商包,避免其他TCP网络包对结果分析造成的干扰。使用
--legacy
解析旧smc dump header
格式此参数仅为兼容
ANCK 5.10.134-17.3
版本内核,对于ANCK 5.10.134-18
及以上版本的内核,无需设置此参数。
使用范例
以下述情况为例:使用
smcdump-ex
抓取IP地址为192.168.2.5,端口为5201的SMC连接通信过程中的全部数据包,并转储到smc.pcap
文件中。执行以下命令:smcdump-ex -m all -t all --param '-w smc.pcap' --filter 'host 192.168.2.5 and port 5201'
使用
--param '-w <pcap file>'
存储到.pcap
文件的抓包结果可通过Wireshark工具配合Lua插件进一步分析:下载并安装Wireshark。
通过Wireshark配合Lua插件进一步分析存储到
.pcap
文件的抓包结果。下载Lua插件:https://os-smc-new.oss-cn-hangzhou.aliyuncs.com/smc_dump.lua。
使用该Lua插件需确保Wireshark中Lua解释器版本大于等于5.3。
查看
Wireshark Lua script
的安装路径,将Lua脚本放入此路径中。在macOS系统中查看
Wireshark Lua script
的安装路径。运行Wireshark。
在菜单栏中单击
在Windows系统中查看
Wireshark Lua script
的安装路径。运行Wireshark。
在Wireshark的主界面中,单击
。
重启Wireshark或Reload Lua Plugins使脚本生效。之后所有负载中含有SMC dump header的UDP包将被解析为SMC协议,如下图所示。
性能诊断
在性能对比测试中,如果遇到SMC性能回退等问题。可通过基础性能测试工具来初步界定问题。
SMC可使用
sockperf
、qperf
、iperf3
以及netperf
等网络基础性能测试工具进行带宽和时延的基准测试。eRDMA可使用
perftest
基础性能测试工具进行带宽和时延的基准测试。具体操作,请参见eRDMA网络性能测试。
如果在基准测试中SMC或者eRDMA就出现了性能回退,则需要提交工单进一步处理。如果基准测试正常,则需要参照共享内存通信(SMC)使能和配置说明检查SMC配置。