事情是这样的,我在Windows宿主机上,通过VirtualBox构建了一个CentOS虚拟机,想用该虚拟机作为对接局域网内机器的一个跳板机。
今天从局域网一台Linux服务器上往虚拟机中拷贝一个文件时,发现速度只有可怜的几十KB,我果断停掉,重新再拷贝,速度还是慢的可怜,把rsync换成scp之后,照样不行!局域网千兆网络,速度到不了百兆,怎么也得几十MB呀,真的是惊出我一身冷汗!!!听我慢慢给大家道来。
首先给大家介绍一个linux上好用的,测服务器间网络速度、带宽、丢包率的软件 iperf3,在两台服务器间都安装该软件,如果服务器不可联网,可以在一台能联网的服务器上安装好后,将可执行文件拷贝过来直接使用也可以。
1. iperf3安装及使用
安装命令:
在目标服务器上运行:
在虚拟机上运行:
- -P,--parallel 4,同时建立 4 条 TCP 连接一起测速,目的是把带宽跑满,才能测试出真实的最大带宽
- -R,--reverse,测试反向流量(服务端 → 客户端)
2. iperf3测速
用iperf3测试虚拟机与目标服务器的传输速度,本次测试使用的是单线程(-P 1),结果如下,发送(sender)速度为 366/8 ≈ 46KB/s,接收(receiver)速度 286/8 ≈ 36KB/s,这个速度对于局域网来说肯定是不正常的,于是开始一通搜索如何解决。
先是各种调整virtualbox上虚拟机的各种参数:网络模式(使用桥接模式)、增加CPU个数、网卡控制芯片类型(改为virtio-net)、关闭宿主机防火墙等等,总之都是没有改善。
[ ID] Interval Transfer Bandwidth[ 4] 0.00-1.00 sec 7.07 KBytes 57.9 Kbits/sec [ 4] 1.00-2.00 sec 17.0 KBytes 139 Kbits/sec [ 4] 2.00-3.01 sec 35.4 KBytes 287 Kbits/sec [ 4] 3.01-4.00 sec 35.4 KBytes 292 Kbits/sec [ 4] 4.00-5.00 sec 28.3 KBytes 232 Kbits/sec [ 4] 5.00-6.00 sec 35.4 KBytes 289 Kbits/sec [ 4] 6.00-7.00 sec 35.4 KBytes 290 Kbits/sec [ 4] 7.00-8.01 sec 28.3 KBytes 229 Kbits/sec [ 4] 8.01-9.01 sec 35.4 KBytes 290 Kbits/sec [ 4] 9.01-10.02 sec 28.3 KBytes 231 Kbits/sec - - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bandwidth Retr[ 4] 0.00-10.02 sec 366 KBytes 300 Kbits/sec 140 sender[ 4] 0.00-10.02 sec 286 KBytes 234 Kbits/sec receiver
3. 终极解决方案
经过一番折腾,最后查到可能和这个有关:
Windows 网卡的 Offload / Checksum 功能与虚拟桥接冲突。
按照前辈们的方法,参考下图调整宿主机的网卡配置,控制面板 → 网络和共享中心 → 更改适配器设置 → 右键物理网卡 → 属性 → 配置 → 高级打开下图这个弹框:
图1. 将图中红框几个参数全部改为”关闭“状态
好了,我们再测试一遍网速,可以看到网速来到了 1.03 GBytes ,是不是正常呢?是的!这就是我们常说的千兆网卡(千兆实际就是1000 Bytes/字节)对应的速度,那换算成MB,就是 1.03*1000/8 ≈ 129 MB/s,但是我们日常用scp、rsync拷贝文件时并达不到这个速度,为什么呢?
给大家解释一下:iperf3测试的是网卡→网卡间的极限理论速度,而我们真正拷贝数据时,数据传输路径是:磁盘→内存→网络→内存→磁盘,多了两段磁盘 IO,加上数据传输中会进行一些校验,所以真实传输速度就会下降一些。
图2. 修改宿主机网卡配置后,再次测速