前言
服务响应慢、接口超时、用户反馈卡顿,很多时候问题出在网络层面。延迟高、丢包、抖动这些问题看起来简单,排查起来却需要一套系统的方法。
本文整理网络延迟和丢包问题的排查思路和常用工具,配合实际案例。
1. 基础检测工具
1.1 ping:最简单的延迟检测
# 基础用法ping192.168.1.100# 指定次数ping-c10192.168.1.100# 指定间隔(秒)ping-i0.2192.168.1.100# 指定包大小(测试MTU问题)ping-s1400192.168.1.100# 不允许分片(检测MTU)ping-Mdo-s1472192.168.1.100关注指标:
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.5 ms --- 192.168.1.100 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9000ms rtt min/avg/max/mdev = 0.4/0.6/1.2/0.2 mstime:单次往返延迟(RTT)packet loss:丢包率mdev:延迟标准差,反映抖动
1.2 traceroute:定位延迟在哪一跳
# 基础用法traceroute8.8.8.8# 使用ICMP(默认用UDP)traceroute-I8.8.8.8# 使用TCP(绕过某些防火墙)traceroute-T-p808.8.8.8# 显示AS号(定位运营商)traceroute-A8.8.8.8输出解读:
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.345 ms 2 10.0.0.1 (10.0.0.1) 5.678 ms 5.432 ms 5.876 ms 3 * * * 4 202.97.33.1 (202.97.33.1) 20.123 ms 19.876 ms 20.345 ms- 每行三个时间是三次探测的RTT
* * *表示该跳没有响应(可能禁ping,不一定有问题)- 关注延迟突然增大的位置
1.3 mtr:ping + traceroute的结合
# 交互模式mtr8.8.8.8# 报告模式mtr-r-c1008.8.8.8# 显示更多信息mtr-r-c100-w8.8.8.8输出解读:
HOST: server Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.1.1 0.0% 100 0.5 0.6 0.4 1.2 0.1 2.|-- 10.0.0.1 0.0% 100 5.2 5.4 5.0 6.8 0.3 3.|-- 202.97.33.1 2.0% 100 20.1 21.3 19.5 45.6 5.2 4.|-- 72.14.216.1 0.0% 100 35.2 36.1 34.8 42.3 1.5 5.|-- 8.8.8.8 0.0% 100 38.5 39.2 38.0 48.6 2.1Loss%:丢包率Avg:平均延迟StDev:标准差,反映抖动
注意:中间节点的丢包不一定是问题,有些路由器限制ICMP响应速率。关键看最终目标的丢包率。
2. 延迟问题排查
2.1 定位延迟来源
延迟高,先定位是哪段网络的问题:
# 1. 本机到网关ping-c20192.168.1.1# 2. 网关到运营商traceroute114.114.114.114# 3. 到目标服务器mtr-r-c50目标IP常见情况:
| 延迟位置 | 可能原因 |
|---|---|
| 第一跳(网关)高 | 局域网问题、WiFi干扰、交换机负载 |
| 运营商骨干高 | 跨运营商、跨区域、带宽拥塞 |
| 目标服务器高 | 服务器负载高、距离远 |
2.2 分析延迟波动
# 长时间ping,观察延迟变化ping-i0.5192.168.1.100|whilereadline;doecho"$(date'+%Y-%m-%d %H:%M:%S')$line"done|teeping_log.txt分析结果:
# 看延迟分布awk-F'time=''{print $2}'ping_log.txt|awk-F' ''{print int($1)}'|sort|uniq-c# 找出延迟超过阈值的时间点grep-E'time=[0-9]{2,}\.'ping_log.txt2.3 TCP层面的延迟分析
ping只测ICMP,实际TCP连接可能不一样:
# 测试TCP连接延迟# 安装hping3yuminstall-yhping3# TCP SYN延迟hping3-S-p80-c10192.168.1.100# 输出示例# len=46 ip=192.168.1.100 ttl=64 DF id=0 sport=80 flags=SA seq=0 win=65535 rtt=0.5 ms也可以用tcpdump分析:
# 抓TCP握手时间tcpdump-ieth0-nn'host 192.168.1.100 and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'2.4 应用层延迟分析
# HTTP请求各阶段耗时curl-w"\n\ DNS解析: %{time_namelookup}s\n\ TCP连接: %{time_connect}s\n\ TLS握手: %{time_appconnect}s\n\ 首字节: %{time_starttransfer}s\n\ 总耗时: %{time_total}s\n"\-o/dev/null-shttps://www.example.com# 输出示例# DNS解析: 0.012s# TCP连接: 0.045s# TLS握手: 0.123s# 首字节: 0.234s# 总耗时: 0.345s3. 丢包问题排查
3.1 确认丢包位置
# 持续ping,统计丢包ping-c1000-i0.1192.168.1.100# 用mtr定位丢包在哪一跳mtr-r-c200192.168.1.100分析技巧:
- 如果某一跳开始出现丢包,后续节点丢包率相近,问题在那一跳
- 如果只有中间某一跳丢包,后续恢复,可能是该节点限制ICMP,不是真丢包
3.2 检查本机网络
# 网卡错误统计ifconfigeth0|grep-E'errors|dropped|overruns'# 或者用ip命令ip-slinkshow eth0# 详细统计cat/proc/net/dev# 检查网卡队列ethtool-Seth0|grep-E'drop|error|miss'常见问题:
# RX dropped高:接收缓冲区满# 解决:增大ring bufferethtool-Geth0 rx4096# RX errors高:物理层问题# 检查网线、交换机端口# TX dropped高:发送队列满# 检查带宽是否打满sar-nDEV13.3 检查系统层面
# 检查conntrack是否满cat/proc/sys/net/netfilter/nf_conntrack_countcat/proc/sys/net/netfilter/nf_conntrack_max# 检查socket缓冲区cat/proc/sys/net/core/rmem_maxcat/proc/sys/net/core/wmem_max# 检查TIME_WAIT数量ss-s# 检查SYN队列netstat-s|grep-isyn3.4 检查网络设备
# 检查交换机端口统计(登录交换机)show interface ethernet1/1 counters# 检查路由器队列show interface fastethernet0/0|include drops# 检查防火墙连接数iptables-L-v-n4. 常见问题场景
4.1 跨运营商延迟高
表现:同城访问延迟却很高。
排查:
mtr-r-c50-w目标IP如果看到流量绑到了远地(比如北京的机器访问上海,结果绕到广州),就是运营商互联问题。
解决方案:
- 使用BGP多线机房
- CDN加速
- 用组网工具走专线(后面会讲)
4.2 WiFi环境丢包
表现:无线连接时丢包,有线正常。
排查:
# Linux查看WiFi信号iwconfig wlan0# 关注Signal level和Noise level# Signal level应该大于-70 dBm解决方案:
- 换5G频段
- 调整AP位置
- 减少同频干扰
4.3 MTU问题导致丢包
表现:ping小包正常,大包就丢。
排查:
# 二分法找MTUping-Mdo-s1472192.168.1.100# 如果不通ping-Mdo-s1400192.168.1.100# 如果通ping-Mdo-s1436192.168.1.100# 继续二分常见MTU:
- 以太网:1500
- PPPoE:1492
- VPN隧道:1400-1450
解决方案:
# 调整MTUiplinkseteth0 mtu1400# 或者开启PMTUDsysctl-wnet.ipv4.ip_no_pmtu_disc=04.4 TCP重传导致慢
表现:带宽够,但传输慢。
排查:
# 查看重传统计netstat-s|grep-iretrans# 或者ss-tidst192.168.1.100# 看retrans字段解决方案:
# 调整TCP参数sysctl-wnet.ipv4.tcp_retries2=8sysctl-wnet.ipv4.tcp_syn_retries=3# 启用BBR拥塞控制(改善高延迟网络)sysctl-wnet.core.default_qdisc=fqsysctl-wnet.ipv4.tcp_congestion_control=bbr4.5 跨机房/跨网络延迟问题
多机房部署时,机房间网络质量直接影响服务性能。
排查:
# 持续监控机房间延迟whiletrue;doecho"$(date)$(ping-c1-W1对端IP|greptime=)"sleep10done>>latency_monitor.log优化方案:
- 专线:延迟低、稳定,但贵
- SD-WAN:智能选路,成本适中
- 组网工具:WireGuard、ZeroTier、星空组网等,在公网基础上建隧道,有一定优化效果
如果是临时跨网络调试,用组网工具把几台机器串起来挺方便。配置一次后,机器之间就像在同一个局域网,延迟也比绕公网直连稳定一些。
5. 监控与告警
5.1 Prometheus + Blackbox Exporter
# blackbox.ymlmodules:icmp:prober:icmptimeout:5sicmp:preferred_ip_protocol:ip4tcp_connect:prober:tcptimeout:5shttp_2xx:prober:httptimeout:5shttp:valid_http_versions:["HTTP/1.1","HTTP/2"]valid_status_codes:[200]# prometheus.ymlscrape_configs:-job_name:'blackbox-icmp'metrics_path:/probeparams:module:[icmp]static_configs:-targets:-192.168.1.100-192.168.2.100relabel_configs:-source_labels:[__address__]target_label:__param_target-source_labels:[__param_target]target_label:instance-target_label:__address__replacement:blackbox-exporter:9115常用指标:
# 延迟 probe_duration_seconds{job="blackbox-icmp"} # 丢包(探测失败) probe_success{job="blackbox-icmp"} == 0 # 告警规则 - alert: HighLatency expr: probe_duration_seconds > 0.1 for: 5m labels: severity: warning annotations: summary: "High latency to {{ $labels.instance }}"5.2 简单脚本监控
#!/bin/bash# network_monitor.shTARGETS="192.168.1.100 192.168.2.100 8.8.8.8"THRESHOLD_MS=50THRESHOLD_LOSS=5fortargetin$TARGETS;doresult=$(ping-c10-W2$target2>/dev/null)if[$?-ne0];thenecho"[$(date)] ERROR:$targetunreachable"continuefiavg=$(echo"$result"|tail-1|awk-F'/''{print $5}')loss=$(echo"$result"|grep-oP'\d+(?=% packet loss)')if[$(echo"$avg>$THRESHOLD_MS"|bc)-eq1];thenecho"[$(date)] WARNING:$targetlatency${avg}ms >${THRESHOLD_MS}ms"fiif[$loss-gt$THRESHOLD_LOSS];thenecho"[$(date)] WARNING:$targetpacket loss${loss}% >${THRESHOLD_LOSS}%"fidone加到crontab定期执行:
*/5 * * * * /path/to/network_monitor.sh>>/var/log/network_monitor.log2>&16. 优化建议
6.1 系统参数优化
# /etc/sysctl.conf# 增大socket缓冲区net.core.rmem_max=16777216net.core.wmem_max=16777216net.ipv4.tcp_rmem=40968738016777216net.ipv4.tcp_wmem=40966553616777216# 启用TCP BBR(需要内核4.9+)net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr# 减少TIME_WAITnet.ipv4.tcp_tw_reuse=1net.ipv4.tcp_fin_timeout=30# 增大连接跟踪表net.netfilter.nf_conntrack_max=10485766.2 网卡优化
# 增大ring bufferethtool-Geth0 rx4096tx4096# 开启网卡多队列ethtool-Leth0 combined4# 中断亲和性(绑定到不同CPU)# 查看中断号cat/proc/interrupts|grepeth0# 绑定到指定CPUecho2>/proc/irq/XX/smp_affinity6.3 应用层优化
- 使用连接池,减少TCP握手
- 启用HTTP/2,多路复用
- 合理设置超时和重试
- 考虑本地缓存,减少网络请求
总结
| 问题类型 | 排查工具 | 关键指标 |
|---|---|---|
| 延迟高 | ping, mtr, hping3 | RTT, 各跳延迟 |
| 丢包 | ping, mtr, ethtool | Loss%, 网卡错误计数 |
| 抖动 | mtr, ping统计 | StDev, 延迟波动 |
| TCP慢 | ss, netstat -s | 重传次数 |
| 应用慢 | curl -w, tcpdump | 各阶段耗时 |
排查步骤:
- 确认现象:是延迟高、丢包还是抖动
- 定位位置:本机、局域网、运营商、还是目标端
- 分析原因:网络设备、带宽、配置、还是物理层
- 验证解决:修改后持续观察,确认问题解决
网络问题排查需要耐心,一层层定位,工具只是辅助,关键是理解网络各层的工作原理。