learning:vpp bond(2)
上一篇文章介绍了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中的另一个网卡,从而避免了整体网络连接因单点故障而中断的情况。
相关文章
- 【论文阅读】ST-PIL: Spatial-Temporal Periodic Interest Learning for Next Point-of-Interest Recommendation
- Deep Learning Chapter01:机器学习中线性代数
- Paddle Graph Learning (PGL)图学习之图游走类deepwalk、node2vec模型[系列四]
- learning:vpp pipe interface
- learning:vpp/classify(2)
- learning: nat 插件说明(1)
- AAAI2021-Hierarchical Reinforcement Learning for Integrated Recommendation
- UC Santa Cruz VLAA Lab招全奖Computer Vision/Deep Learning博士
- Hands on Reinforcement Learning 08 Deep Q Network Advanced
- Living the Expat Linux Life: An Adventure of Learning and Discovery(expatlinux)