标准答案
- 把总耗时拆成 DNS、连接、TLS、发送、等待响应和读取,并记录连接池等待时间。
- 同时观察容器 CPU throttling、fd、线程、连接状态、网络丢包、DNS 响应和下游 P99。
- 区分超时发生在单实例、单可用区、单目标还是所有请求,避免把局部网络问题误判成应用代码问题。
- 修复要设置分层超时、限制重试和并发、处理连接复用,并验证故障时不会形成重试风暴。
题目解析
总 timeout 只说明调用没有在截止时间内完成,可能耗在 DNS、连接池、TCP、TLS、发送、等待响应或读取。客户端、代理、服务端和下游如果各自设置独立 timeout,却没有总 deadline,重试还会进一步放大等待和连接占用。
排查应在容器真实网络命名空间记录分段耗时和错误类型,关联 CPU throttling、fd、连接状态、DNS 响应、丢包、下游 P99 和连接池等待。修复时明确唯一的重试责任层,限制并发和总预算,并针对不可重试的写操作提供幂等边界。
常见误区
- 误区:只增大总超时。改正:拆分并观测 DNS、连接、TLS、下游和连接池等待,修复真正的瓶颈。
- 误区:无上限重试。改正:设置次数、退避、总 deadline 和幂等条件。
- 误区:只从宿主机测试网络。改正:在容器实际 namespace、身份和 DNS 配置下复现。