前言

最近在部署项目时遇到了一小问题,需要在两台服务器之间建立一条高速链路进行数据传输,但是这两台机器并没有万兆网卡。

不过,这两台服务器各有4个千兆网卡,如果对其进行聚合,或许可以在不添置硬件的情况下得到翻倍的传输速率?

抱着这样的想法,展开了本次调研。

桥接(Bridge)

桥接可以简单理解成,使多张网卡处于同一VLAN;在网段相同的情况下,接入同一VLAN的设备可以相互通信。

操作流程

  • 建立文件/etc/sysconfig/network-scripts/ifcfg-virbr0,并设定对应IP。
DEVICE="virbr0"
BOOTPROTO="static"
IPADDR="192.168.100.201"
NETMASK="255.255.255.0"
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
  • 修改需要桥接的网卡配置文件ifcfg-xxx,例如这里是修改ifcfg-em2
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=em2
UUID=8ef001df-9b86-418f-bb26-cae983a39a93
DEVICE=em2
ONBOOT=yes
# 添加/修改以下内容
BOOTPROTO=none
BRIDGE=virbr0
NM_CONTROLLED=no
  • 修改其它需要桥接的网卡配置文件,并添加同样的配置内容,最后重启网络即可。
systemctl restart network

结论

桥接可以使一台设备模拟成一台交换机,但如果尝试将同一台设备用多根网线接入到这台交换机,便会出现类似环路的情况,导致网络无法正常通信。

桥接方案并不能解决大带宽需求的问题,但是将服务器作为交换机使用也算一个比较实用的解决方案。(比如,需要在多台万兆设备间进行通信,又不想添置万兆交换机的情况下,可以节约一笔开支

汇聚(Bond)

在尝试了桥接无法达到预期的效果后,继续调研发现了网卡汇聚的方法。

操作流程

  • 建立文件/etc/sysconfig/network-scripts/ifcfg-bond0,并设定对应IP。
DEVICE=bond0
NAME=bond0
BOOTPROTO=none
ONBOOT=yes
TYPE=Bond
BONDING_MASTER=yes
BONDING_OPTS="mode=0 miimon=100"
IPADDR=192.168.100.201
PREFIX=24
GATEWAY=192.168.100.100
  • 修改需要桥接的网卡配置文件ifcfg-xxx,例如这里是修改ifcfg-em2
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=em2
UUID=8ef001df-9b86-418f-bb26-cae983a39a93
DEVICE=em2
ONBOOT=yes
# 添加/修改以下内容
BOOTPROTO=none
USERCTL=no
MASTER=bond0
SLAVE=yes
  • 修改其它需要桥接的网卡配置文件,并添加同样的配置内容,最后重启网络即可。
systemctl restart network

结论

汇聚可以同时利用多张网卡进行通讯,在数据传输时会不断进行轮换(mode=0);但当其中一条链路断开时,吞吐量会严重下降,甚至达不到单张网卡的满载速率。

与桥接不同,汇聚只能接入单台设备,并需要两端设备完成同样的配置,否则无法正常通信。

完成配置后,两台设备间突破了千兆的传输速率,但是并没有得到带宽翻倍的效果,或许是存在CPU瓶颈?(没时间深挖背后的原因了,有空再调研一下

无论是聚合两张网卡,还是三张网卡,数据传输时最终都仅得到 170+MB/s(比千兆多一点),即使协商速率是 2000Mb/s,实际应用达不到满载速率的话,其实意义不大。

最终结论

  • 采用汇聚两张千兆网卡突破千兆速率,便是在不添置硬件前提下的最优解。