linux 网络延迟怎么排查(分层定位)
答案:分层排查——ping 测基础 RTT、traceroute/mtr 看路径、ss 看重传、curl -w 拆解 HTTP 各阶段耗时、nginx 日志的 request_time/upstream_time 区分"网络慢"还是"应用慢"。
一、分层排查思路
text
第 1 层 链路:ping / mtr —— 基础 RTT、丢包、路径
第 2 层 传输:ss -ti —— 重传、拥塞窗口、单连接 RTT
第 3 层 服务:curl -w —— DNS/连接/首字节/总耗时
第 4 层 应用:nginx request_time vs upstream_time —— 网络 or 应用二、命令速查
| 目标 | 命令 |
|---|---|
| 基础延迟 | ping -c 10 <host> |
| 每跳路径 | mtr <host> |
| 单连接 RTT/重传 | ss -ti(看 rtt:、retrans: 字段) |
| 网卡统计 | sar -n DEV 1、top 看 si(软中断) |
| HTTP 延迟拆解 | curl -w 'dns:%{time_namelookup} conn:%{time_connect} ttfB:%{time_starttransfer} total:%{time_total}\n' <url> |
| 吞吐 | iperf3 -c <host> |
三、区分网络延迟 vs 应用延迟(最关键)
bash
curl -w 'dns=%{time_namelookup}s conn=%{time_connect}s ttfB=%{time_starttransfer}s total=%{time_total}s\n' -o /dev/null http://host/- conn 慢 → 网络/防火墙/路由问题;
- conn 快、ttfB 慢 → 服务端处理慢(应用问题);
- dns 慢 → DNS 解析问题。
四、服务端量化
nginx
# nginx 日志格式加两列
log_format main '$remote_addr $request_time $upstream_time ...';
# $request_time = 总耗时(含网络等待)
# $upstream_time = 后端处理时间
# 两者之差 ≈ 网络/排队时间五、模拟延迟测试
bash
# 出方向加 100ms 延迟(需 root)
tc qdisc add dev eth0 root netem delay 100ms
# 测试完删除
tc qdisc del dev eth0 root六、常见坑
top里si高:网卡软中断打满 CPU,是大流量/小包导致的 CPU 瓶颈而非网络慢;- 丢包被隐藏:TCP 会重传,
ss -ti的retrans数才暴露; ping通不代表应用快:ICMP 与业务路径/限速可能不同;- 本地 curl 测不出公网:本地到本机不走外网链路,别拿它判断公网延迟。
深度入口
FAQ
Q: linux 网络延迟怎么排查? A: 分层:ping/mtr 看链路、ss -ti 看重传、curl -w 拆 HTTP 耗时、nginx 日志区分网络/应用。
Q: 怎么测试网络延迟? A: ping -c 10、mtr、curl -w time_total、iperf3、ss -ti。
Q: 网络延迟高可能的原因? A: 物理距离/路由、丢包重传、网卡软中断瓶颈、对端服务慢、DNS 慢。
Q: 怎么区分网络延迟还是应用延迟? A: curl -w 拆解:conn 慢=网络,conn 快但 TTFB 慢=应用。
Q: 服务器上怎么量化每个请求的延迟? A: nginx 日志 $request_time(总耗时)与 $upstream_time(后端处理),差值≈网络/排队。
Q: 怎么模拟网络延迟测试? A: tc qdisc add dev eth0 root netem delay 100ms,用完删除。
一句话总结:网络延迟排查 = 分层定位——ping/mtr 看链路、ss -ti 看重传、curl -w 拆 HTTP 各阶段、nginx 日志 request_time 与 upstream_time 之差区分"网络慢还是应用慢";别让 ICMP 的 ping 骗了你,业务路径才作数。