公众号旧文

为什么 3Mbps 的小水管,能跑出 30Gbps?

作者:胖子阅读 —

我有一台 3Mbps 的阿里云ECS:

图片

这台服务器的公网出口带宽上限,也就是 3Mbps。

但刚刚,我突发奇想,在这台 2核2G 的 阿里云 ECS 的小水管上。

跑出了 30Gbps

没错,不是 30Mbps,而是 30000Mbps

相差整整一万倍。

这到底是怎么回事?

一、第一层:服务器内部的理论带宽

首先,我测试了最经典的一种情况:

iperf3 -c 127.0.0.1 -P 8 -t 10

这里的 127.0.0.1,大家都知道是本机 IP。

但实际上,它是 Linux 内核里的一个特殊接口:

lo

数据路径大概是:

应用程序
→ Linux TCP/IP 协议栈
→ lo
→ Linux TCP/IP 协议栈
→ 应用程序

注意,在这个过程中:

  • 不经过网卡
  • 不经过交换机
  • 不经过公网
  • 不经过运营商

连网线都不存在。

本质上它测的是:

CPU + 内存 + Linux 内核

最终结果:

- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr

[SUM]   0.00-10.00  sec  34.9 GBytes  30.0 Gbits/sec    7             sender
[SUM]   0.00-10.00  sec  34.9 GBytes  30.0 Gbits/sec                  receiver
≈ 30Gbps

也就是说,虽然这台服务器公网只有 3Mbps

但在机器内部,却能轻松跑到 30000Mbps

二、第二层:虚拟网卡层

随后,我继续测试:

iperf3 -c 172.22.184.73 -P 8 -t 10

这里的 172.22.184.73 已经不是 loopback。

而是真正的 eth0 网卡。

虽然数据依然没有离开这台机器。

但已经开始经过:

  • virtio
  • vSwitch
  • hypervisor
  • 虚拟网卡驱动

于是速度掉到了:

[ ID] Interval           Transfer     Bitrate         Retr

[SUM]   0.00-10.01  sec  25.0 GBytes  21.4 Gbits/sec   12             sender
[SUM]   0.00-10.01  sec  25.0 GBytes  21.4 Gbits/sec                  receiver
≈ 21Gbps

你会发现,哪怕还没出公网。

仅仅只是多走了一层。

速度就已经开始变化了。

三、第三层:同机房内网

事实上,在进入公网之前。

还有非常重要的一层:同机房内网

比如:

北京阿里云 ECS A
↔
北京阿里云 ECS B

如果它们:

  • 在同地域
  • 同 VPC
  • 同交换网络

很多时候内网速度甚至可以达到:

1Gbps
10Gbps
甚至更高

而且很多云厂商的内网流量并不收费。

这时候,数据已经真正离开了机器。

开始经过:

  • 物理交换机
  • TOR
  • Spine
  • Leaf
  • 数据中心 Fabric

但还没有进入公网世界。

四、第四层:真正的公网世界

最后,我测试了真正的跨机器通信。

用这台北京阿里云 ECS 连接我的日本服务器。

结果自然变成了:

[ ID] Interval           Transfer     Bitrate         Retr

[SUM]   0.00-10.00  sec  5.25 MBytes  4.40 Mbits/sec  659             sender
[SUM]   0.00-10.27  sec  4.06 MBytes  3.32 Mbits/sec                  receiver
≈ 3Mbps

这时,购买机器时看到的:

公网带宽:3Mbps

终于真正开始生效。

因为数据已经真的离开了数据中心。

开始经过:

  • 云厂商公网出口
  • NAT
  • 跨境链路
  • 国际运营商
  • 海缆
  • TCP 拥塞控制

甚至还出现了大量:

Retr(TCP重传)

也就是说,这时候影响速度的。

已经不仅仅是带宽。

还有:

  • 延迟
  • 丢包
  • QoS
  • 路由质量
  • 跨境拥塞

五、最反直觉的地方

你会发现,同一台 3Mbps 小水管。

理论上可能同时存在四种速度:

30Gbps(内核层)
21Gbps(虚拟网卡层)
1~10Gbps(同机房内网)
3Mbps(公网出口)

而且它们全都是真的。

区别只在于你测的是哪一层。

很多人理解的网速,都是公网出口速度。

但在公网之前,在 Linux 内核里。

数据甚至可以以几十Gbps的速度疯狂搬运。

所以,带宽不是一个绝对数字,而是一个位置相关的数字。

你站在公网出口看,它是 3Mbps。

你站在 Linux 内核里看,它就是 30Gbps。

扩展阅读:

关于“胖子百科”被“网络技术联盟站”多次洗稿的说明

关于“胖子百科”被瑞哥小号“网络技术干货圈”更多次洗稿的说明

给 网络技术联盟站 瑞哥 的一封公开信