如何在内核级别诊断 Linux LACP 问题?

jjo*_*nic 8 linux bonding linux-networking linux-kernel lacp

Linux 绑定驱动程序是否有一个底层的管理或诊断接口来确定内部发生了什么?

多年来,我一直在 Linux 机器和 Cisco 交换机之间使用链路聚合。在设置 Linux 端根本不响应 Cisco LACP 数据包的新机器时,我会定期遇到死胡同。我对每台服务器都严格遵循一套严格的说明,但结果似乎各不相同。

无论绑定包含一个从属设备还是八个从属设备,tcpdump 都会显示来自所有绑定接口上的交换机的 LACP 数据包,并且没有数据包被传回。事实上,没有数据包是传输周期。 rx_packets为接口显示可观的流量,但tx_packets为零。日志中没有关于 MII 或绑定的有趣内容。甚至没有任何错误。

目前,我正在处理一个只有两个网卡的盒子。目前,我的债券中只有 eth1。显然,这是一个退化的配置。这种情况不会随着 eth0 和 eth1 在债券中而改变;当网络堆栈完全关闭时,它只会使机器更难工作。如有必要,我可以为两个 nic 重新配置它并通过管理界面 (DRAC),但我无法通过这种方式从框中复制粘贴。

一些预习:

  • 我测试了网卡、端口和电缆。当接口未绑定时,一切都按预期工作。
  • 我已经重新启动并确认模块加载正确。
  • 我已经尝试过使用和不使用 vlan 中继;这应该无关紧要,因为链路聚合发生在堆栈中该点下方。
  • 该交换机具有通向其他 Linux 机器的工作中继通道组。即使 Linux 机器的发行版、内核和硬件不同,配置也或多或少相同。

这是今天下载的 debian 8.6。

Linux box 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2
    (2016-10-19) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

一个简写的配置:

iface eth1 inet manual

auto bond0
iface bond0 inet manual
        slaves eth1
        address 10.10.10.10
        netmask 255.255.255.0
        bond_mode 4
        bond_miimon 100
        bond_downdelay 200
        bond_updelay 200
        bond_xmit_hash_policy layer2+3
        bond_lacp_rate slow
Run Code Online (Sandbox Code Playgroud)

一些状态:

# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2+3 (2)
MII Status: down
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200

802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
bond bond0 has no active aggregator

Slave Interface: eth1
MII Status: down
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:5a:2b:3e
Aggregator ID: N/A
Slave queue ID: 0
Run Code Online (Sandbox Code Playgroud)

来自交换机的 eth1 上的入站 tcpdump 记录:

22:18:47.333928   M 44:ad:d9:6c:8d:8f ethertype Slow Protocols (0x8809),
          length 126: LACPv1, length 110
        Actor Information TLV (0x01), length 20
          System 44:ad:d9:6c:8d:80, System Priority 32768, Key 12,
          Port 272, Port Priority 32768
          State Flags [Activity, Aggregation, Synchronization,
            Collecting, Distributing, Default]
        Partner Information TLV (0x02), length 20
          System 00:00:00:00:00:00, System Priority 0, Key 0, Port 0,
            Port Priority 0
          State Flags [none]
        Collector Information TLV (0x03), length 16
          Max Delay 32768
        Terminator TLV (0x00), length 0
Run Code Online (Sandbox Code Playgroud)

思科方面:

interface GigabitEthernet1/0/15
 switchport trunk allowed vlan 100,101,102
 switchport mode trunk
 channel-group 12 mode active
end
interface Port-channel12
 switchport trunk allowed vlan 100,101,102
 switchport mode trunk
end
Run Code Online (Sandbox Code Playgroud)

最终,交换机放弃,接口进入“独立”模式。如果通道组中有两个接口,它们进入独立模式。

#show etherchannel 12 sum
Flags:  I - stand-alone

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------
12     Po12(SD)        LACP      Gi1/0/15(I)
Run Code Online (Sandbox Code Playgroud)

我整天都在绞尽脑汁。我已经多次撕毁并重建 Cisco 配置。如果不是因为 tcpdump 显示到达 Linux 接口的 LACPv1 数据包,我会关注 Cisco 方面。唉,Linux 内核似乎完全忽略了这些数据包。我的下一站是内核源代码和最坏的情况,用于诊断的自定义内核。希望有人对绑定驱动程序有一些了解,以及是什么让它正确运行。

sup*_*ami 5

绑定驱动程序不会向用户空间公开任何 LACP 状态机调试,您需要了解代码并使用像 SystemTap 这样的内核检测,或者将您自己的调试写入您自己的绑定模块并为您的内核编译它。

然而,问题是bonding驱动认为slave宕机了:

MII Status: down
Run Code Online (Sandbox Code Playgroud)

你说你确信奴隶有链接,所以我们将忽略物理问题。

绑定/从属未正确配置并且从属管理器关闭,或者正在使用的驱动程序不支持netif_carrier()内核内部的样式链接检测,您需要use_carrier=0在绑定模块的选项中进行设置。


Mik*_*giy 4

尝试将 Linux 端的下一个 LACP 属性设置为:

bond_downdelay 0
bond_updelay 0
bond_xmit_hash_policy layer3+4
bond_lacp_rate fast
Run Code Online (Sandbox Code Playgroud)

在 Cisco 端,重新创建端口通道并启用 LACP 的快速速率:

port-channel load-balance src-dst-ip
interface GigabitEthernet1/0/15
    lacp rate fast
exit
Run Code Online (Sandbox Code Playgroud)

如果Cisco交换机无法设置lacp rate fast,则需要更新其IOS。

Cisco 使用 LACP 的效果比 Linux 差。port-channel load-balance src-dst-port如果您的 Cisco 交换机可以,请设置。