Linux 网络延迟高_延迟定位方法

5次阅读

linux网络延迟高需分层排查:先用ping/mtr/hping3确认延迟真实性,再查netstat/ss/时间同步/网卡卸载,接着tcpdump比对抓包定位环节耗时,最后检查中断分布、ring buffer及虚拟化配置。

Linux 网络延迟高_延迟定位方法

Linux 网络延迟高,不能只盯着 ping 或 traceroute 看表面数值。真正的问题往往藏在协议、网卡驱动、内核参数或应用层行为里。定位需分层排查,从链路层到应用层逐级收敛。

确认延迟是否真实存在且可复现

先排除偶然抖动或测试干扰:

  • ping -c 100 -i 0.1 目标IP 连续发包,观察丢包率和 RTT 分布(注意看最大值和标准差,不只是平均值)
  • 换不同工具对比:mtr 实时路径分析、hping3 -S -p 80 -i u10000 目标IP 测试 TCP 握手延迟,避免 ICMP 被限速或过滤误导判断
  • 在本机直连另一台局域网机器测试,确认是单向问题还是普遍现象

检查本地网络栈与内核行为

高延迟常源于本地处理瓶颈:

  • 运行 netstat -s | grep -i “retransmit|timeout” 查重传和超时次数,明显增长说明 TCP 层已异常
  • ss -i 查单个连接的 RTO、RTT、cwnd 值,若 RTO 持续拉长或 cwnd 骤降,可能是拥塞控制被触发或 ACK 延迟
  • 检查时间同步:ntpq -pchronyc tracking,系统时间跳变会导致 TCP 时间戳误判,引发虚假超时
  • 临时关闭 TSO/GSO:ethtool -K eth0 tso off gso off,某些网卡驱动在开启卸载时会引入微秒级延迟抖动

抓包定位具体环节耗时

用 tcpdump + wireshark 深挖时间点:

  • 在客户端和服务端同时抓包,用 tcpdump -i any -w client.pcap port 80,比对 SYN/SYN-ACK/ACK 时间戳
  • 重点看 “TCP Analysis Flags” 中的 “TCP retransmission”、“TCP window update”、“TCP ACKed unseen segment”,这些标记直接对应延迟成因
  • 若 SYN 发出后很久才收到 SYN-ACK,问题在服务端响应慢或中间设备策略限制;若 ACK 延迟发出,可能是 Nagle 算法或延迟 ACK 合并所致

排查硬件与驱动层面因素

尤其在虚拟化或高性能场景下易被忽略:

  • 查网卡中断分布:cat /proc/interrupts | grep eth0,若所有中断集中在单个 CPU 核,可能造成软中断积,用 irqbalance 或手动绑定缓解
  • 检查 ring buffer 是否溢出:ethtool -S eth0 | grep -i “drop|over|Error,rx/tx fifo errors 或 missed 变多,说明驱动来不及收包
  • VM 环境中确认 virtio-net 是否启用 vhost_net,宿主机未开启该模块时,qemu 用户态转发会显著增加延迟
text=ZqhQzanResources