一、网卡bond
网卡bond,即网卡绑定。网卡绑定有多种叫法:Port Trunking, Channel Bonding, Link Aggregation, NIC teaming等等。主要是将多个物理网卡绑定到一个逻辑网卡上。通过绑定可以达到链路冗余、带宽扩容、负载均衡等目的。网卡bond一般主要用于网络吞吐量很大,以及对于网络稳定性要求较高的场景,是生产场景中提高性能和可靠性的一种常用技术。
Linux内置了网卡绑定的驱动程序,可以将多个物理网卡分别捆绑成多个不同的逻辑网卡(例如把eth0、eth1捆绑成bond0,把eth2、eth3捆绑成bond1)。对于每一个bond接口来说,可以分别定义不同的绑定模式。
二、bond模式
对应于不同的负载均衡和容错特性需求,Linux网卡bond的模式共有bond0-bond6共7种。
1)mode=0(balance-rr)
表示负载分担round-robin,并且是轮询的方式,顺序在每个slave接口上面发送数据包,直到数据包发送完毕。提供负载均衡和容错的能力,总带宽是两个接口的带宽总和。实际使用中需要接入交换机做端口聚合。
2)mode=1(active-backup)
表示主备模式,即同一时间时只有一个slave被激活,只有活动的slave接口失效时,其他的slave才会被激活。这种模式可以提供较高的冗余性,但是链路利用率低,不论几块网卡只有1块在工作。
3)mode=2(balance-xor)(平衡策略)
基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力,需要交换机配合,这种模式一般使用较少。
4)mode=3(broadcast)(广播策略)
表示所有包从所有绑定的网络接口发出,不考虑均衡流量的分担,只有冗余机制,但过于浪费资源。这种模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。
5)mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)
表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)。协议标准要求所有设备在聚合操作时,要在同样的速率和双工模式。通过创建一个聚合组,共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。
6)mode=5(balance-tlb)(适配器传输负载均衡)
这种模式是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。它不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
7)mode=6(balance-alb)(适配器适应性负载均衡)
在5的tlb基础上增加了rlb(接收负载均衡receiveload balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。总带宽是每个网口的带宽综合。
模式1、模式5和模式6不需要交换机端的设置,网卡能自动聚合。模式4需要支持802.3ad。模式0,模式2和模式3理论上需要静态聚合方式。
bond模式的选择要根据应用中的需要进行选择,在实际环境中,模式0,1,4,6使用较多。
如果交换机及网卡都确认支持802.3ad,则实现负载均衡时尽量使用mode 4以提高系统性能。下面介绍一下通过DPDK开发套件实现DPU上对bond的支持。
三、dpdk的bond实现
随着软件定义网络SDN的不断发展,网络数据转发面的需求越来越多样化,需要更快的数据包处理速率,更高的网络吞吐带宽,更灵活的自定义网络协议。传统的硬件设备无法满足网络协议的自定义,而基于Linux内核网络协议栈的网络数据转发则存在处理流程繁琐,效率低下的问题。在这样的背景下,Intel公司提供了一款高性能网络数据平面开发套件DPDK(data plane development kit),它提供了一个简单方便的,完整的,快速的数据包处理解决方案。
目前,DPDK被广泛应用在网络转发组件的开发当中,如负载均衡网关,NAT网关,虚拟机交换机OVS也包含了对DPDK的支持。由于DPDK能够向网络转发面组件提供快速高效的对原生数据包进行处理的能力,其在DPU的研发上也扮演着重要的角色。
作为DPU上重要的开发套件,DPDK也提供了对网卡bond的支持。DPDK支持网卡的bond,通过调用一系列的API完成bond接口的创建,初始化和报文收发动作。bond口和普通dpdk口通过统一的API实现网卡的初始化、报文的收发等操作。
DPDK支持的bond模式和linux支持的bond模式一样,对应以下7种:
宏 |
模式 |
含义 |
BONDING_MODE_ROUND_ROBIN |
0 |
轮询 |
BONDING_MODE_ACTIVE_BACKUP |
1 |
主备 |
BONDING_MODE_BALANCE |
2 |
负载均衡,支持l2,l2+l3,l3+l4 |
BONDING_MODE_BROADCAST
|
3 |
广播,报文复制给所有网卡 |
BONDING_MODE_8023AD |
4
|
链路聚合 |
BONDING_MODE_TLB
|
5
|
根据slave口的负载,动态分配出口流量 |
BONDING_MODE_ALB
|
6
|
包含mode5的基础上,根据负载情况,动态分配入口流量 |
bond口创建的一般流程:
Step 1、创建slave口
Step 2、slave口配置网卡队列、网口启动
Step 3、创建bond口
Step 4、bond口添加slave口
Step 5、bond口配置网卡队列、网口启动
Step 6、通过bond口id进行收发包
DPDK提供了一系列的库函数实现bond功能:
1)创建bond口:rte_eth_bond_create,通过指定网口名称、bond模式、numa节点id,以确定资源的分配,函数原型如下:
bond口和普通dpdk口的id不会冲突,如dpdk接管了2个网口,id分别是0和1,这两个口绑定的bond口,id为2.
2)负载均衡策略设置:rte_eth_bond_xmit_policy_set,bond口运行在mode 2时,支持多种形式的负载均衡策略,通过rte_eth_bond_xmit_policy_set指定使用哪种策略:
可以设置的负载均衡策略包含以下几种:
BALANCE_XMIT_POLICY_LAYER2 根据MAC地址负载均衡
BALANCE_XMIT_POLICY_LAYER23 根据MAC+IP地址负载均衡
BALANCE_XMIT_POLICY_LAYER34 根据IP+端口负载均衡
3)添加bond成员口:rte_eth_bond_slave_add,指定bond口由哪些dpdk口聚合而成。函数原型如下:
4)获取指定bond口的成员口数目:rte_eth_bond_active_slaves_get,获取指定bond口的状态正常的slave口数目,返回正常slave口的数目和port id列表。函数原型如下:
5)释放bond口:rte_eth_bond_free,释放一个已经创建的bond口。函数原型如下:
更多的接口函数可以参考:
https://doc.dpdk.org/api/rte__eth__bond_8h.html#afcb02e4c1ef90dd0761beafdaba65e35
参考:
https://www.jianshu.com/p/3a3253ff4f1f
https://blog.csdn.net/a3876247995/article/details/123151912