上周客户在微信上找我,说他们往服务器传备份文件特别慢。以前一百多兆每秒的速率,那天只有 10MB/s 出头,传一个 40 多 G 的库,照这速度得传一个多小时。
客户原话是:"勇哥,是不是硬盘不行了?要不要换块盘?"他这么一说,我第一反应也顺着往磁盘上想。那台机器是台戴尔 R640,跑了四年多,客户做电商的,数据量涨得凶,怀疑盘有毛病也算合理。
远程上去先看了 iostat -x 1,盯了两分钟:
Device: rrqm/s wrqm/s await svctm %util
sda 0.33 12.67 2.10 0.42 8.6
util 才百分之八点几,await 两点几毫秒,盘健康得很。又看了 dmesg,没有 IO error,没有链路重置的记录。内存、CPU 占用也都没问题。那会我已经有点懵了,机器本身看不出任何毛病,可客户那边传输速率就是上不去。
我让客户再传一次,我在服务器上拿 iftop 盯着看。奇怪的地方来了:流量稳定在 10MB/s 上下,特别平,一点波动都没有。这个"特别平"其实是个线索,我当时没抓住——磁盘慢的话速率是抖的,这么稳的速率更像被什么东西卡死在某个上限上。
我盯着 iftop 的输出想了半天,才反应过来:10MB/s 出头,这数字眼熟。百兆网口的理论极限是 12.5MB/s,刨掉开销,实际能跑到的就是 10 上下。这哪是磁盘的事,是链路被压到 100M 了。
ethtool eth0 一敲,答案直接摆在脸上:
Speed: 100Mb/s
Duplex: Full
Link detected: yes
千兆的板载网卡,跑在百兆上。网卡没坏、没降级报错,就是老老实实协商成了 100M。
那问题就变成了:谁把它协商成百兆的?网卡自动协商一般优先选最高的共同速率,只有对端或者链路本身不支持千兆,才会落到百兆。交换机端口是千兆的,排除了。剩下的就是线。
这里得说下我的失误。那台机器上周刚让机房现场的人动过——客户加了一块硬盘,机器抽出来装完又推回去了。当时谁也没在意那根网线,抽拉机箱的时候线在理线槽里别了一下,看着没断,就没管。
千兆传输要用满 8 芯,而百兆只需要 1、2、3、6 这四芯。所以线要是折了其中几芯但关键的 4 芯还通着,表现就是:网卡照样 link up,速率悄悄掉到 100M,看着一切正常,实际慢十倍。这种故障最坑的地方就在这——它不报错,它只是慢。
让现场同事换了根新的六类跳线,ethtool 再看:
Speed: 1000Mb/s
Duplex: Full
客户再传,速率回到 110MB/s 左右,40G 的库十来分钟传完。
收尾的事我做了两件:一是让现场以后凡是把机器抽出来再推回去,顺手拿测线仪把网线过一遍,一分钟的事,别省;二是跟客户解释清楚不是硬盘的问题,他之前还念叨着要不要花两千多换块企业盘,这下省了。
那根被别坏的旧跳线我让同事留着,拆开看过,水晶头里有两根芯的金属片明显压塌了,但线序还通着——就是这种"半死不活"的状态最骗人。
后来我自己琢磨,这故障要是发生在半夜,客户传不上来东西直接报障,我八成得在远程排查上耗更久。好在是白天,客户耐心也多,不然按我一开始怀疑磁盘那个思路,指不定折腾到什么时候去。
评论