万兆网络有多快?实测一把先!
我家里一直是千兆网络,所以机器之间的传输就是1000M,换成字节就是110MB/s
一般来说这个速度还是很OK的,传输个大文件,比如4G的ISO,也就是40秒左右搞定。但是最近需要对虚拟机进行备份和转移等操作,一台虚拟机加上snapshot大概有100G+,这时候使用千兆网络就比较慢了。
万兆交换机太贵,所以使用简单一点的方案,两个万兆网卡直连。
网卡使用intel的X540-T2。这个卡虽然不是最新版本的,但是好在价钱合理一些。500RMB左右就可以搞定一个。
X540有两种,一种带风扇,一种不带。NAS的PCI槽散热不算太好,所以使用带风扇的网卡,X10DRL的散热好一些,使用不带风扇的网卡。
两个机器的操作系统都是FreeBSD 12.0R,网卡安装完,重起机器之后顺利被系统识别。X540-T2的两个网卡被识别成ix0和ix1.
FreeBSD的interface名称是按照驱动名称+网卡发现顺序编号来决定。10G的网卡是intel提供的ix驱动。
我们将一个已经连接完网线的ix1 up一下,并配置相应的IP。(网线比较短时,CAT5e的网线足以胜任10G网络)
可以看到ix1是UP状态,并且status是active,10Gbase-T的协商速度
两台机器都设置好网络之后,互相ping OK。
接下来我们就要开始测试互联的速度了。使用的工具就是比较有名的测速工具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] [ <=> ]