第10章 网络:单边证据不够,先把端点、链路、对端拆开

网络慢要先拆成本端、对端和中间链路三段,不能把所有延迟都笼统归成网络差。

本页目录

网络慢,先别急着把锅扔给链路

第 10 章先拦住一个特别伤人的误判:只看本端现象,就直接宣布网络根因。

网络相关症状,至少可能落在这几层:

  • 应用本身处理慢
  • 本端主机排队或网络栈有问题
  • 中间链路有丢包、拥塞或抖动
  • 对端主机或对端应用处理慢

只看单边证据,根本分不清这些位置。

先把网络时间拆开

以后看网络问题,先按这个顺序拆:

1. 先分应用时间和网络时间

TTFB、请求总时长、超时,里面经常混着应用处理时间,不是纯网络时间。

别拿 TTFB 直接给网络定罪:它不仅包含网络传输时间,还死死绑定着目标服务器的 CPU 调度和应用处理时间。TTFB 飙高,很多时候更像对端应用卡了,而不是中间链路慢了。

2. 再分本端、链路、对端

重传、RTT、丢包、队列和应用日志,要尽量两边对起来看。

3. 再分偶发抖动和持续退化

这关系到你后面该看拥塞、配置问题,还是流量尖峰和队列。

4. 最后才判断哪一边最先形成约束

真正要找的,不是“哪里也慢”,而是“哪一边最早先开始等”。

别拿单边重传、超时和 TTFB 直接说链路有问题

最常见的错法有四种:

  • 看到重传,就直接说链路有问题
  • 看到 TTFB 变差,就直接说网络变慢
  • 只看客户端,不看服务端
  • 把端点主机排队、应用处理和链路问题混成一个结论

这些错法都缺一层对照。

什么时候更像主机或应用,不像外部网络

下面这些情况,更像端点主机或应用在制造表象:

  • 本端排队和 CPU 等待同步变坏
  • 服务端应用处理时间一起变长
  • 只有单边有症状,另一边对不上
  • 同机其他流量正常,只有特定请求慢

这时候先别急着认链路,先把端点主机和应用侧拆干净。

一个最典型的错法:只拿到客户端超时就宣布网络故障

现场里最常见的说法就是“客户端都超时了,肯定是网络”。

但这个结论中间至少还差三步:

  • 服务端是不是先慢了
  • 本端主机是不是先排队了
  • 另一端有没有对应症状

如果这些都没对上,单边超时最多只能算症状。

到现场怎么把网络问题拆开

第 10 章真正缺的不是“网络会骗人”这个提醒,而是你拿到超时、重传、TTFB 变差以后,第一轮到底按什么顺序做。

第一步:先挑一条慢请求,不要先看一堆总图

先固定一条具体的慢事务,再往外扩。

最少写清:

  • 哪个客户端发起
  • 哪个服务端接收
  • 哪个接口或操作变慢
  • 慢发生在哪个时间窗

网络问题如果不先落到一条具体路径上,后面很容易把不同链路、不同端点、不同时间窗的现象混成一锅。

第二步:先把总时长拆成三段

对着这条请求,先问三件事:

  • 客户端发出前是不是已经在本端排队
  • 线上传输是不是明显变长
  • 服务端收到后是不是处理得更慢

也就是说,先把总时长粗拆成:

  • 本端等待
  • 链路传输
  • 对端处理

这一步不用一次做到特别准,但必须先拆。否则你看到的 TTFB 和超时只是一团总时间。

第三步:两边对证,不接受单边结论

然后立刻补双边证据:

  • 客户端的 RTT、重传、超时、队列
  • 服务端的连接、排队、应用处理时间
  • 必要时再补中间链路或设备证据

这里的目标不是把所有数据都抓来,而是回答:最早先开始等的是哪一边。

还要再防一种特别常见的错判:单边 SYN 重传飙高,不等于物理链路就在丢包。它很可能是对端服务器的监听积压队列已经被打爆,应用层处理太慢,内核只能主动丢掉新连接。只要对端 accept 不出来,你在客户端看到的就会像“网络没接住”。

把全量抓包严格降级成最后手段。为了凑齐双边证据,现场很容易习惯性在两端直接开 tcpdump,但高速网络下抓包本身就可能瞬间吞掉 CPU 和存储带宽,甚至因为内核处理不过来而制造新的丢包。先把 ssnstat 这类低开销计数器榨干,再决定要不要抓包;不然你拿到的“网络证据”里,已经混进了工具自己造出来的失真。

第四步:先分“本端慢”“链路慢”“对端慢”

到这一步,必须强迫自己先选一类主方向:

  • 本端主机或本端应用先慢
  • 中间链路先失真
  • 对端主机或对端应用先慢

没选类之前,不要说“网络有问题”。因为这句话太大,等于什么都没说。

第五步:只在双边证据能对上时,才升级成链路判断

下面这些情况一起出现时,链路判断才更站得住:

  • 两边都能看到对应时延或重传异常
  • 端点主机和应用处理时间解释不了全部症状
  • 路径切换、流量切分或链路缓解后,症状一起变化

只要其中任何一块是空的,网络结论就先降级成“链路方向待证实”。

先分清本端、链路和对端谁先开始等

每次做完网络排查,至少留下这张三栏表:

  • 本端主机和应用看到了什么
  • 中间链路和设备看到了什么
  • 对端主机和应用看到了什么

再强迫自己补一句结论:

  • 最早先开始等的是哪一边
  • 另一边看到的是根因、连锁反应,还是单纯显影

这句写不出来,就说明你还停留在“哪里都像有点问题”,没有真正把网络问题拆开。

重传、TTFB 和超时都先当单边线索

先把证据分成本端、链路、对端三栏

以后看网络问题,证据至少按这三栏记:

  • 本端主机和应用
  • 中间链路和网络设备
  • 对端主机和应用

只要有一栏是空的,结论就先别下重。

先把应用时间从网络时间里剥出来

看到 TTFB、超时、延迟恶化时,先问自己:里面有多少是应用自己在处理,有多少真花在网络上传输和等待。

单边证据只能当线索

重传、超时、RTT 变差、队列积压,这些单边现象先都当线索。只有两边证据和路径证据能接起来时,网络根因才更站得住。

单边误判压住以后,再看云里这些证据怎么失真

第 10 章解决的是“网络问题不能只看一边”。第 11 章接着解决“到了云和虚拟化环境里,这些证据还会怎样继续失真”。