上一篇 下一篇 分享链接 返回 返回顶部

白天快、晚八点卡,如何用双向MTR定位海外物理机的拥堵链路?

发布人:Minchunlin 发布时间:2026-10-06 22:09 阅读量:3

晚上八点访问海外物理机,页面开始转圈、SSH 输入延迟升高、文件传输速度下降,白天却一切正常,这类问题不能仅凭“海外线路晚高峰拥堵”下结论。真正需要确认的是:卡顿发生在本地出口、DNS 解析、去程路由、回程路由、服务器网卡与系统资源,还是应用处理阶段。

定位“卡在哪一跳”,应当在客户端和服务器两端分别执行 MTR,并同时保留 ICMP 与业务端口探测结果。客户端到服务器的 MTR 观察去程,服务器到客户端公网出口地址的 MTR 观察回程;再结合最终目标的丢包、延迟、TCP 建连和应用响应时间,才能判断是中间某一跳只是不愿回复探测包,还是该链路确实影响了业务流量。

双向 MTR 定位配图

把“晚八点卡”变成可对比的记录

先固定时间、地址和业务端口

排查前不要只记录“晚上很慢”。至少记录以下信息:

  • 客户端所在网络、运营商或出口线路。
  • 客户端公网出口 IP,而不是内网地址。
  • 海外物理机的 IPv4 和 IPv6 地址。
  • 访问使用的域名、解析到的 IP、业务端口,例如 TCP 443、22 或自定义端口。
  • 卡顿发生的本地时间和对应 UTC 时间。
  • 卡顿表现:网页打开慢、SSH 延迟、接口超时、下载变慢,还是只有登录后某个操作慢。
  • 同一时间服务器上的 CPU、内存、磁盘 I/O、网卡错误和应用响应数据。

客户端可能使用多出口、双栈网络或动态公网 IP。每次测试前应确认实际使用的地址和路径。Linux 上可以先执行:

date -Is
ip -br addr
ip route get 198.51.100.20

其中 198.51.100.20 只是文档示例地址,请替换为实际服务器 IP。ip route get 的结果可用于确认当前访问该地址会经过哪个网关、哪块网卡以及使用哪个源地址。

如果同时存在 IPv4 和 IPv6,应分别测试:

curl -4 -I --connect-timeout 5 https://example.com/
curl -6 -I --connect-timeout 5 https://example.com/

如果只有 IPv6 在晚间变慢,不能把问题笼统归因于“海外物理机线路”;应分别对 IPv4 和 IPv6 做 MTR,比较两条路径是否经过不同的运营商、交换节点或出口。

建立白天基线和晚间样本

建议至少保留两组结果:

  • 白天业务正常时执行一组。
  • 晚间出现卡顿时执行一组。
  • 如果晚高峰持续时间较长,再在高峰前、峰中、高峰后各执行一次。

每组结果要尽量保持以下条件一致:

  • 相同客户端和相同公网出口。
  • 相同目标 IP。
  • 相同协议和目标端口。
  • 相同探测次数和间隔。
  • 相同的测试路径,例如都使用 IPv4。

MTR 的 100 个探测包中出现 1 个未回复,通常会显示约 1% 的丢包。样本过少时,单个探测包就可能造成较大的百分比波动,因此不要拿 5 个包的结果直接判断线路质量。

MTR 结果不能只看中间最高丢包

MTR 通常会显示类似以下字段:

  • Loss%:该跳对探测包的未回复比例。
  • Snt:发送的探测数量。
  • Last:最近一次延迟。
  • Avg:平均延迟。
  • Best:最低延迟。
  • Wrst:最高延迟。
  • StDev:延迟波动。

中间路由器可能限制 ICMP 或 UDP 探测包的回复优先级,因此某一跳显示 30% 丢包,并不等于业务数据在这一跳丢了 30%。判断重点是:该跳之后的所有节点以及最终目标是否持续出现相同丢包,且延迟是否从该处开始整体升高。

MTR 结果不能只看中间最高丢包配图

例如:

  • 第 5 跳显示 30% 丢包,第 6 跳到最终目标均为 0%:多半是第 5 跳限制探测回复。
  • 第 5 跳开始显示 10% 丢包,后续各跳和最终目标也接近 10%:需要重点怀疑第 5 跳之后的链路。
  • 所有中间节点正常,只有最终目标丢包:更接近服务器防火墙、服务器负载、目标端口处理能力或目标主机本身的问题。
  • MTR 正常但应用 TTFB 很高:应转向 DNS、TLS、服务器资源或应用依赖排查。

第一层:先排除客户端和 DNS

由外到内排查时,先确认客户端所在网络没有在晚间出现本地拥塞。这样做风险低,而且可以避免把家庭 Wi-Fi、办公出口或本地 DNS 的问题误判成跨境链路问题。

检查默认网关和本地网络

Linux 客户端可以先找出默认网关:

ip route show default

假设输出中的网关为 192.168.1.1,再分别测试网关和海外目标:

ping -c 50 -W 1 192.168.1.1
ping -c 50 -W 2 198.51.100.20

Windows 可使用:

ipconfig
ping -n 50 192.168.1.1
ping -n 50 198.51.100.20

结果可以按以下方式理解:

  • 网关就出现明显丢包或几十毫秒以上的剧烈波动:先检查无线信号、局域网设备、交换机端口、家庭路由器负载或办公出口,不要急着找海外运营商。
  • 网关稳定,但公网目标在晚间延迟和丢包升高:本地接入到运营商出口之间仍可能存在拥塞,需要继续做 MTR。
  • 网关和目标的 ICMP 都稳定,但业务仍慢:ICMP 不能解释问题,应执行 TCP 端口测试和应用耗时拆分。
  • 网关无丢包但无线网络的延迟波动很大:可以在相同时间使用有线网络复测。若有线恢复,问题通常不在海外物理机。

查看本机网卡统计信息:

ip -s link

重点关注对应出口网卡的 errors、dropped、overruns 等计数。在晚高峰前后分别记录一次,如果只在卡顿期间持续增长,说明本机网卡、驱动、虚拟交换或本地出口设备值得进一步检查。

不要一开始就修改 MTU、重启网络服务或刷新路由。此类操作可能改变现场,且未必能解决运营商侧拥塞。只有在路径探测明确显示分片或 PMTU 异常,并且已经保存当前网络配置后,才适合安排小范围调整。

判断 DNS 是否把请求导向了不同地址

域名访问和直接访问 IP 不是一回事。晚间变慢可能是 DNS 在高峰时返回了另一组地址,或者 DNS 查询本身超时。

Linux 上可使用 dig:

dig example.com A +stats
dig example.com AAAA +stats
dig example.com CNAME +stats

如果系统使用 systemd-resolved,还可以查看实际解析结果:

resolvectl query example.com
resolvectl status

需要对比以下内容:

  • 白天和晚间是否返回不同的 A 或 AAAA 记录。
  • 是否出现了不同的 CNAME 链。
  • DNS 查询耗时是否从毫秒级升高到秒级。
  • 返回的不同 IP 是否属于不同机房、不同入口或不同网络。
  • 客户端是否优先选择了晚间质量较差的 IPv6 路径。

DNS 只影响解析阶段。如果一个连接已经建立,后续持续卡顿通常不能单独归因于 DNS。可以使用 curl 将域名固定到某个 IP,保留原有 Host 和 TLS SNI,从而绕过 DNS 变量:

curl -4 -sS -o /dev/null \
  --connect-timeout 5 \
  --max-time 20 \
  --resolve example.com:443:198.51.100.20 \
  -w 'remote=%{remote_ip} dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s ttfb=%{time_starttransfer}s total=%{time_total}s code=%{http_code}\n' \
  https://example.com/

这是一个只读的单次业务请求示例,实际排查时应替换域名、端口和 IP。若直接固定 IP 后响应恢复,而正常域名访问仍慢,优先检查 DNS 返回、IPv4/IPv6 选择和不同入口之间的质量差异。

若 DNS 记录需要调整,应先保存原记录、TTL 和解析策略,再做小范围修改。变更可能受到本地缓存和递归 DNS 缓存影响,不能以刚修改后的单次结果作为最终验证。回滚时恢复原有记录和 TTL,并等待缓存逐步过期。

第二层:用双向 MTR 分离去程和回程

先确认 MTR 工具和协议类型

以下命令以常见 Linux 环境为例。先确认工具是否已安装:

mtr --version
mtr --help

如果生产环境没有 MTR,不要为了排查直接执行来源不明的安装脚本。可以先使用系统已有的 traceroute、tracepath 或操作系统自带工具,待维护窗口再安装经过审核的软件包。

ICMP MTR 示例:

mtr -4 -r -w -c 100 -i 0.5 198.51.100.20

参数含义如下:

  • -4:使用 IPv4。
  • -r:以报告模式运行并在结束后输出结果。
  • -w:扩大输出宽度,减少主机名截断。
  • -c 100:发送 100 轮探测。
  • -i 0.5:每 0.5 秒发送一轮。
  • 最后的地址为目标服务器 IP。

如果业务是 HTTPS、SSH 或其他 TCP 服务,还应测试业务端口。多数 Linux 版本的 MTR 支持 TCP 模式:

mtr -4 -r -w -c 50 -i 1 --tcp --port 443 198.51.100.20

TCP MTR 更接近业务连接,但会向目标端口发起探测,次数不宜过多。若当前 MTR 版本不支持 --tcp 或 --port,应先查看 mtr --help,不要照搬其他版本的参数。也可以使用 Linux traceroute 的 TCP 模式:

traceroute -4 -n -T -p 443 -q 3 -w 2 198.51.100.20

部分系统要求较高权限才能发送 TCP 探测包。如果权限不足,应优先使用普通用户可执行的 tracepath 或 ICMP 探测,不要为了运行命令临时放宽系统权限。

Windows 客户端可以执行:

tracert -4 198.51.100.20
pathping -4 198.51.100.20
Test-NetConnection 198.51.100.20 -Port 443 -InformationLevel Detailed

pathping 会进行较长时间的统计,适合在问题窗口运行一次,不宜高频执行。

客户端到服务器:观察去程

客户端执行的 MTR 主要回答:

从当前用户网络到海外物理机,哪一段开始出现持续延迟、丢包或路径变化?

建议在正常时间和晚高峰各保存一份输出:

mkdir -p ~/net-check

date -Is | tee ~/net-check/time.txt
mtr -4 -r -w -c 100 -i 0.5 198.51.100.20 \
  | tee ~/net-check/mtr-client-to-server.txt

如果要长期留档,应注意输出中会包含公网 IP 和路由节点信息,提交给第三方前可按需脱敏。记录文件本身不改变网络状态,不需要回滚。

判断去程时重点看:

  1. 第一跳是否在晚间出现丢包。
  2. 哪一跳开始平均延迟明显升高。
  3. 从该跳开始,后续节点和最终目标是否持续保持相近丢包。
  4. ICMP 结果和 TCP 业务端口结果是否一致。
  5. 晚间路由节点数量、运营商名称或路径顺序是否发生变化。

如果只有 ICMP MTR 显示中间一跳丢包,而 TCP 建连、应用响应和最终目标均正常,不应直接提交“线路丢包”的结论。反之,如果 TCP MTR 和最终目标在同一时间均出现延迟升高或丢包,证据强度更高。

服务器到客户端:观察回程

登录海外物理机后,确认客户端实际公网出口 IP。例如客户端在 NAT、办公网或家庭宽带后面,服务器看到的不是客户端内网地址,而是 NAT 出口地址。

在服务器上执行:

date -Is
ip route get 203.0.113.45
mtr -4 -r -w -c 100 -i 0.5 203.0.113.45

203.0.113.45 是客户端公网出口地址的示例,请替换为真实地址。

如果需要观察与业务更接近的回程,且客户端有明确开放并允许探测的 TCP 端口,可以使用:

mtr -4 -r -w -c 50 -i 1 --tcp --port 443 203.0.113.45

但很多客户端位于 NAT 或防火墙之后,服务器对该公网地址的 TCP 探测可能没有可达端口。这种情况下,TCP MTR 无法完成并不等于回程故障。可以保留 ICMP MTR,并结合客户端的 TCP 结果判断。

双向测试有几个边界:

  • 客户端公网 IP 动态变化时,回程 MTR 可能已经指向了错误的出口。
  • NAT 后的回程只能观察到 NAT 出口到服务器的路径,不能完整代表出口之后的内部设备。
  • 客户端屏蔽 ICMP 时,服务器侧 MTR 可能显示目标不可达。
  • 服务器本身高负载时,它生成和处理探测包的能力也可能下降。
  • 如果条件允许,可在服务器同一网络或同一上联的另一台主机上进行反向探测,用来排除目标物理机自身负载对结果的影响。

把四组结果放在一起比较

下表是常见结果的判断入口。它不是绝对规则,仍要结合最终目标和业务端口结果。

客户端到服务器服务器到客户端业务表现优先怀疑位置
晚间延迟和丢包升高基本正常客户端访问变慢客户端出口、去程运营商或跨网互联
基本正常晚间延迟和丢包升高页面返回、下载或响应包变慢回程运营商、服务器出口或回程互联
两个方向都升高两个方向都升高多个业务同时变慢共同运营商、机房上联、服务器网卡或主机负载
两个方向都正常应用明显变慢连接成功但等待时间长DNS 后端、TLS、应用、数据库或磁盘 I/O
ICMP 异常TCP 业务正常用户基本无感或偶发波动中间节点限制 ICMP 回复
ICMP 正常TCP 业务异常特定端口超时防火墙、端口策略、TCP 队列或业务端口所在服务
只有一个解析 IP 异常固定到另一 IP 后恢复域名访问间歇性慢DNS 返回、入口节点或地址池质量

第三层:确认是不是服务器和网络栈变慢

双向 MTR 只能说明路径和探测响应,不能替代服务器资源检查。海外物理机在晚间可能同时承受访问高峰、备份、日志归档、数据库任务或大文件传输,表现也会像“网络卡”。

记录 CPU、内存和 I/O

以下命令都是读取状态,不会修改系统配置:

date -Is
uptime
free -h
vmstat 1 5

如果系统安装了 sysstat,还可以执行:

mpstat -P ALL 1 5
iostat -xz 1 5

重点观察:

  • CPU 是否接近长期满载。
  • vmstat 中的 wa 是否在卡顿时间显著升高。
  • 是否存在持续交换,或者可用内存快速下降。
  • 磁盘平均等待时间、利用率是否明显高于白天。
  • 是否只有某一个 CPU 核心接近满载,而其他核心空闲。
  • 中断、软中断或网络处理是否集中在少数核心。

对于物理机,不需要重点寻找虚拟化环境中的 CPU steal,但网卡队列、IRQ 分布、单核应用瓶颈仍可能造成连接处理能力下降。判断时应以问题发生时的峰值和持续时间为准,不能只看一天平均 CPU 利用率。

检查网卡错误、丢包和连接队列

先确认网卡名称:

ip -br link

然后查看统计信息:

ip -s link show dev eth0

将 eth0 替换为实际出口网卡名称。如果系统安装了 ethtool,可以进一步查看:

ethtool -S eth0

重点关注卡顿期间是否持续增加:

  • RX/TX errors。
  • RX/TX dropped。
  • CRC 错误。
  • FIFO 或队列溢出。
  • 网卡重置或链路重新协商。

再查看整体连接状态:

ss -s
ss -lnt

监听端口的 Recv-Q 长时间接近或超过 Send-Q,可能表示应用接受连接不及时、进程忙、线程池耗尽或内核队列承压。大量 SYN-RECV 则可能与新连接突增、上游重试、端口探测或服务端处理能力不足有关。

如果确认服务器出口带宽被备份、同步或大文件任务占满,应先记录当前任务和带宽情况,再采取可回滚的措施,例如暂停非必要后台任务或将任务调整到低峰时段。暂停任务前要确认不会破坏备份、同步或数据一致性;恢复时按原计划重新启用。不要用重启服务器作为第一反应,因为重启会中断连接、清除部分现场状态,也不能修复运营商侧的拥塞。

检查内核和服务日志

查看近期内核日志:

dmesg -T | tail -n 100

如果权限不足,只读取系统允许访问的日志。若使用 systemd 管理应用,可以查询指定服务的时间窗口:

journalctl --since "2025-01-01 11:50:00 UTC" \
           --until "2025-01-01 12:10:00 UTC" \
           -u nginx --no-pager

日期只是示例,应替换为实际问题窗口;服务名也应替换为真实服务。常见线索包括:

  • 网卡 link down、link up。
  • 驱动重置。
  • 磁盘 I/O 错误。
  • 内存不足或进程被 OOM 终止。
  • 应用进程重启。
  • 文件描述符或连接数不足。
  • 服务端主动关闭连接。

如果日志显示服务在晚间频繁重启,网络探测结果可能只是重启期间的次生表现。应先解决进程稳定性,再重新测量路径。

第四层:把网络耗时和应用耗时拆开

使用 curl 分解一次请求

curl 的时间字段能够帮助判断慢在 DNS、TCP 建连、TLS 握手、首字节还是完整响应。示例:

curl -4 -sS -o /dev/null \
  --connect-timeout 5 \
  --max-time 20 \
  --resolve example.com:443:198.51.100.20 \
  -w 'remote=%{remote_ip}\nhttp_code=%{http_code}\nnamelookup=%{time_namelookup}s\nconnect=%{time_connect}s\nappconnect=%{time_appconnect}s\nstarttransfer=%{time_starttransfer}s\ntotal=%{time_total}s\n' \
  https://example.com/

字段含义可以这样理解:

第四层:把网络耗时和应用耗时拆开配图

  • namelookup 高:DNS 查询耗时高。
  • connect 明显高于 namelookup:TCP 建连或网络路径慢。
  • appconnect 比 connect 增长明显:TLS 握手或服务端 TLS 处理需要关注。
  • starttransfer 很高但前面的连接耗时正常:请求已经到达服务端,应用、数据库、磁盘或上游依赖可能慢。
  • total 高而 starttransfer 正常:首字节返回及时,但响应内容传输阶段可能受带宽、窗口、连接复用或大响应影响。

不要在生产服务上高频循环请求大页面。排查时可使用轻量健康接口或静态小文件,控制频率,例如每隔数秒执行一次,并避开会产生订单、写入数据或触发任务的接口。

对比访问日志和应用监控

如果服务器使用 Nginx,可查看对应时间段的访问日志;具体字段由现有日志格式决定。应重点寻找:

  • 请求总耗时。
  • 上游响应耗时。
  • HTTP 状态码。
  • 响应体大小。
  • 同一客户端 IP 是否集中重试。
  • 只有某一类 URL 慢,还是所有 URL 都慢。

如果 Nginx 到上游应用的耗时明显增加,而客户端到 Nginx 的 TCP 建连正常,问题通常已经进入应用层。此时继续增加 MTR 探测次数不会解决问题,应检查:

  • 应用线程池、连接池和队列。
  • 数据库连接等待、慢查询和锁等待。
  • 外部 API 或内部服务依赖。
  • 磁盘读写和日志同步。
  • 大量重试造成的请求放大。
  • 应用是否在晚间执行定时任务。

如果所有请求的 TCP 建连都变慢,同时服务器网卡、CPU 和应用日志也出现异常,才需要把网络栈、连接队列和主机容量放在同一条证据链上分析。

几种典型结果的分支判断

分支一:去程从某一跳开始持续丢包

示例结果如下,数据仅用于说明判断方法:

HOST                         Loss%   Snt   Last   Avg  Best  Wrst  StDev
1. 192.168.1.1                0.0%   100    1.2   1.4   0.8   4.2    0.5
2. 100.64.0.1                 0.0%   100    8.9   9.1   7.8  15.0    1.2
3. 203.0.113.10               4.0%   100   42.0  44.5  40.1  90.0    8.4
4. 203.0.113.20               5.0%   100   86.2  88.1  82.0 150.0   13.7
5. 198.51.100.20              5.0%   100   87.0  89.0  82.4 155.0   14.1

如果晚间样本呈现这种特征,而白天从第 3 跳到目标都接近 0% 丢包,则可初步判断去程中第 3 跳之后的链路在高峰期出现质量下降。还要用 TCP MTR 复核,并保留反向 MTR,避免把单纯的 ICMP 限速当成业务丢包。

处理方向通常是:

  • 确认是否只有一个客户端出口受影响。
  • 使用另一条已授权的网络进行对比,不要只换 DNS。
  • 保存白天和晚间的 MTR、目标端口探测和 UTC 时间。
  • 将“从哪一跳开始、最终目标是否同步丢包、TCP 是否复现”写入线路或机房工单。
  • 在运营商或机房确认前,不要擅自修改服务器防火墙或路由表。

分支二:中间节点丢包,但最终目标正常

例如某一中间节点显示 20% 丢包,后续两跳和目标仍为 0%,且业务端口连接稳定,这通常是该节点对探测回应做了限速。此时不应把该节点标记为故障,也不应据此要求更换线路。

应增加以下验证:

  • 对最终 IP 运行更长时间的 MTR。
  • 运行 TCP 目标端口 MTR。
  • 观察应用实际超时和重传。
  • 从服务器反向运行 MTR。
  • 比较同一时间其他目标地址是否也受影响。

只有当丢包从该节点开始传递到最终目标,且业务也同步恶化,才把该位置列为高优先级怀疑点。

分支三:双向 MTR 正常,但 TTFB 明显升高

这通常说明数据包可以正常到达服务器,慢点位于服务器处理过程或应用依赖。下一步应对齐:

  • curl 的 time_connect、time_appconnect 和 time_starttransfer。
  • 服务器 CPU、I/O、内存和连接队列。
  • Nginx 或应用访问日志。
  • 数据库和内部服务的响应时间。
  • 晚间批处理、备份、日志归档任务。

此时不建议先更换 IP、重启网卡或切换路由。那些动作可能暂时清除连接,但无法解释为什么请求在服务器端等待。

分支四:DNS 地址变化,固定 IP 后恢复

如果晚间域名解析到 IP A,而固定访问 IP B 后恢复,应比较两组地址的:

  • 去程和回程 MTR。
  • TCP 建连时间。
  • TLS 握手时间。
  • TTFB 和完整响应时间。
  • 服务器入口负载。

修复前先确认 IP B 是否可以长期承载流量、证书和 Host 路由是否匹配。如果需要调整 DNS 地址池,应保留旧记录作为回滚内容,按小比例或低风险时段变更,并在缓存逐步过期后继续观察。

分支五:服务器网卡或连接队列只在晚间异常

如果 MTR 延迟正常,但服务器 RX dropped、TX dropped、连接队列、CPU 或 I/O 只在高峰期升高,应优先从主机容量和流量模型处理:

  • 找出占用带宽的进程或定时任务。
  • 限制或错峰非核心传输。
  • 检查应用连接池和监听队列。
  • 确认物理网卡速率、双工状态和驱动日志。
  • 评估带宽、CPU 单核能力和磁盘吞吐是否达到业务峰值。

任何限速、服务重载或防火墙调整,都应先保存当前配置,明确影响范围,并安排回滚。防火墙规则尤其不要直接覆盖现有策略;如果必须调整,应只变更明确的源地址、目标端口和时间范围,记录原规则顺序,验证失败后恢复原配置。

修复后的验证顺序

排查结果明确后,修复应按影响范围从小到大进行,不要同时修改 DNS、路由、防火墙和应用配置,否则无法知道是哪项措施产生了效果。

先验证最小变更

可按以下顺序执行:

  1. 本地网络问题:更换有线接入或修复本地出口设备后,先测试网关,再测试公网目标。
  2. DNS 问题:先用固定 IP 验证,再调整小范围解析记录,保留原记录用于回滚。
  3. 非必要任务占用服务器资源:先暂停或错峰单个任务,观察带宽、I/O 和业务耗时是否恢复。
  4. 应用问题:针对线程池、连接池、慢查询或上游超时进行单项调整,避免直接重启整台服务器。
  5. 路由或运营商拥塞:将完整的双向 MTR、TCP 测试、时间窗口和业务端口信息提交给线路或机房侧处理。

每次变更都要记录变更前值、执行时间、影响对象和回滚方式。修改网络配置、MTU、路由或防火墙前,应先备份当前配置并确认带外管理或其他救援通道可用,避免远程操作把自己锁在服务器之外。

用同一套指标复测

修复后不要只执行一次 ping 就结束。应使用与故障时相同的:

  • 客户端出口。
  • 服务器 IP。
  • IPv4 或 IPv6 协议。
  • MTR 探测类型。
  • TCP 目标端口。
  • curl 请求路径。
  • 时间记录方式。

至少复测以下项目:

  • 客户端到服务器的 ICMP MTR。
  • 客户端到业务端口的 TCP MTR 或 TCP 建连。
  • 服务器到客户端出口的反向 MTR。
  • DNS A、AAAA 和 CNAME 结果。
  • curl 的连接、TLS、TTFB 和总耗时。
  • 服务器网卡丢包、系统负载和应用响应。

更可靠的成功标准不是“某一次延迟变成了 0”,而是:

  • 丢包不再从某一跳持续传递到最终目标。
  • 晚高峰的延迟和抖动回到此前正常时段的范围。
  • TCP 建连和 TLS 耗时恢复。
  • TTFB 与应用日志中的服务端耗时同步下降。
  • 服务器网卡错误、连接队列或 I/O 等异常指标停止增长。
  • 客户端到服务器、服务器到客户端两个方向没有新的单向恶化。

把一次故障变成可持续观察

“晚八点卡”往往具有明显的时间规律,临时测通并不代表问题永久消失。可以建立低频、低负载的合成监控:

  • 每 1 到 5 分钟执行少量 ICMP 或 TCP 探测。
  • 从实际用户出口和服务器侧分别监控。
  • 分开记录 IPv4、IPv6、DNS、TCP 建连和 HTTP TTFB。
  • 在晚间提高观测密度,但不要持续发送高频 MTR。
  • 记录路径变化,例如关键跳数、运营商名称和最终目标延迟。
  • 将网络告警与应用告警分开,避免所有超时都被标记为“线路故障”。

持续观察时,建议保存白天正常区间和晚间异常区间的基线。例如,可以把正常时段的 TCP 建连中位数、P95、丢包比例和 TTFB 作为比较对象;不要仅用某个固定毫秒数作为所有地区和所有业务的统一阈值。

最终,双向 MTR 的价值不在于找出一条“看起来最差”的路由,而在于将去程、回程、目标主机和应用响应放到同一时间轴中。只有当某一跳之后的异常持续到最终目标,并且业务端口和应用指标同时恶化,才能把它认定为拥堵链路;如果路径正常而 TTFB 变慢,就应把排查重点转回服务器资源和应用处理,而不是反复更换探测命令。