背景
本文介绍net.bonding.broadcast_arp_or_nd内核参数的作用以及配置方法和影响。当服务器未开启该功能时,假设系统组建了bonding,但是使用了queue_affinity模式进行rdma打流,会出现双发单收的问题(发送端2个口发送数据到ASW,然后接收端只有一个接口收数据)
修改方式
内核参数提供了net.bonding.broadcast_arp_or_nd,可以通过sysctl -a | grep bonding
来查看配置参数。该参数是网络绑定(Network Bonding)用于控制绑定接口在特定场景下的行为。
影响两种情况的处理方式:
ARP(Address Resolution Protocol):用于 IPv4 网络中解析 IP 地址到 MAC 地址。
ND(Neighbor Discovery):用于 IPv6 网络中发现邻居节点和解析 IP 地址到链路层地址(类似 IPv4 的 ARP)。
当绑定接口处于某些模式(如 active-backup 或 balance-rr)下,可能需要向网络中的其他设备宣告自己的存在或更新 MAC/IP 映射关系。此时,broadcast_arp_or_nd 决定了使用哪种协议进行宣告:
值为 1(默认):同时发送 ARP 请求(针对 IPv4)和 ND 消息(针对 IPv6)。
值为 0:仅发送 ARP 请求(忽略 IPv6 的 ND 消息)。
为何会出现双发单收的问题?
bonding 驱动会截获本机发送的 ARP 应答,并把源硬件地址改写为 bond 中某个 slave 的唯一硬件地址,使得对端学习到这个硬件地址后,接收流量将会全部流向当前的 slave。在 queue_affinity 模式下,可能由于 ARP 协商的作用,导致接收端只从特定的一个接口接收数据,从而出现双发单收现象。
另外queue_affinity 模式会将特定队列与特定的 CPU 核心或接口相关联,以优化性能。这种亲和性设置可能导致数据在发送时,两个接口都参与发送,但接收端由于队列亲和性的配置,只从对应的某个接口接收数据,使得另一个接口发送的数据未被接收端处理,表现为双发单收。
如何修改该参数?
临时修改(重启后失效):
关闭:sysctl net.bonding.broadcast_arp_or_nd=0
开启:sysctl net.bonding.broadcast_arp_or_nd=1
永久生效,vim /etc/sysctl.conf ,添加或修改该行:
net.bonding.broadcast_arp_or_nd = 0
执行 sysctl -p 使配置生效。