MTU 9000和1500不一致为什么会慢
MTU 就是一个数据包在链路上一次能装下的最大尺寸,单位是字节。平时家用和公网最常见的 MTU 是 1500,这是以太网的标准值;而很多云厂商的内网会把网卡默认设成 9000,也就是常说的巨型帧。单看数字,9000 好像更能装、效率更高,但只要这台机器要走公网,9000 和 1500 不一致就会变成慢的根源。
先说正常情况。一个 9000 字节的大包要从内网走到公网,中间只要有一段链路只支持 1500,这个大包就必须被拆开,也就是分片。分片本身不免费:发送方、中间设备、接收方都要多做一份拆包和组包的工作,任何一个分片丢了,整包都得重传。更麻烦的是,现在很多数据包都带了“不许分片”标志,中间设备拆不了,只能把包丢掉,再回一个“包太大、请改小”的 ICMP 报文。如果这条 ICMP 报文在半路被防火墙拦住,发送方就永远等不到提醒,只能一次次超时重发,这就是常说的黑洞问题。表面上看网络是通的,实际上大包全卡住,小包却能过去,于是出现时快时慢、有的网站能开、有的下载一动不动的怪现象。
TCP 也会跟着受影响。TCP 握手时会根据 MTU 算出一个合适的报文段大小,MTU 不一致会让这个协商结果失真,发送方按大尺寸发,中间又被拆、被丢,重传一多,拥塞控制就会把发送窗口压下来,速度自然上不去。晚高峰本来就挤,再加上重传,延迟和抖动都会被放大。
怎么判断是不是 MTU 的问题,有两个简单的办法。一是看本机网卡的 MTU,用 ip link 就能看到当前值;二是拿 ping 做探测,带上不许分片的参数,从大到小试,看多大的包开始不通,就能大致摸到路径上最小的那一段 MTU。注意要分清“内网能通”和“公网能通”是两回事,内网 9000 通,不代表公网 9000 通。
解决思路也很直接:要走公网的网卡,MTU 改成 1500,让它和公网链路保持一致。改的时候要分清临时和永久,命令行改完当时生效,重启就没了;想长期生效,要写到系统的网络配置文件里,改完再确认一次当前值和配置文件里的值是一致的,否则重启后又会回到 9000,问题隔段时间又复发。只在确定全程都支持巨型帧的纯内网链路上,才适合保留 9000。
一句话总结:MTU 不是越大越好,而是要和整条路径上最小的那一段保持一致。公网环境下把出口网卡统一成 1500,往往比折腾别的调优参数更见效。
- 点赞
- 收藏
- 关注作者
评论(0)