arp 实现网络传输速率倍增

2020/01/11 Linux Network

arp 实现网络传输速率倍增

测试目标

最近想要突破千兆交换机给定的极限,尝试过 bond6 实现,发现还是需要万兆交换机支持。

换个思路,先确定下目前的需求是什么:

一个主节点,配置了五个网口,每个网口配置一个 ip,定义为 192.168.1.1-5

五个普通节点,分别有一个网口且分配一个 ip,定义为 192.168.1.11-15

现在想达到的目标是:

- 五个普通节点分别向主节点的不同 ip 发数据,使得主节点的网络吞吐(进口)达到 5000 Mb/s
- 五个普通节点分别要求从主节点的不同 ip 取数据,使得主节点的网络吞吐(出口)达到 5000 Mb/s

测试方案也很简单,就是讲一个大文件通过 scp 传递或者要求接收的方式判断网络吞吐。

直观来看,这两个目标很容易达到,虽然连接在千兆交换机上,但是主节点连了五根线,理论可以达到 5000 Mb/s的。

实际测试过程

定义几个概念:

  • 主节点称为 m
  • 主节点的网口带上数字,记为 m1-m5
  • 普通节点称为 s,五个即 s1-25
  • 普通节点只有一个网络端口,所以网口和普通节点同名

定义两个测试过程:

  • s1-s5 分别向 m1-m5 发送数据,记为实验一
  • s1-s5 分别要求 m1-m5 发送数据,记为实验二

实验结果是:

  • 实验一的结果是,五个发送请求的带宽总和是 3000Mb/s
  • 实验二的结果是,五个拉取请求的带宽总和是 1000Mb/s

这个结果令我有些不解,开始用工具监控数据,但不再聚焦于五个普通节点,而是专门去监控主节点的五个网口。

分析过程

主节点的五个网口的数据,实验一中,m1:1000,m2:1000,m3:3000,m4:0,m5:0;实验二中m3:1000,其他都是0。

分析到这里能解释实验现场,但是根本原因还不明确,往底层去看,可能是网络层和链路层的问题,随之想到了 arp 协议。

arp 协议定义了 ip 和 mac 地址的关系,先查下每台机器的 arp 信息,下面是大致的信息:

# m
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.11     ether   b1:2e:99:63:6b:ca   C                     eno1
192.168.1.11     ether   b1:2e:99:63:6b:ca   C                     eno2
192.168.1.11     ether   b1:2e:99:63:6b:ca   C                     eno3
192.168.1.11     ether   b1:2e:99:63:6b:ca   C                     eno4
192.168.1.11     ether   b1:2e:99:63:6b:ca   C                     eno5
192.168.1.12     ether   b1:2e:99:63:6b:cb   C                     eno1
192.168.1.12     ether   b1:2e:99:63:6b:cb   C                     eno2
192.168.1.12     ether   b1:2e:99:63:6b:cb   C                     eno3
192.168.1.12     ether   b1:2e:99:63:6b:cb   C                     eno4
192.168.1.12     ether   b1:2e:99:63:6b:cb   C                     eno5
192.168.1.13     ether   b1:2e:99:63:6b:cc   C                     eno1
192.168.1.13     ether   b1:2e:99:63:6b:cc   C                     eno2
192.168.1.13     ether   b1:2e:99:63:6b:cc   C                     eno3
192.168.1.13     ether   b1:2e:99:63:6b:cc   C                     eno4
192.168.1.13     ether   b1:2e:99:63:6b:cc   C                     eno5
192.168.1.14     ether   b1:2e:99:63:6b:cd   C                     eno1
192.168.1.14     ether   b1:2e:99:63:6b:cd   C                     eno2
192.168.1.14     ether   b1:2e:99:63:6b:cd   C                     eno3
192.168.1.14     ether   b1:2e:99:63:6b:cd   C                     eno4
192.168.1.14     ether   b1:2e:99:63:6b:cd   C                     eno5
192.168.1.15     ether   b1:2e:99:63:6b:ce   C                     eno1
192.168.1.15     ether   b1:2e:99:63:6b:ce   C                     eno2
192.168.1.15     ether   b1:2e:99:63:6b:ce   C                     eno3
192.168.1.15     ether   b1:2e:99:63:6b:ce   C                     eno4
192.168.1.15     ether   b1:2e:99:63:6b:ce   C                     eno5

# s1
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.1      ether   b1:2e:99:63:6b:c1   C                     eno1

# s2
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.2      ether   b1:2e:99:63:6b:c2   C                     eno1

# s3
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.3      ether   b1:2e:99:63:6b:c3   C                     eno1

# s4
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.4      ether   b1:2e:99:63:6b:c3   C                     eno1

# s5
$ arp -n
Address          HWtype  HWaddress           Flags Mask            Iface
192.168.1.5      ether   b1:2e:99:63:6b:c3   C                     eno1

我们可以从 arp 结果中看到,普通节点 s3-s5 虽然请求的 ip 不一致,但是返回的 mac 地址一样,交换机就只会从对应的口出去。

根据 arp 的定义以及执行过程来看,应该不会出现这个问题啊?问题到底出在哪里?

查了很多资料,发现了一个概念,ip 只是一个概念,它代表着网络中的一个节点,而不代表着网卡,这意味着 ip 可以出现在任何网卡,同一个网卡也可以有多个 ip;而 arp 协议的实现和 ip 在哪一块网卡上没有关系,换言之,有一个 arp 请求 192.168.1.1 的 mac 地址,这台机器接到了请求,说:“好,我的 ip 就是 192.168.1.1,我的 mac 地址是 xxx”,这个 mac 地址是所有网卡中随便选一个的,和 ip 地址没有关系。

既然知道了发生的原因,可以说 arp 协议当时的想法没那么完善,那么有没有办法解决这个问题,让回应的 mac 地址就是 ip 对应网卡的地址呢?

解决方法

# m 主节点
# 为什么是这两个参数?参阅 https://lp007819.wordpress.com/2014/07/27/linux-%E5%A4%9A%E7%BD%91%E5%8D%A1%E5%A4%9Aip%E5%90%8Clan%EF%BC%88vlan%EF%BC%89%E4%B8%8B%E7%9A%84%E9%97%AE%E9%A2%98/
$ sysctl -w net.ipv4.conf.eno1.arp_announce=2
$ sysctl -w net.ipv4.conf.eno1.arp_ignore=1
$ sysctl -w net.ipv4.conf.eno2.arp_announce=2
$ sysctl -w net.ipv4.conf.eno2.arp_ignore=1
$ sysctl -w net.ipv4.conf.eno3.arp_announce=2
$ sysctl -w net.ipv4.conf.eno3.arp_ignore=1
$ sysctl -w net.ipv4.conf.eno4.arp_announce=2
$ sysctl -w net.ipv4.conf.eno4.arp_ignore=1
$ sysctl -w net.ipv4.conf.eno5.arp_announce=2
$ sysctl -w net.ipv4.conf.eno5.arp_ignore=1
$ ip neigh flush  dev name
# 每台发送机器主动 ping 对应的 ip 地址,拿到真实的 mac 地址
# s1
$ ip neigh flush  dev name
$ ping 192.168.1.1
# s2
$ ip neigh flush  dev name
$ ping 192.168.1.2
# s3
$ ip neigh flush  dev name
$ ping 192.168.1.3
# s4
$ ip neigh flush  dev name
$ ping 192.168.1.4
# s5
$ ip neigh flush  dev name
$ ping 192.168.1.5

再次分别看每台节点的 arp 信息,发现这样就可以了。

再次测试

再次测试实验一和实验二。

实验一可以达到 5000 Mb/s,符合预期。

实验二依旧是 1000 Mb/s,再次探究为什么会是这样。

观察主节点的 arp 信息,发现五个网口都可以发送数据给五个对应的普通节点(共计 25 条 arp 记录),所以实验二要求发送就无法指定用那块网卡,出口系统自己选择,所以还是 1000 Mb/s,那么这个有没有办法解决呢?不清楚,该睡觉了,先给个总结。

本质问题在于:只能通过指定 mac 的方式(配置目标机器的内核参数+ping 目标机器拿到对应的 mac)选择终点,而无法选择自己的起点。因为上层应用对下层无感知。

解决发送满负载问题

arp 只是个映射协议,它不能控制网络的流动,网络能够正常访问的根本是路由

如果一个网卡配了多个 ip,那么可以为每一个 ip 定义一个路由,那么上层应用使用这个 ip 的时候,底层走的线路就是路由定义的;换个思路,如果多个网卡,每个配一个 ip,对这些 ip 定义路由,能不能解决出口满负载的问题?

这个想法暂时没办法验证(太忙了),理论可行,操作可行,但是过于复杂了,不如上万兆光纤解决!或者 万兆交换机 + bond6 实现。

参考

Search

    Table of Contents