痛点
经常要向服务器上传下载数据,但是我的传输速度只有 10MB/s,传输个大一点的数据集就要几个小时,严重影响了工作效率。
和同事们吐槽时,海军说他与服务器或者与贝贝的机器之间传输速率能到 100MB/s,但是和会长的机器之间只能到 10MB/s。
看样子应该不是服务器的问题,一定是我的机器哪里配置的有问题。
但是平时需要传大数据的时候不多,于是一直没动力去排查这个问题。
今天又要传个数据集到服务器上,看着那龟速简直不能忍,下定决心一定要搞定这个问题。
排查过程
(一)代理排查
海军说可能是网络代理的原因,有道理,因为我和会长的机器共同点是都用了一样的代理,如果数据绕道代理一定会降速。
但是如果绕道应该不会达到 10MB/s 这么快,我一般外网的最高下载速度是 2MB/s。
姑且一试,我把代理关了,甚至把和代理相关的软件比如 proxychains 都卸载了,然后试验,仍然是 10MB/s。
(二)软件排查
因为我传输一般用 scp,我想可能是 scp 设置不对?
于是翻看了文档和教程,用了加速的命令,试验下来对一些数据有速度提升,但是达不到 100MB/s。
(三)网卡排查
在网上的帖子中,有一个运维记录了这样的问题,他的局域网内几台交换机网络传输速度慢,经过排查,发现是有的机器是全双工状态,有的是半双工状态,将状态改成自适应后,故障解决。
这个和我遇到的问题很相似,而且 10MB/s 和 100MB/s 差不多就是百兆网口和千兆网口的最大速率,于是开始排查网卡的问题。
解决方案
1
2
ifconfig # 看激活的网卡名字
sudo ethtool enp2s0 # 查看网卡信息
我的机器输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Settings for enp2s0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: d
Current message level: 0x00000033 (51)
drv probe ifdown ifup
Link detected: yes
海军的机器输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Settings for enp0s31f6:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: on (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
可以看到 Speed 一栏,海军的是 1000Mb/s,我的是 100Mb/s,差不多就分别代表了我们的 100MB/s 和 10MB/s 的速度,虽然自适应打开了,但不知道为啥给我设置的是 100Mb/s 的速度,明明可以支持 1000Mb/s 的。
设置网卡:
1
2
3
4
5
6
7
8
9
sudo ethtool -s enp2s0 autoneg on speed 1000 duplex full #手动设置网卡为自适应,速度为 1000,全双工模式
# 说明
#修改linux网卡的工作模式:
ethtool –r ethX ## 重置 ethX 网口到自适应模式
ethtool –S ethX ## 查询 ethX 网口收发包统计
ethtool –s ethX [speed 10|100|1000] ## 设置网口速率 10/100/1000M
[duplex half|full] ## 设置网口半/全双工
[autoneg on|off] ## 设置网口是否自协商
再次试验,和服务器之间的速度变成 101MB/s!
原来要传输一个小时的文件,现在几分钟就搞定! enjoy!
Tips
一、设置网卡的命令除了 ethtool
还有 mii-tool
,但是 mii-tool
只能支持百兆网卡设备,除非有些比较老的网卡只能支持 mii-tool
,一般不建议使用。除了上面的用法,这两个命令还有很多功能,感兴趣的可以研究下。
二、网上说上面的设置重启后会失效,如果要永久更改,需要修改相应的配置文件,但是我重启后 Speed 仍然是1000,所以更改配置的方法就没试,就不写在博客里了。
三、用 scp 传输低压缩率的数据的时候,可以加上 -C,scp 会先压缩后传输,传输速率会大大提高。加快压缩命令可参考:scp -P port -C ufile user@host:~/ufile