共享内存通信(SMC)诊断说明

更新时间:
复制 MD 格式

本文将介绍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()),如此一来就可以通过tcpdumplibpcap在虚拟网络设备上捕获到SMC协议栈发送或接收的数据包和控制包。

    image
  • SMC握手流程中的TCP网络包仍在原本的以太网卡上抓取。

总结来说,上述两个阶段的数据包抓取方式如表所示。

数据包类型

流量承载设备

抓取设备

抓取报文格式

SMC握手协商TCP

fallbackTCP协议栈后的数据包

以太网卡(例如eth0

以太网卡(例如eth0

TCP报文

SMC数据包或控制包

RDMA网卡(例如erdma_0

虚拟网卡(例如dummy0

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

      • smcsmcrsmcd:仅在新建的虚拟网络接口(等同于调用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,端口为5201SMC连接通信过程中的全部数据包,并转储到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插件进一步分析:

    1. 下载并安装Wireshark

    2. 通过Wireshark配合Lua插件进一步分析存储到.pcap文件的抓包结果。

      1. 下载Lua插件:https://os-smc-new.oss-cn-hangzhou.aliyuncs.com/smc_dump.lua

        说明

        使用该Lua插件需确保WiresharkLua解释器版本大于等于5.3。

      2. 查看Wireshark Lua script的安装路径,将Lua脚本放入此路径中。

        • macOS系统中查看Wireshark Lua script的安装路径。

          1. 运行Wireshark。

          2. 在菜单栏中单击Wireshark > About Wireshark > Folders

            Folders 标签页的列表中,找到 Global Lua Plugins 行,其 Location 列显示 Lua 脚本的安装路径(如 /Applications/Wireshark.app/Contents/PlugIns/wireshark)。

        • Windows系统中查看Wireshark Lua script的安装路径。

          1. 运行Wireshark。

          2. Wireshark的主界面中,单击帮助 > 文件夹

            名称                    位置                                        典型文件
            Global Extcap path      C:\Program Files\Wireshark\extcap             external capture (extcap) plugins
            MIB/PIB 路径                                                         SMI MIB/PIB 搜索路径
            MaxMind DB 路径         C:\ProgramData\GeoIP                          MaxMind DB 数据库搜索路径
            MaxMind DB 路径         C:\GeoIP                                      MaxMind DB 数据库搜索路径
            Personal Extcap path    C:\Users\xxx\App...oaming\Wireshark\extcap    external capture (extcap) plugins
            "文件"对话框            C:\Users\xxx\Documents                        捕获文件
            个人 Lua 插件           C:\Users\xxx\App...aming\Wireshark\plugins    Lua scripts
            个人插件                C:\Users\xxx\App...g\Wireshark\plugins\4.2    二进制插件
            个人配置                C:\Users\xxx\AppData\Roaming\Wireshark        dfilters, preferences, ethers, ...
            临时                    C:\Users\xxx\AppData\Local\Temp               无标题捕获文件
            全局 Lua 插件           C:\Program Files\Wireshark\plugins             Lua scripts          ← 将脚本放入此目录
            全局插件                C:\Program Files\Wireshark\plugins\4.2        二进制插件
            全局配置                C:\Program Files\Wireshark                     dfilters, preferences, manuf, ...
            程序                    C:\Program Files\Wireshark                     程序文件
            系统                    C:\Program Files\Wireshark                     ethers, ipxnets
    3. 重启WiresharkReload Lua Plugins使脚本生效。之后所有负载中含有SMC dump headerUDP包将被解析为SMC协议,如下所示。

      Wireshark 过滤条件为 tcp.port==36508 or udp.port==36508,抓包结果展示了 SMC-R 协议通信的完整过程。TCP 协议的包(编号 20-22、24、26、30、49、61、62)为握手协商包,SMC/SMCv2 协议的包(编号 23、25、27-29、31-33、37-42、45-48、60)为经内核转化成 UDP 包抓取的 RDMA 数据包和控制包。

      tcp.port==36508 or udp.port==36508
      
      No.  Time      Source  Destination  Protocol  Length  Info
      20   0.000722  xxx     xxx          TCP       84      36508 → 5201 [SYN] Seq=0 Win=59220 Len=0 MSS=8460 SACK_PERM TSval=2524508823 TSecr=0 WS=128 ExID=E2D4
      21   0.000834  xxx     xxx          TCP       84      5201 → 36508 [SYN, ACK] Seq=0 Ack=1 Win=59136 Len=0 MSS=8460 SACK_PERM TSval=4260635458 TSecr=2524508823 WS=128 ExID=E2D4
      22   0.000838  xxx     xxx          TCP       68      36508 → 5201 [ACK] Seq=1 Ack=1 Win=59264 Len=0 TSval=2524508823 TSecr=4260635458
      23   0.000842  xxx     xxx          SMCv2     224     [SMC-Rv2-Proposal],36508 → 5201 [PSH, ACK] Seq=1 Ack=1 Win=59264 Len=156 TSval=2524508823 TSecr=4260635458
      24   0.000904  xxx     xxx          TCP       68      5201 → 36508 [ACK] Seq=1 Ack=157 Win=59008 Len=0 TSval=4260635458 TSecr=2524508823
      25   0.000947  xxx     xxx          SMCv2     176     [SMC-Rv2-Accept],5201 → 36508 [PSH, ACK] Seq=1 Ack=157 Win=59008 Len=108 TSval=4260635458 TSecr=2524508823 OP=0x000aa5
      26   0.000948  xxx     xxx          TCP       68      36508 → 5201 [ACK] Seq=157 Ack=109 Win=59264 Len=0 TSval=2524508823 TSecr=4260635458
      27   0.000991  xxx     xxx          SMCv2     176     [SMC-Rv2-Confirm],36508 → 5201 [PSH, ACK] Seq=157 Ack=109 Win=59264 Len=108 TSval=2524508823 TSecr=4260635458 OP=0x0011fc
      28   0.000993  xxx     xxx          SMC       93      [Raw Data], 36508 → 5201 size=37
      29   0.000993  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=0:37 Cons=0:0
      30   0.001050  xxx     xxx          TCP       68      5201 → 36508 [ACK] Seq=109 Ack=265 Win=59008 Len=0 TSval=4260635458 TSecr=2524508823
      31   0.001156  xxx     xxx          SMC       65551   [Raw Data], 36508 → 5201 size=65495
      32   0.001336  xxx     xxx          SMC       65551   [Raw Data], 36508 → 5201 size=65495
      33   0.001543  xxx     xxx          SMC       65551   [Raw Data], 36508 → 5201 size=65495
      37   0.001548  xxx     xxx          SMC       138     [Raw Data], 36508 → 5201 size=82
      38   0.001549  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=0:131109 Cons=0:0
      39   0.001560  xxx     xxx          SMC       65551   [Raw Data], 36508 → 5201 size=65495
      40   0.001566  xxx     xxx          SMC       65551   [Raw Data], 36508 → 5201 size=65495
      41   0.001574  xxx     xxx          SMC       101     [Raw Data], 36508 → 5201 size=45
      42   0.001574  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=1:0 Cons=0:0
      45   0.001609  xxx     xxx          SMC       104     [CDC messages], 5201 → 36508 Prod=0:0 Cons=0:131109
      46   0.001610  xxx     xxx          SMC       93      [Raw Data], 36508 → 5201 size=37
      47   0.001611  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=1:37 Cons=0:0
      48   0.001649  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=0:0 Cons=0:131109
      49   0.001673  xxx     xxx          TCP       68      5201 → 36508 [FIN, ACK] Seq=109 Ack=265 Win=59008 Len=0 TSval=4260635459 TSecr=2524508823
      60   0.001835  xxx     xxx          SMC       104     [CDC messages], 36508 → 5201 Prod=1:37 Cons=0:0
      61   0.001838  xxx     xxx          TCP       68      36508 → 5201 [FIN, ACK] Seq=265 Ack=110 Win=59264 Len=0 TSval=2524508824 TSecr=4260635459
      62   0.001904  xxx     xxx          TCP       68      5201 → 36508 [ACK] Seq=110 Ack=266 Win=59008 Len=0 TSval=4260635459 TSecr=2524508824

性能诊断

在性能对比测试中,如果遇到SMC性能回退等问题。可通过基础性能测试工具来初步界定问题。

  • SMC可使用sockperfqperfiperf3以及netperf等网络基础性能测试工具进行带宽和时延的基准测试。

  • eRDMA可使用perftest基础性能测试工具进行带宽和时延的基准测试。具体操作,请参见eRDMA网络性能测试

如果在基准测试中SMC或者eRDMA就出现了性能回退,则需要提交工单进一步处理。如果基准测试正常,则需要参照共享内存通信(SMC)使能和配置说明检查SMC配置。