业务刚上线时访问很快,过了一阵子用户开始反馈"卡""点一下转半天",运维登录服务器看 CPU、内存、磁盘都正常,top 里也看不到异常进程——这种时候,问题多半在网络链路上。服务器网络延迟高是一个典型的"分段问题":从用户终端到机房网卡,中间要跨过本地宽带、运营商城域网、骨干网、国际出口、机房入口、IDC 内部交换、服务器协议栈等七八个环节,任何一跳出现拥塞、丢包或路由绕路,最终都会表现成"延迟高"这一个症状。本文按从近到远的顺序,给出一套可执行的排查路径:先确认是不是自己的问题,再确认是不是机房的问题,最后判断是不是链路本身的物理属性。
一、先定位:延迟高到底高在哪一段
排查的第一原则是不要猜。很多同学一看到 ping 值大就立刻换机房,结果换了以后延迟依旧,因为真正的瓶颈在本地宽带或某个中间跳。正确做法是先用工具把链路拆开,拿到逐跳数据再下结论。
1.1 用 ping 拿到延迟与丢包的基线
ping 是最基础也最容易被误用的工具。只跑默认的 ping 1.2.3.4 只能拿到几个包的往返时间,样本太少,无法判断抖动。建议加大包数、缩短间隔,跑够 100 个包再看统计:
# 发 100 个包、间隔 0.2 秒,约 20 秒出结果 ping -c 100 -i 0.2 203.0.113.10 # 输出重点看最后几行 # 100 packets transmitted, 97 received, 3% packet loss, time 20134ms # rtt min/avg/max/mdev = 168.221/182.905/341.772/23.114 ms
这里 mdev(平均偏差)比 avg 更重要:如果 mdev 长期超过 avg 的 15%,说明链路存在明显抖动,即使平均值不高,用户侧的体感也会是"时快时慢"。丢包率超过 1% 就应该引起重视,超过 3% 基本可以判定该链路有问题。
1.2 用 MTR 做逐跳定位
ping 只能告诉你端到端的结果,mtr 把 ping 和 traceroute 合在一起,能显示每一跳的丢包与延迟,是定位"哪一段出问题"的核心工具:
# 报告模式,跑 100 个周期后输出统计,适合写入工单和对比 mtr --report --report-cycles 100 203.0.113.10 # 国内很多机房禁 ICMP,改用 TCP 探测 80 端口 mtr -T -P 80 --report --report-cycles 100 203.0.113.10 # 需要看实时变化时用交互模式 mtr -T -P 443 203.0.113.10
看 MTR 结果有个关键技巧:中间某一跳丢包但后续跳不丢,通常不是问题,那是该路由器限制了 ICMP 响应速率(ICMP rate limit)。真正的故障特征是"从某一跳开始,后面所有跳都持续丢包或延迟陡增",那个起始跳就是分界点。
1.3 用 traceroute 看路由路径是否绕路
延迟高的另一个常见原因是路由绕路:比如从广州访问香港服务器,正常应该直连,实际却绕道美国再回来,RTT 凭空多出 150ms 以上。用 TCP 模式的 traceroute 看路径:
# -T 使用 TCP SYN,-p 指定端口,避免被 ICMP 策略干扰 traceroute -T -p 80 203.0.113.10 # 不做反向解析,输出更快 traceroute -n -T -p 443 203.0.113.10
看每一跳的 IP 归属地,如果发现路径里出现了地理上不该出现的国家/地区节点,基本就是绕路。这类问题自己改不了,需要提交工单给运营商或机房。
二、排除本地网络:先别急着怪机房
相当比例的"延迟高"投诉,最后定位到的是用户自己的网络环境。排查时务必做交叉验证,否则容易把力气花在错误方向。
2.1 多终端、多网络对比
最有效的验证方法是换环境测:同一台服务器,分别用办公宽带、家庭宽带、手机 4G/5G 去 ping,如果只有某一个网络慢,问题在用户侧;如果所有网络都慢,才需要往下查机房。这一步五分钟就能做完,却能省掉几小时的无效排查。
2.2 排除本地链路与无线干扰
- 用网线直连光猫/路由器测一次,排除 Wi-Fi 干扰与信道拥塞
- 检查是否有下载、云盘同步、视频会议占满上行带宽——上行打满会直接导致 ACK 回不去,延迟飙升
- 路由器长时间未重启、NAT 会话表满,也会表现为间歇性高延迟
- 公司网络要确认是否走了代理或上网行为管理设备,这类设备会显著增加 RTT
2.3 用时间分段测试数据
把 curl 的各阶段耗时打出来,可以判断延迟发生在建连前还是建连后:
curl -o /dev/null -s -w 'DNS:%{time_namelookup} TCP:%{time_connect} TLS:%{time_appconnect} TTFB:%{time_starttransfer} TOTAL:%{time_total}\n' https://example.com/
判断依据:time_namelookup 大是 DNS 问题;time_connect 大是网络链路或防火墙问题;time_starttransfer 减去 time_appconnect 大,说明是服务器自身处理慢(应用、数据库),不是网络问题。
三、排除服务器自身:网卡、连接数与内核协议栈
确认不是本地问题后,第二步是确认服务器本身没有拖后腿。很多时候"网络慢"其实是服务器负载高、连接队列满、网卡协商异常导致的。
3.1 看网卡是否有错误与丢帧
# 查看网卡统计,重点看 errors/dropped/overruns cat /proc/net/dev # 查看网卡速率与双工模式是否协商正常 ethtool eth0 # 看软中断是否集中在单个 CPU(网络包处理瓶颈) cat /proc/softirqs | grep NET
如果 ethtool 显示 Speed 不是预期值(比如千兆口协商成 100Mb)、Duplex 是 Half,或者 cat /proc/net/dev 中 drop/errs 计数持续增长,说明链路层有问题,需要联系机房检查网线、光模块或交换机端口。
3.2 看 TCP 连接的 RTT 与重传
# -i 显示每条连接的 RTT、重传数、拥塞窗口
ss -i
# 只看已建立连接并统计数量
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c
# 查看重传相关计数是否增长
cat /proc/net/snmp | grep -i Tcp
ss -i 输出里的 rtt、retrans 是关键:retrans(重传)如果持续增长而 rtt 也偏高,说明链路存在丢包;如果 rtt 正常但 retrans 高,可能是乱序或缓冲区配置问题。当 ss -ant 显示 TIME_WAIT 或 SYN_RECV 数量异常高时,延迟高往往是被连接队列堵塞所致。
3.3 排除带宽打满
# 按网卡实时看流量,判断出口是否跑满 sar -n DEV 1 # 按进程看流量(需安装 nethogs) nethogs eth0
带宽打满时的典型现象是:ping 值随流量曲线同步上涨,业务高峰期延迟高、低谷期恢复正常。这种情况要么扩容带宽,要么做流量限速与调度。
四、判断机房线路:这是最可能出问题的一段
排除本地和服务器自身后,剩下的就是机房到用户的链路质量。这一段受运营商骨干、国际出口、机房 BGP 策略共同影响,也是"延迟高"最常见的根源。
4.1 认识常见的回国延迟参考区间
不同地区的机房到中国大陆的单程/往返延迟存在物理下限,光纤中的信号传播速度约为每毫秒 200 公里,这个物理规律决定了跨洋延迟不可能无限降低。以下为常见机房到国内的 RTT 参考区间(仅为经验参考值,实际随线路类型、运营商、时段大幅波动):
| 机房地区 | 到国内 RTT 参考区间 | 主要影响因素 |
|---|---|---|
| 香港 | 30-60ms | 是否直连、是否走 CN2、跨境段拥塞 |
| 新加坡 | 40-80ms | 海缆路由、出口方向(电信/联通/移动) |
| 日本 | 60-100ms | 运营商互联质量、是否绕美 |
| 美国西海岸 | 150-200ms | 跨太平洋海缆、国际出口拥塞时段 |
| 欧洲 | 200-300ms | 陆缆/海缆路径、绕路情况 |
| 美国东海岸 | 200-280ms | 跨洋 + 跨大陆两段延迟叠加 |
如果你的美国西海岸服务器实测 350ms 以上且 mtr 显示路径里出现了欧洲或日本节点,那就是明显的绕路,属于可以优化的空间;如果实测 180ms 且路径正常,那基本就是该路线的正常水平,再怎么优化也降不下来。
4.2 带宽与吞吐验证
延迟和带宽是两回事,但经常一起被投诉。用 iperf3 可以单独验证吞吐能力:
# 服务端(机房机器) iperf3 -s # 客户端(本地或对端机房) iperf3 -c 203.0.113.10 -t 30 -P 4 # 反向测(测下行/机房出方向) iperf3 -c 203.0.113.10 -t 30 -P 4 -R
如果 iperf3 单线程跑不满带宽而多线程可以,通常是单条 TCP 连接受延迟与窗口大小限制(长肥管道问题),可以考虑开启 BBR 或调大 tcp_rmem/tcp_wmem;如果多线程也跑不满,才是真的带宽受限。
五、标准排查步骤清单
把上面的内容固化成流程,遇到延迟投诉时按顺序执行,基本能在 30 分钟内定位到责任段:
- 收集现象:确认是持续高延迟、间歇性抖动还是特定时段高延迟,记录用户所在地区、运营商、时间点。
- 多环境交叉测:用办公网、家庭网、手机流量分别
ping -c 100 -i 0.2,判断是否本地网络问题。 - 跑 MTR 留证据:
mtr -T -P 80 --report --report-cycles 100,保存输出到工单。 - 分段拆解:用
curl -w的 time_namelookup / time_connect / time_starttransfer 区分 DNS、建连、服务处理三个阶段。 - 查服务器自身:
ethtool看协商、cat /proc/net/dev看错包、sar -n DEV 1看是否跑满、ss -i看重传。 - 对比基线:找一台同机房的其他机器或同线路的其他机房做对比,排除个案。
- 判断绕路:
traceroute -n -T -p 443看路径地理是否合理。 - 归类处置:本地问题反馈用户;服务器问题自行处理;机房线路问题提交工单并附 MTR 证据。
- 验证闭环:处理后在同一时段、同一网络重测,对比 mdev 与丢包率是否改善。
六、常见优化手段与适用条件
6.1 能自己做的优化
- 更换线路类型:普通国际线路换成优化回国线路(如 CN2 类),往往能显著降低延迟与晚高峰丢包。
- 接入 CDN:静态资源走 CDN,用户就近取内容,跨洋请求数量大幅下降。
- 开启 BBR:对长距离高延迟链路,BBR 拥塞控制通常比默认的 CUBIC 有更好的吞吐表现。
- 减少 RTT 次数:启用 HTTP/2 或 HTTP/3、合并请求、开启长连接,从协议层面减少往返。
- DNS 优化:使用解析速度快的 DNS,减少
time_namelookup。
6.2 不能靠优化解决的情况
- 物理距离决定的传播延迟,无法通过任何软件手段消除
- 国际出口在晚高峰的拥塞,属于链路容量问题,只能换线路或分流
- 用户本地宽带质量差,服务端再怎么优化也无能为力
小结
服务器网络延迟高的排查,核心是"分段"和"量化"两件事。分段靠 ping + mtr + traceroute 把端到端链路拆成可归因的跳;量化靠足够的样本(100 个包起步)、关注 mdev 抖动与丢包率而非单次数值,以及 curl -w 的阶段耗时。避坑要点:不要只看 ping 的平均值,抖动和丢包往往才是体感差的真凶;不要看到中间跳丢包就报障,先确认后续跳是否同样丢包;不要一上来就换机房,先用多网络交叉测排除本地因素;不要用 ICMP 的结果直接下结论,很多机房对 ICMP 限速,mtr -T -P 的 TCP 探测更接近真实业务表现。把 MTR 报告、测试时间、测试网络三样信息固定记录下来,长期积累出的基线数据,比任何一次临时测试都更有判断价值。
本文所述延迟区间均为经验参考值,实际数值会随线路类型、运营商、时段与网络拥塞情况波动,请以自身实测数据为准。
企业QQ咨询




