zl程序教程

您现在的位置是:首页 >  其他

当前栏目

learning:vpp bond(2)

2023-02-19 12:21:04 时间

上一篇文章介绍了vpp bond的特性功能及cli相关的配置,这章节介绍一下bond相关的命令行设置参数及说明。在阅读bond代码前,建议先上网搜索一下bond模式的相关介绍和说明,便于理解代码的实现。

bond cli说明:

1、创建、删除bond接口

创建bond接口时必须设置mode,否则提示报错。vpp目前支持五种常见模式: 1、round-robin:轮训策略模式; 2、active-backup:主备策略模式; 3、broadcast:广播策略模式; 4、xor:平衡策略模式; 5、lacp:动态链路聚合模式; 其中xor lacp模式可以指定hash分担因子,支持三种分担(默认l2模式): 1、l2:smac+dmac; 2、l23:smac+dmac+sip+dip; 3、l34:sip+sport+dip+dport; cli命令如下:

create bond mode {round-robin | active-backup | broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 } [numa-only]]} [hw-addr <mac-address>] [id <if-id>] [gso]

mode :bond模式,不需要设置,其他都是非必须项。 hw-addr:配置bond接口mac地址,未强制指定,若未指定mac地址,则随机生产一个mac地址。 id:bond接口索引,不指定时,默认使用bond接口在pool内存池索引。如设置为2时,生成接口名称BondEthernet2,如果用户设置id已经被其他其他使用,会返回报错。 gso:Generic Segmentation Offload(通用分段延后处理)。指网卡在支持GSO功能时,对于超大数据包(大于MTU值),内核会将分段的工作延迟到交给驱动的前一刻。如果网卡不支持此功能,则内核用软件的方式对数据包进行分片。

删除bond接口:支持通过bond接口名称或接口索引来删除, 如果此时bond接口下还存在成员口,会将成员口信息一起删除。

delete bond {<interface> | sw_if_index <sw_idx>}
2、添加、删除成员口

添加成员口:需要指定待加入的bond接口,成员口只能加入到一个bond接口组中,如果成员口已经加入其他bond接口,会返回错误。

bond add <BondEthernetx> <member-interface> [passive] [long-timeout]

参数说明: 1、BondEthernetx :bond接口; 2、member-interface:成员口; 3、passive:lacp模式使用,表示当前接口是否启动lacp协议交换。 4、long-timeout:lacp模式使用,表示发送lacp报文超时时间,默认是3s,long time是60s。

删除成员口:删除成员口时,只需要输入成员口接口名称就可以了,因为在bond中添加成员口时,会生成相应的引用关系。

 bond del <member-interface>
3、查询bond接口信息。
show bond [details]
4、设置成员口权重

在没有阅读代码之前,以为这个功能是在round-robin模式下,设置出接口根据权重来做分担的。看完代码才明白此功能只能用于active-backup主备模式下,使用权重最大的作为主网卡,其他作为备用网卡;当主网卡down后,根据权重最大的作为主网卡。

set interface bond <interface> | sw_if_index <idx> weight <value>

疑问点:

1、转发流程中,报文如何切换到bond接口的?

可以通过命令行show interface rx-placement,来先查询线程绑定网卡绑定关系及收包的node节点。报文首先从bond成员口进入然后切换到bond接口上去。

learning_vpp1# show interface rx-placement 
Thread 1 (vpp_wk_0):
 node dpdk-input:
    GigabitEthernetb/0/0 queue 0 (polling)
    GigabitEthernet13/0/0 queue 0 (polling)
    GigabitEthernet1b/0/0 queue 0 (polling)

在成员口加入bond组的使用会使能bond-input到device-input feature arc类上,但是如果加入到dpdk-input节点的呢?

bond_add_member()---bond添加成员时,调用下面来使能bond-input
  vnet_feature_enable_disable ("device-input", "bond-input",
                      mif->sw_if_index, 1, 0, 0);

首先可以确认的是dpdk-input节点是device-input节点的兄弟节点。兄弟节点的子节点是一样的。也就是往device-input节点下挂载节点,同时也挂载到dpdk-input节点下。device-input节点是device-input feature arc类的起始节点,往arc类使能bond-input时,也就会使能到dpdk-input节点上。

##1、device-input arc 起始节点是device-input,
VNET_FEATURE_ARC_INIT (device_input, static) =
{
  .arc_name  = "device-input",
  .start_nodes = VNET_FEATURES ("device-input"),
  .last_in_arc = "ethernet-input",
  .arc_index_ptr = &feature_main.device_input_feature_arc_index,
};
##通过show features可以查询device-input arc 类节点情况,
device-input:
  srv6-as2-rewrite
  srv6-ad2-rewrite
  pppoe-input
  nsim
  mactime
  adl-input
  pg-input-mac-filter
  sr-pl-rewrite-encaps-l2
  bond-input
  policer-input
  stats-collect-rx
  p2p-ethernet-input
  span-input
  worker-handoff
  l2-patch
  ethernet-input ##ethernet-input结束节点,最终都要送到这个节点。

总结就是下面的流程图:

2、bond转发无锁化实现

bond全局管理结构为每个线程创建一个线程数据缓存区,每个线程数据缓存区根据bond成员口数量来创建报文临时缓存区。具体管理结果如下:

3、bond会增加路由器或交换机的连接带宽吗?

许多人可能认为“链路聚合”会增加带宽。比如三个网卡,每个网卡线速大小1Gbps。将三个网卡设置在一个bond组中,是否就能达到3Gbps大小?个人认为在RR模式可能是这样的,但是xor或lacp模式下,传输一个大文件时,最大速率可能只能达到1Gbps。同一条流只能选择一个接口的。这种情况下,链路聚合可能不会增加连接带宽。

4、bond最直接的效果是给用户带来负载平衡和容错。

负载均衡—发送流量根据目的地址在可用的物理网卡之间自动负载均衡。传入的流量由交换机控制,将流量路由到服务器,而主机/服务器没有控制物理网卡流量的能力。 容错——如果底层物理网卡之一损坏或线缆被拔出,主机/服务器将检测到故障情况,自动将流量转移到bond中的另一个网卡,从而避免了整体网络连接因单点故障而中断的情况。