RX 错误计数器和低吞吐量性能

问题

交换机中可能存在低吞吐量性能,并且 RX 错误计数器以及可能的 TX 错误计数器正在递增。您可能会在不同命令的输出中看到这些错误计数器

  • cl-netstat
  • ip -s link show
  • ethtool -S

如果您想监控这些命令的输出以实时查看统计信息的更改,请使用 Linux watch 命令。有关使用此命令的更多信息,请参阅以下文章

cl-netstat 显示 RX_ERR

您可以在 cl-netstat 的输出中看到 RX 错误计数器,显示为 RX_ERR,如下所示。

cumulus@switch$ cl-netstat
Kernel Interface table
Iface   MTU Met         RX_OK RX_ERR RX_DRP RX_OVR        TX_OK TX_ERR TX_DRP TX_OVR    Flg
---------------------------------------------------------------------------------------------
eth0      1500 0      7361728      0      0 0           2030188      0      0      0 BMRU
lo       16436 0          173      0      0 0               173      0      0      0 LRU
swp1      9000 0   7669976333 15682741   1439 0      3035723493      0      0      0 BMRU
swp2      9000 0   3023667770 10728822    978 0      9840616134      0      0      0 BMRU
swp3      9000 0  24315580462 14877988   1307 0     80763548753      0      0      0 BMRU
swp4      9000 0  13869960451 8452232    897 0       7477191326      0      0      0 BMRU

<输出被截断>

有关如何使用 cl-netstat 命令的更多信息,请阅读用户指南

您可以在 ip -s link show 的输出中看到 RX 错误计数器,如下所示。

cumulus@switch$ ip -s link show swp5
7: swp5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT qlen 500 
    link/ether 08:9e:01:ce:e0:6c brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    8552309    71000    1899    1       0       63108  
    TX: bytes  packets  errors  dropped carrier collsns 
    1940799    15779    0       0       0       0 

ethtool -S 显示 HwIfInErrors

您可以在 ethtool -S <interface> 的输出中看到 RX 错误计数器,显示为 HwIfInErrors,如下所示。

cumulus@switch$ ethtool -S swp1
NIC statistics:
     HwIfInOctets: 51883086875273
     HwIfInUcastPkts: 7669711571
     HwIfInBcastPkts: 0
     HwIfInMcastPkts: 264791
     HwIfOutOctets: 10590370555531
     HwIfOutUcastPkts: 3035458717
     HwIfOutMcastPkts: 264792
     HwIfOutBcastPkts: 0
     HwIfInDiscards: 1439
     HwIfInL3Drops: 0
     HwIfInBufferDrops: 1439
     HwIfInAclDrops: 115
     HwIfInDot3LengthErrors: 0
     HwIfInErrors: 15682741
     SoftInErrors: 0
     SoftInDrops: 0
     SoftInFrameErrors: 0
     HwIfOutDiscards: 0
     HwIfOutErrors: 0
     HwIfOutQDrops: 0
     HwIfOutNonQDrops: 0
     SoftOutErrors: 0
     SoftOutDrops: 0
     SoftOutTxFifoFull: 0
     HwIfOutQLen: 0 

环境

  • Cumulus Linux,所有版本

概述

错误原因

这些 RX_ERR 或 HwIfInErrors 指示某些以太网数据帧在传输线路的某处损坏,通常是由于某些不良的线缆或收发器造成的。帧校验序列 (FCS) 计算中的循环冗余校验 (CRC) 算法可能会检测到这些错误。

当交换机接收到帧时,它会对帧运行自己的校验和,并将生成的 CRC 值与以太网帧中的值进行比较。如果它们不相等,则表示某些位已损坏,因此交换机将这些计为 RX 错误。在半双工模式下,某些 FCS 错误可能是正常的。在全双工模式下,FCS 错误是不正常的。

错误的传播

当平台检测到 FCS 错误时,平台如何处理以太网帧取决于您配置的交换模式,即直通或存储转发之一。在直通模式下,带有 FCS 错误的帧可能会传播到下一个交换机。在存储转发模式下,带有 FCS 错误的帧将被丢弃。

直通交换模式

您使用直通转发模式通过在从上游发送方接收整个数据包之前开始转发过程来最大限度地减少通过交换机的延迟(延迟)。数据可能会在入站接口仍在接收数据时开始传输,这最大限度地减少了交换机保持数据包的时间,从而最大限度地减少了传播延迟。缺点是带有 FCS 错误的数据帧可能会传播到下一跳,因为在检测到 FCS 错误之前,从交换机输出的传输就开始了。由于下一跳交换机在没有数据包问题的指示的情况下就开始接收此数据包,因此它也可能在检测到 FCS 错误之前开始传输到其出站接口,从而进一步传播错误。

存储转发交换模式

顾名思义,存储转发会等待交换机接收并验证整个数据包,然后才开始出站接口上的传输过程。这允许交换机在发送接收到的数据包之前验证其是否有效,但这会通过在交换机中的缓冲区中将每个数据包保持更长时间来增加延迟。它还可能通过让每个数据包更长时间地利用资源来增加缓冲区利用率。如果您配置存储转发,平台能够在开始传输之前检测到 FCS 错误,因此可以丢弃帧并且不将错误传播到下一跳。

解决方案

更换坏组件

帧损坏是由于数据路径中某处的某些坏组件引起的,例如线缆或收发器。在端到端数据路径中的所有跃点上向上游追踪 RX 错误

您可以 使用 lldpctl 逐跳向上游追踪端口。这是一个示例输出

cumulus@switch$ lldpctl 
-------------------------------------------------------------------------------
LLDP neighbors:
-------------------------------------------------------------------------------
Interface:    eth0, via: LLDP, RID: 1, Time: 0 day, 23:36:08
  Chassis:     
    ChassisID:    mac 6c:64:1a:00:2f:54
    SysName:      backbone
    SysDescr:     Cumulus Linux version 2.5.2 running on cel kennisis
    MgmtIP:       192.168.1.5
    Capability:   Bridge, on
    Capability:   Router, on
  Port:        
    PortID:       ifname swp21
    PortDescr:    swp21
-------------------------------------------------------------------------------
Interface:    swp1, via: LLDP, RID: 5, Time: 0 day, 05:51:40
  Chassis:     
    ChassisID:    mac 08:9e:01:ce:e4:0c
    SysName:      sw23
    SysDescr:     Cumulus Linux version 2.5.2 running on quanta ly2
    MgmtIP:       192.168.2.30
    Capability:   Bridge, off
    Capability:   Router, on
  Port:        
    PortID:       ifname swp7
    PortDescr:    swp7
-------------------------------------------------------------------------------

在您确定源点后,尝试更换线缆或收发器以解决引入数据损坏的组件。

更改交换模式

虽然直通转发减少了延迟和缓冲区消耗,但其缺点之一是在出站接口上开始传输之前,未验证数据包是否有效。因此,转发可能会在检测到 FCS 错误之前从输出接口开始。

通过将转发操作模式从直通更改为存储转发模式,Cumulus Linux 在转发过程开始之前验证每个数据包是否正确,从而限制任何损坏数据包的范围。这种验证的代价是可能增加延迟和缓冲区消耗。

您需要在数据路径中配置这些交换机

  • RX 错误的交换机的上游交换机(即数据路径中的前一个交换机)以消除相关交换机上的 RX 错误
  • 显示 RX 错误的交换机,以防止其将错误传播到下游交换机(即数据路径中的下一个交换机)

要在具有 Broadcom ASIC 的交换机上将转发行为从直通更改为存储转发

  1. 运行以下命令

    cumulus@switch$ sudo vi /etc/cumulus/datapath/traffic.conf
    
  2. traffic.conf 文件中搜索以下行

    # To enable cut-through forwarding
    cut_through_enable = true
    
  3. cut_through_enable 的值修改为 false

    # To enable cut-through forwarding
    cut_through_enable = false
    
  4. 为了使转发模式的更改生效,请重启 switchd。请注意,重启 switchd 守护程序对业务的影响极小。

    cumulus@switch$ sudo service switchd restart
    

注意事项

虽然这些说明讨论了如何更改 Cumulus Linux 交换机上转发操作的模式,但在几乎所有情况下,直通的默认设置都是建议值。如果您为了测试目的在交换机上进行此更改,则应继续监控其性能。