首发于 NAS DIY之家
万兆网络有多快?实测一把先!

万兆网络有多快?实测一把先!

我家里一直是千兆网络,所以机器之间的传输就是1000M,换成字节就是110MB/s

一般来说这个速度还是很OK的,传输个大文件,比如4G的ISO,也就是40秒左右搞定。但是最近需要对虚拟机进行备份和转移等操作,一台虚拟机加上snapshot大概有100G+,这时候使用千兆网络就比较慢了。

万兆交换机太贵,所以使用简单一点的方案,两个万兆网卡直连。

网络拓扑图

网卡使用intel的X540-T2。这个卡虽然不是最新版本的,但是好在价钱合理一些。500RMB左右就可以搞定一个。

X540有两种,一种带风扇,一种不带。NAS的PCI槽散热不算太好,所以使用带风扇的网卡,X10DRL的散热好一些,使用不带风扇的网卡。

带风扇版本的X540-T2
不带风扇的X540-T2

两个机器的操作系统都是FreeBSD 12.0R,网卡安装完,重起机器之后顺利被系统识别。X540-T2的两个网卡被识别成ix0和ix1.

dmesg的输出结果

FreeBSD的interface名称是按照驱动名称+网卡发现顺序编号来决定。10G的网卡是intel提供的ix驱动。

我们将一个已经连接完网线的ix1 up一下,并配置相应的IP。(网线比较短时,CAT5e的网线足以胜任10G网络)

ifocnfig的输出

可以看到ix1是UP状态,并且status是active,10Gbase-T的协商速度

两台机器都设置好网络之后,互相ping OK。

可以ping通对方

接下来我们就要开始测试互联的速度了。使用的工具就是比较有名的测速工具iperf3。

iperf有2.0版本和3.0版本。2.0版本的包名称是iperf, 3.0版本的包名称是iperf3

root@x10drl:~ # pkg instal iperf3
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
	iperf3: 3.7
Number of packages to be installed: 1
120 KiB to be downloaded.
Proceed with this action? [y/N]: y
[1/1] Fetching iperf3-3.7.txz: 100%  120 KiB 123.3kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/1] Installing iperf3-3.7...
[1/1] Extracting iperf3-3.7: 100%

FreeBSD中使用pkg来管理软件包,所以用命令pkg install iperf3来安装iperf3软件包。

iperf的测试原理,两台机器,其中一台当服务端,一台当客户端。我们这次让NAS当服务端,X10DRL当服务端。

NAS执行下面的命令启动服务端

root@nas:~ # iperf3 -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------

X10DRL使用下面的命令开始测试

root@x10drl:~ # iperf3 -i1 -t10 -c 192.168.10.253
Connecting to host 192.168.10.253, port 5201
[  5] local 192.168.10.25 port 14948 connected to 192.168.10.253 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   970 MBytes  8.13 Gbits/sec    0    462 KBytes       
[  5]   1.00-2.00   sec  1.10 GBytes  9.42 Gbits/sec    0    920 KBytes       
[  5]   2.00-3.00   sec  1.10 GBytes  9.42 Gbits/sec    0   1.34 MBytes       
[  5]   3.00-4.00   sec  1.10 GBytes  9.42 Gbits/sec    0   1.76 MBytes       
[  5]   4.00-5.00   sec  1.10 GBytes  9.41 Gbits/sec    0   1.76 MBytes       
[  5]   5.00-6.00   sec  1.10 GBytes  9.41 Gbits/sec    0   1.76 MBytes       
[  5]   6.00-7.00   sec  1.10 GBytes  9.41 Gbits/sec    0   1.77 MBytes       
[  5]   7.00-8.00   sec  1.10 GBytes  9.41 Gbits/sec    0   1.77 MBytes       
[  5]   8.00-9.00   sec  1.10 GBytes  9.41 Gbits/sec    0   1.77 MBytes       
[  5]   9.00-10.00  sec  1.10 GBytes  9.41 Gbits/sec    0   1.77 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  10.8 GBytes  9.28 Gbits/sec    0             sender
[  5]   0.00-10.01  sec  10.8 GBytes  9.28 Gbits/sec                  receiver

命令行中,-i1表示每隔一秒输出中间结果,-t10表示测试10秒,-c 192.168.10.253表示连接192.168.10.253服务端

结果还不错!9.28Gbit/sec,但是还没有达到10G的速度。什么原因?

缺省的网卡设定中,MTU是1500,也就是一个IP包大小是1500,对于10G网络来说,包太小,意味着相同数据量,包的数量多,每个包的头部数据将消耗大量的网络带宽。接下来将MTU设置成9000看一下结果

root@x10drl:~ # ifconfig ix1 mtu 9000
root@x10drl:~ # iperf3 -i1 -t10 -c 192.168.10.253
Connecting to host 192.168.10.253, port 5201
[  5] local 192.168.10.25 port 49956 connected to 192.168.10.253 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   954 MBytes  8.00 Gbits/sec    0    446 KBytes       
[  5]   1.00-2.00   sec  1.15 GBytes  9.90 Gbits/sec    0    893 KBytes       
[  5]   2.00-3.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.28 MBytes       
[  5]   3.00-4.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.70 MBytes       
[  5]   4.00-5.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
[  5]   5.00-6.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
[  5]   6.00-7.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
[  5]   7.00-8.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
[  5]   8.00-9.00   sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
[  5]   9.00-10.00  sec  1.15 GBytes  9.90 Gbits/sec    0   1.78 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  11.3 GBytes  9.71 Gbits/sec    0             sender
[  5]   0.00-10.00  sec  11.3 GBytes  9.71 Gbits/sec                  receiver

较刚才MTU1500的结果有了很大的提升,第二秒开始之后速度稳定在9.90Gbits/sec。

为何第一秒是8.0Gbits/sec呢?因为我们现在测试时使用TCP协议,有一个收发窗口,所以速度有一个上升过程。


10G的网络速度已经达成!,接下来我们来看看传输一个虚拟机需要花费多久。

首先使用我千兆网是传输虚拟数据中使用的命令

root@x10drl:~ # zfs send zones/vm/sw211@20190803 | pv | ssh 192.168.10.253 zfs recv -F zones/vmm/test1
Password for root@nas:16.0KiB 0:00:02 [0.00 B/s] [ <=>                                                             ]
72GiB 0:00:13 [ 176MiB/s] [              <=>                                               ]

什么?怎么才176MiB/s的速度?才是万兆的五分之一!

原来通过ssh传输数据时,客户端有一个加密过程,服务段有一个解密过程,这个过程需要耗费CPU时间,从服务端的top命令中就可以看出来ssh已经使用了一个核心的100%CPU。

  PID USERNAME    THR PRI NICE   SIZE    RES STATE    C   TIME    WCPU COMMAND
10268 root          1  96    0    22M    12M CPU10   10   0:15 102.22% sshd

知道问题所在之后,我们在传输数据时避开加密和解密这个过程,在这里我们使用netcat这个工具。

先在服务端起动netcat。(netcat和pv同样可以通过pkg包管理安装)

root@nas:~ # nc -l 1234 | pv | zfs recv -F zones/vm/test2

我们在客户端发送虚拟机快照

root@x10drl:~ # zfs send zones/vm/sw211@20190803 | pv | nc 192.168.10.253 1234
4.59GiB 0:00:09 [ 553MiB/s] [          <=>                                                   ]
9.55GiB 0:00:19 [ 479MiB/s] [                       <=>                                      ]
14.7GiB 0:00:29 [ 509MiB/s] [                                   <=>                          ]