网络故障、性能与命令证据链
本篇是网络排障方法的唯一权威正文。阅读前应先掌握资源与进程、文件系统与 I/O(输入输出)、TCP/IP(传输控制协议/互联网协议)、HTTP(超文本传输协议)与 TLS(传输层安全协议)、epoll(事件轮询机制)与 Reactor(反应器模型)及Netty(网络通信框架)运行时。所有命令输出均为教学演绎,不是用户生产环境事实。
1. 知识主线
1.1 端到端延迟树与十步证据链
网络排障先定义观察边界,再执行命令。一次请求依次经过客户端、DNS(域名系统)、路由与网卡、中间网络、代理或负载均衡、服务端监听队列、套接字、Netty(网络通信框架)事件循环、业务线程和下游依赖。任何一层都可能把同一个现象表现成“接口慢”,所以每条结论固定回答:影响 -> 采样边界 -> 保存现场 -> 第一命令字段 -> 第二层交叉验证 -> 排除 -> 根因 -> 止血 -> 回滚条件 -> 修复 -> 回归。
flowchart LR
C["客户端"] --> D["DNS 解析"] --> R["路由与网卡"] --> M["中间网络"]
M --> P["代理与负载均衡"] --> S["监听与套接字队列"] --> E["事件循环"]
E --> B["业务线程"] --> X["下游依赖"]
X -. "响应与失败" .-> CsequenceDiagram
participant U as 用户
participant A as 应用
participant N as 网络路径
participant S as 服务端
U->>A: 发起请求并启动总截止时间
A->>N: 解析、建连、握手、发送
N->>S: 请求进入监听和业务队列
alt 正常
S-->>A: 返回完整响应
A-->>U: 记录分阶段耗时
else 失败或超时
A->>A: 保存实例、四元组和时间窗
A->>N: 第一证据与第二证据交叉
A-->>U: 可证伪结论与可回滚止血
end| 固定步骤 | 必须记录 | 不能接受的表达 |
|---|---|---|
| 影响与边界 | 用户范围、错误率、分位延迟、源容器、目标地址、起止时间 | “网络不稳定” |
| 保存现场 | 发布、流量、路由、连接、协议计数、线程与日志快照 | 先重启再看 |
| 两类证据 | 一个责任对象字段与另一层独立信号 | 同一命令执行两次 |
| 排除与根因 | 至少两个竞争假设及最小解释 | 相关指标同时升高即因果 |
| 止血与回滚 | 动作风险、回滚阈值、恢复信号 | 直接改内核参数 |
| 修复与回归 | 原命令、原流量、业务指标、故障注入 | “观察一段时间” |
热门面试题
问题(基础题):为什么“接口慢”不能直接判断为网络问题?
- 考点:端到端时间预算与观察边界。
- 回答思路:先拆请求阶段,再说明每层都需要独立证据。
- 详细答案:接口耗时包含连接池等待、解析、建连、加密握手、代理排队、监听队列、事件循环、业务线程和下游处理。应用线程阻塞、连接池耗尽和重传都能抬高尾延迟,只有把阶段耗时、具体连接和另一层信号对齐,才能定位责任边界。
- 进阶追问:第一轮最先保存什么?
- 进阶回答:保存准确时间窗、实例与网络命名空间、四元组、版本与流量变化,以及尚未被重启清除的连接、队列、线程和协议计数。
问题(原理题):什么叫可排他的证据链?
- 考点:可证伪假设和交叉验证。
- 回答思路:说明两类独立信号、竞争假设和受控止血。
- 详细答案:可排他的证据链不仅证明某项指标异常,还能说明异常属于哪个对象、何时开始、如何影响业务,并排除至少两个主要竞争原因。例如重传增量、指定套接字往返时间上升和路径丢包时间线一致,同时处理器、磁盘和业务线程正常,才能把范围收敛到传输路径。
- 进阶追问:止血后恢复是否等于根因成立?
- 进阶回答:不等于。切流可能绕开多个问题,修复后仍要在同等流量下复用原指标和受控故障验证因果。
问题(场景题):什么时候先止血,什么时候先取证?
- 考点:风险分级与现场价值。
- 回答思路:用资损、全站不可用、局部慢和可复现性分级。
- 详细答案:资损或全站不可用时先执行已有且可回滚的熔断、切流或降级,同时保留最小现场;局部慢和间歇错误优先做五到三十秒低风险采样;可稳定复现的问题在隔离环境完整取证。任何动作都要写回滚阈值和业务恢复信号。
- 进阶追问:支付链路如何兼顾资损与取证?
- 进阶回答:先停止可能重复扣款的新写入或切到查询态,保留幂等流水、渠道事件和连接时间线,再通过主动查单、对账与补偿恢复。
1.2 DNS(域名系统)慢、失败与错误缓存
DNS(域名系统)问题要区分本机缓存、容器配置、递归解析器、权威服务器和应用连接复用。dig +stats <HOST> 观察响应码、答案、服务器和查询耗时;dig +trace <HOST> 开销和外联更多,不是生产默认动作。第二证据可以是 curl -w '%{time_namelookup}' 的阶段耗时、应用解析日志或不同解析器的同窗结果。短暂错误不能只靠清缓存处理,因为负缓存、搜索域、地址族回退和应用自身缓存都可能改变实际路径。
sequenceDiagram
participant A as 应用
participant L as 本地缓存
participant R as 递归解析器
participant W as 权威服务器
A->>L: 查询 api.example
alt 命中正确缓存
L-->>A: 地址与剩余生存时间
else 未命中
L->>R: 递归查询
R->>W: 权威查询
W-->>R: 地址与生存时间
R-->>L: 缓存答案
L-->>A: 返回地址
else 命中错误或负缓存
L-->>A: 旧地址或不存在
A->>A: 对齐缓存层与生存时间
end| 症状 | 第一证据 | 第二证据 | 排除与治理 |
|---|---|---|---|
| 解析慢 | dig 的查询耗时和解析器地址 | curl -w 的解析阶段、应用采样 | 排除连接和服务端处理后,治理递归链路或缓存 |
| 偶发不存在 | 响应码、权威区域与负缓存剩余时间 | 多解析器、权威查询与发布记录 | 不盲目刷新全部缓存,修正区域和生存时间策略 |
| 新旧地址混用 | 答案集合与生存时间 | 应用连接池目标地址、代理后端 | 等待旧连接退场并验证发布窗口 |
数据演绎 1:DNS(域名系统)尾延迟。 基线每秒 800 次请求,连接复用使每秒真实解析 20 次,解析 P50(中位响应时间)=8ms、P99(99 分位响应时间)=25ms。递归解析器抖动后 2% 查询耗时 1.2 秒,整体平均值仅从 42ms 升到 65ms,但新建连接请求的 P99(99 分位响应时间) 升到 1.35 秒。第一证据是查询耗时分布,第二证据是应用解析阶段;切换解析器后两者同步恢复才成立。
热门面试题
问题(基础题):如何判断慢在 DNS(域名系统)而不是建连?
- 考点:阶段计时和独立采样。
- 回答思路:比较解析阶段、连接阶段和指定地址直连。
- 详细答案:先固定源实例与时间窗,用
curl -w分开解析、建连和首字节耗时,再用dig记录解析器、响应码、答案和耗时。指定已验证地址直连只能作为受控对照,还要保留主机名进行 TLS(传输层安全协议)身份校验,不能长期绕过解析。 - 进阶追问:为什么单次
dig很快仍不能排除? - 进阶回答:单次可能命中缓存或错过间歇抖动,必须按业务窗口采样分布,并确认应用使用的是同一个解析器和网络命名空间。
问题(原理题):错误缓存为什么会持续影响发布?
- 考点:正缓存、负缓存与连接复用。
- 回答思路:从多层缓存和连接生命周期解释。
- 详细答案:递归解析器、本地缓存、运行时和应用都可能保存答案,负缓存还会保存“不存在”。即使记录已修正,旧答案要等各层生存时间到期,旧长连接也可能继续访问退役地址,因此发布需要提前降低生存时间、观察旧连接退场并保留双端兼容窗口。
- 进阶追问:直接清空所有缓存有什么风险?
- 进阶回答:会制造解析洪峰并掩盖真实缓存层,还可能让全部实例同时依赖不稳定的上游解析器。
问题(项目题):跨境物流域名切换后部分实例仍访问旧地址,如何处理?
- 考点:缓存层定位、连接池和灰度回滚。
- 回答思路:先区分答案旧还是连接旧,再分批退场。
- 详细答案:记录实例、解析器、答案集合、生存时间和连接池远端地址;若答案已新但连接仍旧,执行有界连接轮换;若答案本身旧,定位具体缓存层。止血保留旧后端容量并限制重连速率,回滚条件是新地址错误率或旧连接退场失败,修复后验证答案、连接和业务成功率。
- 进阶追问:怎样避免重连风暴?
- 进阶回答:为连接最大生命周期加入随机抖动,分批刷新实例,并给新建连接设置全局速率和失败退避。
1.3 连接超时、连接拒绝与监听队列
连接拒绝通常意味着目标路径返回 RST(复位)或本机立即确认无人监听;连接超时表示握手在截止时间内未完成,可能是去程、回程、防火墙、半连接队列或中间设备静默丢弃。ss -lntp 先确认真实地址与端口监听,ss -ant state syn-recv 和监听队列字段观察队列,nstat -az 前后差分观察握手失败与溢出;第二证据来自应用 accept 速率、事件循环延迟、两端日志或受限抓包。
flowchart TD
C["connect 失败"] --> R{"立即失败还是等待超时"}
R -->|立即拒绝| L["核对监听 地址 端口 RST"]
R -->|等待超时| S["核对 SYN 去程与回程"]
S --> H{"SYN_RECV 是否增长"}
H -->|是| B["回程丢失 客户端未确认 半连接压力"]
H -->|否| P["路由 防火墙 中间设备或未到达"]
L --> V["应用监听与发布状态交叉"]
B --> V
P --> VsequenceDiagram
participant C as 客户端
participant K as 服务端内核
participant A as 应用事件循环
C->>K: SYN
K-->>C: SYN+ACK
C->>K: ACK
K->>K: 进入完成连接队列
alt 应用及时消费
A->>K: accept
K-->>A: 已连接套接字
else 事件循环阻塞
K->>K: 完成队列增长或溢出
C--xK: 新连接失败或超时
end| 故障 | 关键字段 | 第二信号 | 错误动作 |
|---|---|---|---|
| 连接拒绝 | 监听地址、端口、RST(复位) | 发布状态、进程与代理健康 | 直接扩大超时 |
| 半连接压力 | SYN_RECV、握手重传增量 | 回程路径和客户端确认 | 看到高就认定攻击 |
| 完成队列压力 | 监听队列占用与溢出计数 | accept 速率、事件循环延迟 | 只调大 backlog |
数据演绎 2:SYN(同步序列号)队列。 服务端半连接容量教学值 1024,正常 SYN_RECV=12;故障时每秒新建 3000,回程丢包使 SYN_RECV=980、握手重传每秒增加 620,而完成队列仅 18。若事件循环阻塞,则可能是 SYN_RECV=9、完成队列 510/512、accept 速率从每秒 1800 降到 40。两组不能用同一个“调大队列”结论。
热门面试题
问题(基础题):连接超时和连接拒绝有什么本质区别?
- 考点:握手反馈与错误语义。
- 回答思路:从是否收到明确失败报文解释。
- 详细答案:拒绝通常是目标或中间路径立即返回 RST(复位),常见于无人监听或策略主动拒绝;超时表示在截止时间内没有完成握手,可能是报文被静默丢弃、回程故障或队列压力。两者都要结合真实目标、监听和双端证据,不能只看客户端异常文本。
- 进阶追问:代理存在时拒绝来自哪里?
- 进阶回答:可能来自本地代理、负载均衡或最终服务,必须用连接目标、代理日志和报文观察点确定责任层。
问题(原理题):半连接队列和完成连接队列如何区分?
- 考点:握手状态与应用消费边界。
- 回答思路:以最终确认和
accept为边界。 - 详细答案:服务端收到首个 SYN(同步序列号)后处于半连接阶段,最终 ACK(确认)到达后握手完成并进入完成连接队列,应用执行
accept才将其取走。前者异常偏向握手与回程,后者异常偏向应用消费、事件循环和调度。 - 进阶追问:为什么调大队列不是根治?
- 进阶回答:它只增加缓冲时间,若消费能力或链路未恢复,最终仍会溢出,并增加内存和故障恢复时长。
问题(场景题):WMS(仓储管理系统)发布后新连接大量拒绝,怎么排查?
- 考点:发布、监听、代理和回滚。
- 回答思路:锁定版本时间线和真实监听地址。
- 详细答案:先保存发布批次、实例、目标地址和错误比例,用
ss -lntp核对新进程是否监听正确地址端口,再查代理后端健康与连接目标。若新版本启动完成但尚未就绪就接流,先摘除该批并回滚;修复就绪门禁后灰度复测新建成功率和队列。 - 进阶追问:端口监听就能放量吗?
- 进阶回答:不能,还需依赖初始化、事件循环、线程池和下游探测就绪,监听只证明内核接受连接。
1.4 TIME_WAIT(等待关闭)、CLOSE_WAIT(等待本端关闭)与端口耗尽
TIME_WAIT(等待关闭)通常由主动关闭方持有,用于吸收旧报文并可靠完成关闭;CLOSE_WAIT(等待本端关闭)表示对端已经关闭,而本地应用尚未关闭套接字。状态数量必须和连接建立率、持续时间、源地址端口空间、文件描述符和业务成功率一起解释。TIME_WAIT(等待关闭)多不等于耗尽,CLOSE_WAIT(等待本端关闭)持续增长更可能指向应用泄漏或关闭路径阻塞。
stateDiagram-v2
[*] --> ESTABLISHED
ESTABLISHED --> FIN_WAIT_1: 本端主动关闭
FIN_WAIT_1 --> FIN_WAIT_2: 收到确认
FIN_WAIT_2 --> TIME_WAIT: 收到对端关闭
TIME_WAIT --> [*]: 等待旧报文失效
ESTABLISHED --> CLOSE_WAIT: 收到对端关闭
CLOSE_WAIT --> LAST_ACK: 应用执行关闭
LAST_ACK --> [*]: 收到确认| 现象 | 第一证据 | 第二证据 | 正确动作 |
|---|---|---|---|
| TIME_WAIT(等待关闭)多 | 状态数、源端口、新建率 | 连接复用率、出口转换表 | 先降短连接和重试,不先改回收参数 |
| CLOSE_WAIT(等待本端关闭)涨 | 进程套接字与文件描述符 | 线程栈、异常关闭路径 | 修复应用关闭和超时取消 |
| 新连接失败 | 临时端口范围与已占用四元组 | 网关转换表、连接池新建率 | 扩容地址池并恢复复用 |
数据演绎 3:短连接端口压力。 单源地址可用临时端口教学值约 28000,目标单一且每秒新建 900,若连接状态平均保留 60 秒,理论需求约 54000 个四元组,超过单地址容量;此时旧长连接仍成功而新连接失败。止血优先恢复连接复用、关闭多层重试和分散出口源地址,不能仅缩短 TIME_WAIT(等待关闭)。
热门面试题
问题(基础题):TIME_WAIT(等待关闭)多为什么不能直接调参?
- 考点:协议职责与容量条件。
- 回答思路:先判断是否真的造成端口或转换表耗尽。
- 详细答案:TIME_WAIT(等待关闭)是正常关闭状态,数量大可能只是连接建立率高。只有新连接失败、源端口接近耗尽或转换表水位异常并与时间线一致,才构成容量问题。贸然缩短保护时间可能让旧报文污染新连接,应先减少短连接和重复重试。
- 进阶追问:连接复用为什么有效?
- 进阶回答:它降低每秒新建和关闭次数,减少握手、端口、加密认证与中间设备映射成本。
问题(原理题):CLOSE_WAIT(等待本端关闭)持续增长说明什么?
- 考点:半关闭与应用资源释放。
- 回答思路:说明对端已发关闭而本端应用未释放。
- 详细答案:该状态说明内核已收到对端关闭,但本地进程仍持有套接字。若持续增长,要按进程和调用栈查异常分支、超时取消、连接池归还和阻塞线程;单纯调整内核状态时间不能替应用执行关闭。
- 进阶追问:怎样证明是应用泄漏?
- 进阶回答:同一进程的状态数与文件描述符同步增长,线程或对象证据指向未关闭路径,修复该路径后增长停止并逐步回落。
问题(项目题):支付渠道新连接失败但旧连接正常,如何判断端口耗尽?
- 考点:新旧连接分叉和出口容量。
- 回答思路:核对新建率、源端口、连接复用和网关映射。
- 详细答案:固定支付实例与渠道地址,查看状态分布、临时端口使用和连接池新建率,再让出口团队核对转换表。若关闭重试、恢复复用或切换源地址后新建恢复,且旧连接一直可用,端口或映射容量假设更可信;资金结果仍按原交易号查询。
- 进阶追问:直接扩大连接池可以吗?
- 进阶回答:可能更快耗尽端口并冲击渠道,必须先限制新建率并按渠道容量灰度调节。
1.5 重传、乱序、零窗口与尾延迟
重传是恢复机制的结果,不直接指出责任方;乱序可能来自多路径、调度和卸载;零窗口是接收方流量控制信号,通常说明接收应用没有及时消费。nstat -az 使用前后差分得到区间增量,ss -tinap 锁定连接的往返时间、重传、拥塞窗口和接收窗口,sar -n TCP,ETCP 1 5 看趋势。第二证据必须来自网卡、路径、对端窗口、事件循环或业务线程。
sequenceDiagram
participant S as 发送端
participant N as 网络路径
participant R as 接收端
S->>N: 序号 1
N->>R: 序号 1
S->>N: 序号 2
N--xR: 序号 2 丢失
S->>N: 序号 3
N->>R: 序号 3 乱序到达
R-->>S: 重复确认与选择确认
S->>R: 重传序号 2
alt 接收应用阻塞
R-->>S: 通告零窗口
S->>R: 周期性窗口探测
else 正常消费
R-->>S: 更新可用窗口
end| 信号 | 保护对象 | 第一证据 | 不能直接推出 |
|---|---|---|---|
| 重传 | 可靠交付 | 区间重传率、具体连接 | 一定是服务端或本机网卡 |
| 乱序 | 有序字节流恢复 | 重复确认、选择确认、序列时间线 | 一定发生物理丢包 |
| 零窗口 | 接收方缓冲 | 哪一端通告、接收队列 | 网络拥塞 |
数据演绎 4:重传抬高尾延迟。 平均丢失比例仅 0.8%,一个请求涉及 18 个数据段时,教学独立假设下至少一段丢失概率约为 1-0.992^18≈13.5%。多数请求仍在 80ms 完成,少数等待 200ms 以上恢复,使平均值 92ms 变化不大而 P99(99 分位响应时间) 从 210ms 升到 680ms。
数据演绎 5:零窗口。 WMS(仓储管理系统)接收端每秒到达 50MB(兆字节),业务线程因数据库锁等待只能消费 8MB(兆字节),32MB(兆字节)接收缓冲不到一秒就满;发送方看到零窗口并停发。第一证据是接收端通告窗口,第二证据是事件循环或业务线程积压,修复应恢复消费而非换拥塞算法。
热门面试题
问题(基础题):看到 TCP(传输控制协议)重传为什么不能归因服务端?
- 考点:端到端反馈与观察点限制。
- 回答思路:说明重传只表示发送方未获得足够确认。
- 详细答案:报文可能在去程、回程、客户端、服务端或中间设备丢失,确认也可能丢失;乱序也会产生重复确认。必须结合具体连接、双端计数、路径和网卡时间线,才能缩小发生位置,不能从发送方一次重传命名责任方。
- 进阶追问:如何得到区间重传率?
- 进阶回答:记录采样起止计数,用增量除以同窗发送段增量,并注明主机、网络命名空间和聚合口径。
问题(原理题):零窗口和拥塞有什么区别?
- 考点:流量控制与拥塞控制。
- 回答思路:比较保护对象、信号来源和调节者。
- 详细答案:零窗口由接收方通告,用于保护接收缓冲,常见原因是应用消费慢;拥塞窗口由发送方根据路径反馈维护,用于保护共享网络。实际发送量受两者较小值约束,排查分别关注接收线程与路径重传、往返时间和排队。
- 进阶追问:扩大接收缓冲能根治吗?
- 进阶回答:只能推迟暴露并增加内存;若持续到达率高于消费率,最终仍会满,必须治理消费和背压。
问题(场景题):平均延迟稳定但 P99(99 分位响应时间)升高,如何查?
- 考点:分位数、少数慢路径和采样关联。
- 回答思路:把慢请求与解析、重传、队列和垃圾回收时间线关联。
- 详细答案:保留请求标识和分阶段耗时,抽取慢请求对应的连接、重传与窗口,再对齐事件循环、业务池和下游延迟。少量解析超时、重传恢复或池等待都能只影响尾部,平均值不能代表用户最差路径。
- 进阶追问:怎样避免采样偏差?
- 进阶回答:覆盖完整故障窗口,按实例和目标分层,保留分布而非只取平均,并记录采样丢失与聚合口径。
1.6 丢包、MTU(最大传输单元)黑洞与网卡错误
链路丢包要区分主机队列、网卡硬件、虚拟设备、中间路径和对端。ip -s link 看接口收发丢弃与错误,ethtool -S <IFACE> 的字段依驱动而异,必须结合驱动文档;tracepath <HOST> 可辅助观察路径 MTU(最大传输单元),mtr 的中间跳丢包若末端正常,可能只是设备限速回应,不能当业务丢包。MTU(最大传输单元)黑洞常见特征是小报文成功、大报文或握手后传输卡住,路径分片发现反馈又被过滤。
flowchart LR
A["应用大响应"] --> K["内核分段与路径 MTU"] --> V["虚拟网卡"] --> P["物理网卡"] --> M["中间路径"] --> R["接收端"]
K -. "反馈被过滤" .-> B["MTU 黑洞"]
V -. "队列丢弃" .-> D["软丢包"]
P -. "CRC 或驱动错误" .-> E["硬件证据"]
M -. "拥塞或策略" .-> L["路径丢包"]| 分支 | 第一证据 | 第二证据 | 回归方式 |
|---|---|---|---|
| 网卡错误 | 接口和驱动区间增量 | 邻机端口、交换设备或另一接口 | 同流量下错误不再增长 |
| MTU(最大传输单元)黑洞 | 大小报文分叉、路径 MTU(最大传输单元) | 受限抓包与中间策略 | 恢复反馈或统一 MTU(最大传输单元)后大包成功 |
| 中间路径丢包 | 终点业务与多点时间线 | 双端抓包或路径切换对照 | 原路径受控压测通过 |
数据演绎 6:MTU(最大传输单元)黑洞。 64 字节探测和 TLS(传输层安全协议)握手成功,发送 4KB(千字节)请求后等待超时;tracepath 显示路径可承载值低于容器接口配置,抓包见大段重复而缺少必要反馈。临时降低该路径报文大小后恢复,回滚条件是吞吐显著下降;长期统一隧道开销与反馈策略。
数据演绎 7:网卡丢包。 IoT(物联网)网关每秒 18 万个 180 字节小包,带宽仅约 259Mbit/s(兆比特每秒),但包率超过处理预算,接收丢弃每秒增加 2400;处理器软中断同窗升高。合并消息批次和多队列分流后丢弃归零,说明瓶颈是包率而非带宽。
热门面试题
问题(基础题):为什么
ping成功不能排除网络问题?- 考点:协议、报文大小和路径差异。
- 回答思路:说明控制报文和业务连接的差异。
- 详细答案:探测可能使用不同协议、优先级、大小和负载均衡路径;小报文成功无法证明大报文不会遇到 MTU(最大传输单元)黑洞,也无法证明端口、TLS(传输层安全协议)、代理和应用健康。它只能作为特定观察点的辅助证据。
- 进阶追问:完全禁用探测是否更专业?
- 进阶回答:也不是。应明确它能证明的有限结论,并与业务协议、套接字和路径证据组合。
问题(原理题):如何识别 MTU(最大传输单元)黑洞?
- 考点:路径分片发现与大小分叉。
- 回答思路:对比小报文、大报文和反馈报文。
- 详细答案:典型现象是解析、建连甚至握手正常,但较大载荷卡住或反复重传。用路径工具观察可承载大小,以受限抓包确认大段和反馈时间线,再核对隧道、容器与物理接口配置;临时缩小报文只用于验证和止血。
- 进阶追问:为什么不能长期固定很小的 MTU(最大传输单元)?
- 进阶回答:会增加报文数量、处理开销和头部占比,应修复路径一致性和必要反馈。
问题(项目题):IoT(物联网)带宽不高却丢包,为什么?
- 考点:包率、软中断与队列预算。
- 回答思路:区分每秒比特数和每秒报文数。
- 详细答案:大量小包的总带宽不高,但每个报文都要经过网卡队列、软中断、协议栈和应用解码,先耗尽的是包率处理能力。需要把接口丢弃、软中断、事件循环和消息速率对齐,治理批量、分流和削峰,而不是只扩链路带宽。
- 进阶追问:如何证明合并批次有效?
- 进阶回答:保持消息总量相同,对比包率、接口丢弃、软中断、事件循环延迟和业务端到端延迟。
1.7 代理、负载均衡与 TLS(传输层安全协议)边界
代理把一条调用拆成客户端到代理、代理排队、代理到后端三段,还可能终止 TLS(传输层安全协议)、复用连接、执行重试和健康检查。curl -w 分离解析、连接、握手、首字节和总耗时;openssl s_client -connect <HOST:PORT> -servername <HOST> 只在授权下检查证书链、名称和协议协商;第二证据是代理访问日志、上游连接指标、后端接收日志和证书发布记录。不能把代理返回的 502、504 或 RST(复位)直接归给后端。
sequenceDiagram
participant C as 客户端
participant L as 负载均衡
participant P as 代理
participant S as 服务端
C->>L: 连接与 TLS 握手
L->>P: 转发请求
P->>S: 从上游连接池获取连接
alt 后端及时响应
S-->>P: 响应
P-->>C: 返回成功
else 上游池等待或超时
P--xS: 截止时间到达
P-->>C: 502 或 504
else 证书身份失败
L--xC: 握手告警
end| 层次 | 核心字段 | 第二证据 | 常见误判 |
|---|---|---|---|
| 客户端到代理 | 解析、建连、握手耗时 | 代理入口日志 | 入口成功等于后端成功 |
| 代理内部 | 排队、重试、上游池等待 | 配置版本与池指标 | 504 必然由后端慢 |
| 代理到后端 | 新建率、复用、响应时间 | 后端接收与发送日志 | 后端无日志就是没收到 |
| TLS(传输层安全协议) | 证书链、名称、有效期、协议 | 发布记录与不同节点对照 | 端口通就代表身份正确 |
数据演绎 8:代理连接池。 客户端总耗时 2 秒,其中解析 8ms、入口连接 12ms、握手 35ms、首字节 1.95 秒;代理日志显示上游池等待 1.72 秒,后端处理仅 90ms。扩后端无效,临时降低入口并发并恢复上游连接池后成功率恢复,说明瓶颈在代理内部资源。
数据演绎 9:跨境 TLS(传输层安全协议)。 支付 RTT(往返时间)180ms,新建连接需要多个往返,连接复用率从 96% 降到 30% 后每次请求额外增加约 360ms 到 720ms,尾延迟显著抬高。恢复连接复用有效,但证书轮换仍需最大连接生命周期保证新证书逐步生效。
热门面试题
问题(基础题):如何区分代理慢和后端慢?
- 考点:分段时间预算。
- 回答思路:对齐客户端、代理和后端三条时间线。
- 详细答案:客户端只看到总耗时,代理应提供入口排队、上游池等待、连接、首字节和重试,后端提供接收、排队、处理和发送时间。若代理等待长而后端实际处理短,瓶颈在代理资源;若后端接收后处理长,才进一步查业务层。
- 进阶追问:时钟不一致怎么办?
- 进阶回答:先核对时间同步,使用同一请求标识和单节点持续时长,必要时依靠单调时钟阶段指标而非绝对时间戳。
问题(原理题):TLS(传输层安全协议)成功要验证哪些内容?
- 考点:加密、身份和信任链。
- 回答思路:说明证书链、主机名、有效期和协商。
- 详细答案:不仅要完成密钥协商,还要验证证书链是否到可信根、主机名是否匹配、有效期与系统时间是否正确、协议和算法是否双方支持。经代理终止后还要明确哪一段验证了谁,不能把前一段成功外推到后端段。
- 进阶追问:忽略证书校验能否作为止血?
- 进阶回答:不能作为生产默认止血,它破坏身份边界;应回滚错误证书、切健康节点或修复信任链。
问题(项目题):支付渠道返回超时但后端显示已处理,如何设计?
- 考点:结果未知、幂等与主动查单。
- 回答思路:网络证据和资金正确性分开。
- 详细答案:客户端超时只能标记结果未知,以原交易号主动查询或幂等重试;本地状态机不直接失败或新建交易。排障对齐代理、渠道接收和响应时间线,止血限制重试和并发;最终用唯一流水、对账与补偿保证资金收敛。
- 进阶追问:为什么 TCP(传输控制协议)确认不能代表支付成功?
- 进阶回答:确认只到传输栈边界,不代表渠道业务事务提交,更无法覆盖响应丢失后的结果未知窗口。
1.8 应用连接池、截止时间与重试放大
连接池把握手和认证成本摊到多次请求,同时把外部依赖并发限制成有界资源。池等待必须计入总截止时间,连接超时、读取超时和总截止时间不能混用。连接池过小会在客户端排队,过大则把压力直接传给代理、数据库或第三方;多层重试会令尝试次数相乘,并让已经超时但仍在下游执行的旧请求与新请求重叠。
flowchart TD
R["原始请求 200 QPS"] --> C["客户端最多 3 次尝试"]
C --> G["网关最多 3 次尝试"]
G --> S["服务最多 3 次尝试"]
S --> X["最坏 5400 次下游尝试"]
X --> P["连接池等待增长"] --> T["更多超时"] --> C| 资源 | 必备指标 | 容量原则 | 失败策略 |
|---|---|---|---|
| 活跃连接 | 活跃、空闲、新建率 | 不超过下游配额和本地预算 | 池满快速失败或有界排队 |
| 等待队列 | 等待者、获取耗时 | 纳入调用截止时间 | 不无限等待业务线程 |
| 重试 | 原始量、重试量、剩余预算 | 只保留一个责任层 | 退避、抖动、全局配额 |
| 连接生命周期 | 年龄、校验失败、复用次数 | 随机化轮换 | 逐步淘汰陈旧连接 |
数据演绎 10:连接池容量。 跨境物流峰值 600QPS(每秒查询率),渠道 P99(99 分位响应时间)=0.8s,单连接同时只处理一个请求,按利特尔法则在途量约 480。池只有 200 时至少 280 个请求等待;盲目扩到 1000 又超过渠道 500 并发配额。合理方案是按 480 加有限余量,设置获取超时、削峰和渠道隔离。
数据演绎 11:重试风暴。 原始 200QPS(每秒查询率),客户端、网关、服务都允许初次加两次重试,最坏下游尝试为 200×3×3×3=5400QPS(每秒查询率)。关闭内层重试并设 10% 全局重试配额后,故障期尝试受控在 220QPS(每秒查询率)附近。
热门面试题
问题(基础题):连接池越大吞吐越高吗?
- 考点:并发上限与排队位置。
- 回答思路:结合下游配额、在途量和资源预算回答。
- 详细答案:池只决定允许多少并发和在哪里排队,不创造下游处理能力。超过下游容量后,更大的池会增加套接字、内存、端口与服务端排队,使超时和恢复更慢;应按到达率、分位响应时间、每连接并发能力和渠道配额估算并灰度验证。
- 进阶追问:池满应该等待还是失败?
- 进阶回答:取决于剩余截止时间和业务可补偿性,通常采用很短的有界等待,超过后快速失败或进入持久化补偿。
问题(原理题):为什么多层重试会形成正反馈?
- 考点:尝试乘法和旧请求重叠。
- 回答思路:量化最大尝试并说明资源没有立即释放。
- 详细答案:上游超时不意味着下游执行停止,旧请求仍占连接和线程,新重试又进入同一拥塞路径。多层各自重试会令尝试次数相乘,池等待和超时继续触发更多重试,形成正反馈。应只保留一个责任层并传递截止时间与重试预算。
- 进阶追问:哪些错误允许重试?
- 进阶回答:仅对明确瞬时、仍有剩余预算且业务幂等的错误重试;结果未知的写操作先查询,始终复用原业务键。
问题(项目题):支付连接池耗尽如何止血?
- 考点:资金正确性、有界资源与补偿。
- 回答思路:先抑制重试和新流量,再保存未决交易。
- 详细答案:停止内层重试、降低渠道并发、池满快速进入持久化未决队列,保留原交易号主动查单;同时记录池等待、新建率、目标错误和端口水位。若切备用渠道,要遵守路由和幂等边界,不能把未知交易直接重发成新交易。
- 进阶追问:恢复后如何放量?
- 进阶回答:按渠道分批增加并发,观察池等待、成功率、渠道限流和未决年龄,超过阈值立即回滚上一档。
1.9 Netty(网络通信框架)事件循环阻塞与写背压
EventLoop(事件循环)负责处理就绪事件和任务,任何阻塞业务、同步日志、慢序列化或无界回调都会拖慢同一线程绑定的多个 Channel(通道)。写缓冲超过高水位时 Channel(通道)变为不可写,业务应停止继续灌入并在恢复可写后续传;忽略背压会令直接内存和任务队列膨胀。第一证据是事件循环任务队列、延迟和写水位,第二证据是线程栈、JFR(Java 飞行记录器)、套接字队列与下游处理率。
sequenceDiagram
participant K as 内核就绪队列
participant E as EventLoop 事件循环
participant H as Handler 处理器
participant B as 业务线程池
participant C as Channel 通道
K->>E: 读就绪
E->>H: 传播入站事件
alt 正确卸载阻塞任务
H->>B: 提交有界业务任务
B-->>E: 异步回写
else 在事件循环中阻塞
H->>H: 数据库等待 800 毫秒
K->>E: 更多事件持续积压
end
E->>C: 写入响应
alt 写缓冲超过高水位
C-->>E: 不可写并触发背压
else 正常
C-->>K: 刷写字节
endflowchart LR
I["入站每秒 12000 条"] --> E["事件循环"] --> B["业务池每秒 8000 条"]
B --> W["写缓冲"] --> N["网络每秒 6000 条"]
N -. "消费小于生产" .-> H["高水位 不可写"]
H --> L["暂停读取 限流 批量与降级"]
L --> R["低水位后恢复"]| 现象 | 第一证据 | 第二证据 | 修复方向 |
|---|---|---|---|
| 事件循环延迟 | 任务队列、循环延迟 | 线程栈与 JFR(Java 飞行记录器) | 阻塞卸载、有界预算 |
| 写队列膨胀 | 可写状态、高低水位、待发字节 | ss 发送队列和对端消费 | 背压、限流、批量 |
| 业务池耗尽 | 活跃、队列、拒绝、任务耗时 | 下游耗时与锁等待 | 隔离依赖、超时与降级 |
数据演绎 12:事件循环阻塞。 一个 EventLoop(事件循环)绑定 1200 个连接,某处理器每秒执行 200 次 40ms 同步调用,单线程需求达到 8 秒处理量,事件循环延迟从 2ms 升到 1.4 秒。线程栈持续停在数据库调用,网卡和重传正常;卸载到有界业务池后读事件恢复。
数据演绎 13:写背压。 IoT(物联网)告警入站每秒 12000 条,网络只能发出 6000 条,若每条 1KB(千字节),每秒净积压约 6MB(兆字节),一分钟可达 360MB(兆字节)。高水位触发后暂停非关键读取并聚合告警,低水位恢复,不能继续无界 write。
热门面试题
问题(基础题):为什么 EventLoop(事件循环)不能执行阻塞业务?
- 考点:线程归属和多连接共享。
- 回答思路:说明一个线程服务多个 Channel(通道)。
- 详细答案:事件循环串行处理其绑定连接的就绪事件和任务,一个处理器阻塞会让其他连接即使已经就绪也无法被读取或回写,形成头部阻塞。阻塞任务应卸载到有界业务池,并保留超时、背压和回写线程归属。
- 进阶追问:线程池无限大能解决吗?
- 进阶回答:不能,会把过载传给下游并增加切换和内存;池、队列和拒绝策略必须按依赖容量设计。
问题(原理题):Channel(通道)不可写时应该怎么做?
- 考点:高低水位和背压传播。
- 回答思路:停止生产、保留有界状态、恢复后续传。
- 详细答案:不可写表示待发送字节超过高水位,不代表连接已断。上游应暂停或降低生产、合并非关键消息、限制单连接待发量,并在低水位恢复可写后按公平预算继续;同时查发送队列、对端消费和路径吞吐。
- 进阶追问:只把高水位调大可以吗?
- 进阶回答:只能延迟爆发并增加直接内存,若生产长期高于消费仍会失控,必须建立端到端背压。
问题(项目题):IoT(物联网)报警风暴如何保护事件循环?
- 考点:包率、削峰、聚合和背压。
- 回答思路:从入口到业务队列分层限额。
- 详细答案:入口按租户和设备限速,事件循环只做解码与轻量校验,业务处理卸载到有界池;同类告警按时间窗聚合,经 MQ(消息队列)削峰。写端遵守可写水位,非关键通知可降级,关键告警持久化补偿。
- 进阶追问:怎样证明没有丢关键告警?
- 进阶回答:以设备事件号建立幂等流水,对比入口计数、持久化数、聚合映射和最终通知,对差异执行补偿。
1.10 宿主机、容器与网络命名空间
容器内的接口、路由、套接字和计数器属于其网络命名空间,宿主机还包含虚拟以太网、桥接、隧道、网络地址转换和物理网卡。排障命令必须在真实发起或接收连接的命名空间执行,并记录容器、进程和接口映射;宿主机全局 ss、ip 输出不能无条件替代容器视图,容器内也看不到全部物理和转换层事实。
flowchart LR
A["容器应用"] --> V1["容器虚拟接口"] --> V2["宿主虚拟接口"] --> B["桥接或路由"]
B --> N["网络地址转换与策略"] --> P["物理网卡"] --> R["远端"]
A -. "容器内 ss ip" .-> V1
P -. "宿主 ip ethtool" .-> N| 观察点 | 可见事实 | 看不到的事实 | 交叉方式 |
|---|---|---|---|
| 容器 | 应用套接字、容器路由与接口 | 物理网卡和全部转换表 | 映射进程与虚拟接口 |
| 宿主 | 虚拟链路、策略、物理接口 | 应用运行时队列语义 | 用容器标识和四元组关联 |
| 代理或节点 | 前后端连接和健康检查 | 业务事务结果 | 请求标识与服务日志关联 |
数据演绎 14:命名空间误判。 容器 eth0 无错误,宿主对应物理接口接收丢弃每秒增加 1800;只在容器取证会错误排除网卡层。另一场景宿主物理接口正常,但容器虚拟接口队列丢弃增长,说明问题位于虚拟链路或策略层。必须保存映射和同窗增量。
热门面试题
问题(基础题):为什么容器内和宿主机的
ss结果不同?- 考点:网络命名空间隔离。
- 回答思路:说明套接字和接口属于命名空间。
- 详细答案:容器通常拥有独立网络命名空间,只能看到其中的套接字、接口和路由;宿主机还承载虚拟链路、代理和物理接口。应在应用所在命名空间查连接,再以四元组、进程和虚拟接口映射到宿主层。
- 进阶追问:宿主全局计数能否证明某容器有问题?
- 进阶回答:不能,必须按接口、队列、四元组或容器映射归属,否则可能是其他工作负载贡献。
问题(原理题):容器请求出站会经过哪些边界?
- 考点:虚拟接口、路由、转换和物理网卡。
- 回答思路:沿真实数据路径逐层说明。
- 详细答案:应用写入容器套接字后,经容器路由和虚拟接口进入宿主对应端,再经过桥接或路由、策略与可能的地址转换,最后从物理接口发出。不同网络插件实现会变化,因此应以目标环境配置和实际路由为准。
- 进阶追问:哪里抓包最可靠?
- 进阶回答:没有单点最可靠;按假设选择容器接口、宿主虚拟端、物理端或对端,必要时两点对齐,并考虑卸载和转换前后差异。
问题(场景题):只有一个容器访问渠道超时,怎么查?
- 考点:局部范围和对照实验。
- 回答思路:比较同节点和跨节点健康容器的命名空间事实。
- 详细答案:固定故障容器,记录路由、解析、源地址、套接字和虚拟接口,再与同节点健康容器对照;随后映射宿主策略、转换和物理接口。若迁移容器后恢复,也只能说明问题与原节点路径相关,仍要用保存证据确定具体边界。
- 进阶追问:直接重建容器有什么缺点?
- 进阶回答:会清除连接、路由和队列现场,且可能仅通过换路径暂时恢复,无法证明根因。
1.11 命令字段、采样边界与受限抓包
命令是取证工具,不是答案。每次执行都记录主机或容器、目标对象、开始结束时间、采样间隔、累计值或区间增量、正常参照与权限。tcpdump 仅在低风险证据不能区分方向时使用:必须限定接口、五元组、方向、时长或包数、截断长度和环形文件;敏感载荷最小化采集、限制权限并按流程销毁,还要记录工具报告的采集丢包。
flowchart TD
H["业务假设"] --> L["低风险命令缩小对象"] --> C["跨层交叉验证"]
C --> Q{"仍无法判断报文方向?"}
Q -->|否| R["形成结论"]
Q -->|是且获授权| P["受限 tcpdump"]
P --> F["限定接口 五元组 时长 包数 截断"] --> S["脱敏 保存 销毁"] --> R| 工具 | 关键字段与边界 | 第二证据 | 受限原则 |
|---|---|---|---|
dig | 解析器、响应码、答案、生存时间、耗时 | 应用解析阶段 | 避免无目的递归追踪 |
curl | 解析、连接、握手、首字节、总耗时 | 代理与服务日志 | 不把单次成功当分布 |
openssl | 证书链、名称、有效期、协商 | 发布记录和节点对照 | 不输出或保存私钥材料 |
ss | 状态、队列、往返时间、窗口、重传 | 线程、协议计数、对端 | 固定进程和四元组 |
nstat/sar | 累计计数差分与时间趋势 | 具体连接和业务指标 | 不用累计总量代替区间率 |
ip/ethtool | 路由、接口、丢弃、驱动字段 | 对端口和驱动说明 | 字段含义按版本核对 |
tracepath/mtr | 路径 MTU(最大传输单元)与逐跳趋势 | 终点业务和双端证据 | 中间跳不回应不等于丢业务包 |
tcpdump | 报文方向、序列、标志与时间线 | 对端日志或第二采集点 | 最后使用,严格过滤和限时 |
sequenceDiagram
participant O as 值班人员
participant H as 故障主机
participant P as 对端或第二层
O->>H: 记录时钟、命名空间、四元组
O->>H: 执行 5 至 30 秒低风险采样
H-->>O: 第一字段与区间增量
O->>P: 取得独立日志或计数
P-->>O: 第二信号
alt 已能排除竞争假设
O->>O: 形成根因和回滚止血
else 获批受限抓包
O->>H: 指定接口、过滤、包数和截断
H-->>O: 报文时间线及采集丢包
end热门面试题
问题(基础题):为什么累计计数不能直接比较?
- 考点:采样窗口和计数器语义。
- 回答思路:说明启动时长和流量不同会扭曲结论。
- 详细答案:累计值包含进程或主机整个生命周期,无法说明故障窗口发生了多少。应记录起止值、间隔和同窗发送量,计算增量或比率,并注意计数器重置、溢出和命名空间差异。
- 进阶追问:两台主机增量能直接比吗?
- 进阶回答:还要按流量、连接数和实例角色归一化,并确认内核与字段口径一致。
问题(原理题):生产抓包有哪些风险?
- 考点:性能、隐私和观察偏差。
- 回答思路:列出权限、过滤、采样丢包和卸载影响。
- 详细答案:无过滤抓包会消耗处理器、内存和磁盘,载荷可能包含凭证或隐私;选错接口、采集丢包、分段卸载和地址转换还会造成解释偏差。必须授权、限时限量、最小截断、加密保存并与第二证据对齐。
- 进阶追问:HTTPS(安全超文本传输协议)抓包还有价值吗?
- 进阶回答:有,可观察地址、时序、握手、长度、重传和关闭,但不能据此读取或猜测加密业务内容。
问题(场景题):
mtr显示中间一跳丢包 80% 如何判断?- 考点:控制报文限速与终点事实。
- 回答思路:看后续跳和终点是否继承丢失。
- 详细答案:中间设备可能优先转发业务而限速回应探测;若后续跳和终点正常,不能把该跳标为业务丢包。应结合终点成功率、实际 TCP(传输控制协议)重传、双端观测和路径切换对照。
- 进阶追问:何时升级网络团队?
- 进阶回答:提交源目标、时间窗、路径、双端报文或接口增量、业务影响和已排除项,而不是只说“中间一跳红了”。
1.12 容量公式与十五组数据演绎
容量模型用于形成数量级假设,不是替代实测。常用关系包括:并发量约等于到达率乘响应时间;吞吐上限受最慢阶段约束;带宽时延积等于带宽乘往返时间;短连接状态量约等于新建率乘保留时间;积压增长率等于生产率减消费率;包率等于吞吐字节除以平均报文大小。公式必须注明连接是否多路复用、响应时间采用哪个分位、是否包含重试、报文是否独立及协议头开销。
flowchart LR
Q["到达率 λ"] --> L["并发 L≈λW"]
W["响应时间 W"] --> L
B["带宽 × RTT"] --> D["带宽时延积"]
N["新建率 × 保留时间"] --> P["端口与状态需求"]
I["生产率 - 消费率"] --> A["积压增长"]| 编号 | 输入 | 推导 | 决策与边界 |
|---|---|---|---|
| 1 | 解析 2% 耗时 1.2 秒 | 平均小变、解析尾部激增 | 看分布,不看单次 |
| 2 | 半连接 1024、回程丢包 | SYN_RECV 接近容量 | 与完成队列分开 |
| 3 | 每秒新建 900、保留 60 秒 | 状态需求约 54000 | 先恢复复用 |
| 4 | 18 段、单段丢失 0.8% | 至少一段丢失约 13.5% | 解释尾延迟,不假定真实独立 |
| 5 | 到达 50MB/s、消费 8MB/s | 缓冲快速耗尽并零窗口 | 修复消费与背压 |
| 6 | 小包成功、大包超时 | 路径 MTU(最大传输单元)候选 | 需反馈和抓包交叉 |
| 7 | 18 万小包每秒 | 包率先于带宽耗尽 | 合批和多队列 |
| 8 | 总 2 秒、代理池等 1.72 秒 | 后端扩容无效 | 治理代理池 |
| 9 | RTT(往返时间)180ms、复用率骤降 | 多个往返抬高尾部 | 恢复复用并轮换证书 |
| 10 | 600QPS、P99(99 分位响应时间)0.8 秒 | 在途约 480 | 受渠道配额约束 |
| 11 | 三层各 3 次尝试 | 最坏放大 27 倍 | 单一重试责任层 |
| 12 | 200 次 40ms 阻塞 | 单线程需 8 秒处理量 | 阻塞卸载 |
| 13 | 每秒净积压 6000KB | 一分钟约 360MB | 高低水位背压 |
| 14 | 容器无错、宿主丢弃增长 | 观察边界错误 | 映射虚拟和物理接口 |
| 15 | 跨境 RTT(往返时间)220ms、窗口 64KB | 理想吞吐约 0.29MB/s | 查窗口、拥塞与应用供数 |
数据演绎 15:跨境带宽时延积。 路径带宽 100Mbit/s(兆比特每秒)、RTT(往返时间)220ms,带宽时延积约 2.75MB(兆字节)。若有效在途窗口仅 64KB(千字节),理想吞吐上限约 64KB/0.22s≈0.29MB/s,远低于链路标称。扩窗口前仍需确认接收窗口、拥塞窗口、应用供数、代理和丢包,不能只改参数。
热门面试题
问题(基础题):利特尔法则如何用于连接池?
- 考点:到达率、响应时间和在途量。
- 回答思路:用峰值流量乘分位耗时估算数量级。
- 详细答案:稳定系统中平均在途量约等于到达率乘平均停留时间。工程上可用峰值到达率和高分位响应时间估算保守在途量,再结合每连接并发能力、下游配额和等待预算确定池范围,最终以压测校准。
- 进阶追问:为什么不能直接用平均响应时间?
- 进阶回答:平均值会低估尾部占用和故障期排队,且必须明确是否含池等待与重试。
问题(原理题):带宽时延积说明什么?
- 考点:流水线和在途数据。
- 回答思路:解释填满高带宽长时延路径所需在途量。
- 详细答案:带宽乘往返时间给出管道中可容纳的数据数量级。有效窗口远小于该值时,即使没有丢包也难以吃满链路;但吞吐还受应用供数、接收窗口、拥塞窗口和代理限制,公式不能直接变成调参结论。
- 进阶追问:窗口越大越好吗?
- 进阶回答:不是,会增加内存、排队和丢包恢复成本,必须结合路径、公平性和业务尾延迟验证。
问题(场景题):如何解释平均值稳定而尾部恶化?
- 考点:概率、恢复时延和分位数。
- 回答思路:用少数解析超时或重传请求演绎。
- 详细答案:大多数请求沿正常路径完成,少数请求经历解析等待、重传超时或队列高水位,会显著抬高 P99(99 分位响应时间)而对平均值影响有限。要保留请求级阶段耗时,并把慢样本和具体连接、队列及线程关联。
- 进阶追问:只优化 P99(99 分位响应时间)会有什么风险?
- 进阶回答:可能牺牲吞吐或公平性,必须同时观察成功率、平均值、资源成本和关键业务时限。
1.13 项目证据链、止血矩阵与回归
项目表达必须给出量级、正常路径、故障时间线、两类证据、错误判断、止血、回滚、长期修复和量化回归。支付以资金正确性优先,网络超时只产生“未知”状态;跨境物流重视高往返时间、渠道隔离和积压年龄;WMS(仓储管理系统)要区分数据库锁、业务线程、事件循环和传输;IoT(物联网)重点关注包率、连接重建、事件循环与告警聚合。
flowchart TD
I["业务影响"] --> R{"风险等级"}
R -->|资损或全站不可用| S["先执行已验证止血并保留最小现场"]
R -->|局部慢或间歇错误| E["先完成低风险证据采样"]
R -->|稳定可复现| T["隔离环境完整取证与故障注入"]
S --> C["回滚阈值与恢复信号"]
E --> C
T --> C
C --> F["长期修复"] --> V["原指标 原流量 原命令回归"]sequenceDiagram
participant P as 支付调用方
participant G as 代理或渠道
participant D as 渠道事务
P->>G: 原交易号发起支付
G->>D: 执行业务事务
D-->>G: 提交成功
G--xP: 响应回程丢失
P->>P: 标记结果未知而非失败
P->>G: 以原交易号主动查询
G-->>P: 返回已成功
P->>P: 状态机幂等落账并参与对账| 风险场景 | 顺序 | 止血 | 回滚条件 | 回归 |
|---|---|---|---|---|
| 可能资损 | 先冻结危险写入并保存交易证据 | 查询态、限额、切安全渠道 | 未决和差异继续增长 | 幂等、状态机、对账和网络时间线 |
| 全站不可用 | 快速切流或降级并保留最小快照 | 摘除故障节点、限流 | 健康集群水位越界 | 同流量和故障注入 |
| 局部慢 | 先取 5 至 30 秒现场 | 局部隔离、降并发 | 错误率或积压恶化 | 分位延迟与两类证据 |
| 间歇错误 | 长窗口分层采样 | 有界重试与路径切换 | 新路径同样恶化 | 覆盖原周期与峰值 |
| 可稳定复现 | 隔离环境完整取证 | 非生产修复验证 | 不适用生产强行变更 | 自动故障场景和容量边界 |
热门面试题
问题(基础题):网络事故复盘必须包含哪些内容?
- 考点:事实、决策和验证闭环。
- 回答思路:按十步证据链和时间线组织。
- 详细答案:包含业务影响与时间线、观察边界、第一和第二证据、被排除的假设、最小根因、止血动作及风险、回滚阈值、长期修复、原指标回归和遗留风险。命令输出要附采样对象与窗口,不能只贴截图。
- 进阶追问:为什么要记录错误判断?
- 进阶回答:它暴露监控、流程和认知缺口,可转化为门禁、告警和演练,避免下次重复浪费恢复时间。
问题(原理题):网络可靠性为什么不能替代业务幂等?
- 考点:传输边界和结果未知。
- 回答思路:用已提交但响应丢失的窗口解释。
- 详细答案:TCP(传输控制协议)只保证连接内字节流,确认不代表业务事务提交;客户端超时时服务端可能未收到、处理中、已提交或响应丢失。支付、库存和履约必须以稳定业务键、唯一约束、状态机、查询、对账和补偿收敛。
- 进阶追问:重试怎样保持安全?
- 进阶回答:复用原业务键,只在剩余截止时间和重试预算内执行,结果未知先查询,禁止生成新交易或让状态倒退。
问题(项目题):跨境物流链路抖动如何完整表达?
- 考点:量化、证据、止血与业务顺序。
- 回答思路:给出流量、往返时间、重传、积压和恢复结果。
- 详细答案:先说明正常批次和分片量级,再描述重传与尾部往返时间上升如何被多层重试放大;第一证据用具体连接和协议增量,第二证据用渠道限流、任务积压和健康出口对照。止血切健康出口、降并发并暂停内层重试,业务以运单事件键去重且状态只前进,最后用同流量与受控丢包回归。
- 进阶追问:切流恢复后还要做什么?
- 进阶回答:保留故障路径证据,修复单层重试、出口健康评分和渠道隔离,并验证原路径恢复,不能把绕路当根治。
知识小节审计边界
以上恰好 13 个知识小节。下文只包含综合题库、面试话术和复习清单,不再新增知识型小节。
| 证据链交付项 | 面试与事故记录中的合格内容 | 反例 |
|---|---|---|
| 事实层 | 时间窗、实例、命名空间、四元组、原始字段、单位和正常参照 | “应该是网络抖动” |
| 推理层 | 两类独立证据、排除项、最小根因和未决假设 | 只贴一张监控截图 |
| 决策层 | 止血风险、回滚阈值、恢复信号、长期修复和同条件回归 | 重启后恢复即关闭事故 |
2. 综合面试题库
问题:怎样建立一条可排他的网络故障证据链?
- 口述答案:我会先把结论写成可证伪假设,而不是从熟悉的命令出发。请求慢可能来自解析、连接、代理、监听队列、套接字、事件循环、业务线程或下游,所以必须先拆端到端延迟树。第一证据要落到具体责任对象,例如指定四元组的队列和往返时间;第二证据必须来自另一层,例如线程栈、对端日志或接口区间增量。只有两类信号与同一时间线吻合,并排除处理器、磁盘等竞争假设,才把异常收敛成根因。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么同一命令执行两次不算第二证据?
- 直接回答 1:因为观察对象和偏差来源没有变化,只能证明现象重复,不能独立验证因果。
- 追问 2:切流后恢复能否证明原路径是根因?
- 直接回答 2:只能说明绕开某个相关条件,仍需保留原路径证据并完成修复回归。
- 追问 3:证据不足时如何表达?
- 直接回答 3:明确列出已知、未知和下一条最能区分假设的采样,不用经验强行定责。
- 详细章节
问题:一次请求的端到端延迟应该如何拆分?
- 口述答案:我会把总耗时拆成连接池等待、DNS(域名系统)解析、路由与建连、TLS(传输层安全协议)握手、代理排队、服务端监听与套接字队列、Netty(网络通信框架)事件循环、业务线程、下游依赖和响应回传。阶段计时的价值是让“接口慢”变成多个可验证预算;例如首字节慢既可能是代理上游池等待,也可能是服务端业务处理,必须用代理和服务日志继续分解。总耗时等于各段等待的组合,但并发和重试会让阶段发生重叠,不能机械相加。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么只看服务端处理时间会漏诊?
- 直接回答 1:请求可能在到达服务端前已经花在解析、建连、代理和队列中。
- 追问 2:怎样关联同一请求的多层日志?
- 直接回答 2:使用稳定请求标识,并核对时钟、实例、四元组和单调时钟阶段耗时。
- 追问 3:平均耗时能否代表用户体验?
- 直接回答 3:不能,间歇解析、重传和池等待主要抬高尾部分位。
- 详细章节
问题:如何定位 DNS(域名系统)解析慢?
- 口述答案:先固定真实发起请求的容器、解析器和故障窗口,用
curl -w分离解析、建连、握手和首字节耗时,再用dig记录响应码、答案、生存时间、解析服务器和查询耗时。若应用解析阶段慢而指定已验证地址的受控对照不慢,解析是主要候选;还要用应用日志或另一个解析器作为第二证据。单次命令可能命中缓存,所以需要按实例和时间窗采样分布,并区分本地缓存、递归解析器和权威服务器。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:指定地址直连为什么不能长期使用?
- 直接回答 1:会绕过服务发现和故障转移,TLS(传输层安全协议)仍必须按主机名验证身份。
- 追问 2:
dig很快为何应用仍可能慢? - 直接回答 2:应用可能使用不同解析器、网络命名空间或自身缓存,也可能发生地址族回退。
- 追问 3:如何回归解析修复?
- 直接回答 3:在相同流量下比较解析分位、错误码、答案集合和业务尾延迟。
- 详细章节
- 口述答案:先固定真实发起请求的容器、解析器和故障窗口,用
问题:DNS(域名系统)错误缓存如何影响灰度发布?
- 口述答案:解析答案可能同时存在递归缓存、本地缓存、运行时缓存和应用连接池中,负缓存还会保存“不存在”。发布修改记录后,各层会按自身生存时间逐步过期,已经建立的长连接又可能继续访问旧地址,因此同一批实例会出现新旧目标混用。正确发布应提前降低生存时间、保留旧后端兼容容量、限制重连速率,并同时观察答案集合和实际连接远端。清空全部缓存会制造解析洪峰,也无法说明真正的缓存层。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么答案更新后旧流量仍存在?
- 直接回答 1:连接池复用的旧连接不需要再次解析,会继续访问旧地址。
- 追问 2:怎样避免所有实例同时重连?
- 直接回答 2:为连接生命周期和刷新动作加入随机抖动,分批滚动。
- 追问 3:负缓存是什么风险?
- 直接回答 3:错误的不存在结果会在一段时间内持续,修复记录后也不会立即消失。
- 详细章节
问题:连接超时和连接拒绝应该怎样区分?
- 口述答案:连接拒绝通常意味着目标或中间路径返回 RST(复位),常见于无人监听、地址绑定错误或策略主动拒绝;连接超时表示握手在截止时间内没有完成,可能是去程、回程、防火墙或队列静默丢弃。排查先核对实际目标和
ss -lntp监听,再按同窗观察SYN_RECV、握手失败计数和代理健康;只有方向无法判断时才受限抓包。客户端异常文本只描述本地结果,代理存在时拒绝甚至可能由代理产生。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:扩大连接超时能修复拒绝吗?
- 直接回答 1:不能,明确拒绝会立即失败,扩大超时只会拖长其他失败。
- 追问 2:端口监听是否代表业务就绪?
- 直接回答 2:不代表,依赖、事件循环和业务线程可能尚未就绪。
- 追问 3:代理返回拒绝如何定责?
- 直接回答 3:核对客户端连接目标、代理入口与上游日志以及后端接收记录。
- 详细章节
- 口述答案:连接拒绝通常意味着目标或中间路径返回 RST(复位),常见于无人监听、地址绑定错误或策略主动拒绝;连接超时表示握手在截止时间内没有完成,可能是去程、回程、防火墙或队列静默丢弃。排查先核对实际目标和
问题:半连接队列和完成连接队列如何排查?
- 口述答案:服务端收到 SYN(同步序列号)后进入半连接阶段,最终 ACK(确认)到达才进入完成连接队列,应用执行
accept后连接才被取走。若SYN_RECV接近容量且服务端重发 SYN(同步序列号)加 ACK(确认),更应查回程丢失、客户端异常或攻击;若半连接很少而完成队列接近上限,同时事件循环延迟上升,则更像应用消费不足。调大backlog只能增加缓冲,不能修复链路或阻塞。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:半连接高一定是攻击吗?
- 直接回答 1:不一定,回程丢包和客户端未确认也会形成同样状态。
- 追问 2:完成队列满为什么后端可能没有业务日志?
- 直接回答 2:连接尚未被应用接受和读取,请求还没进入业务处理。
- 追问 3:回归看什么?
- 直接回答 3:同流量下队列占用、握手失败、接受速率和建连尾延迟同步恢复。
- 详细章节
- 口述答案:服务端收到 SYN(同步序列号)后进入半连接阶段,最终 ACK(确认)到达才进入完成连接队列,应用执行
问题:TIME_WAIT(等待关闭)很多是否意味着端口耗尽?
- 口述答案:不一定。TIME_WAIT(等待关闭)是主动关闭方为可靠结束和隔离旧报文保留的正常状态,数量大可能只是短连接新建率高。只有状态数、临时端口或出口转换表接近容量,新连接失败并与故障时间线一致,才说明它参与耗尽。第一动作应恢复连接复用、关闭多层重试、核对源地址端口和目标分布,而不是直接缩短保护时间。调参可能让旧报文影响复用后的新连接。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:怎样估算状态需求?
- 直接回答 1:用每秒新建率乘状态平均保留时间得到数量级,再与源地址端口空间比较。
- 追问 2:增加连接池为何可能更糟?
- 直接回答 2:若增加的是新建并发,会更快消耗端口和渠道配额。
- 追问 3:怎样安全止血?
- 直接回答 3:降低新建率、恢复复用、分散健康出口,并设错误率和端口水位回滚条件。
- 详细章节
问题:CLOSE_WAIT(等待本端关闭)持续增长如何定位?
- 口述答案:该状态表示对端已经发送关闭,而本地应用仍未关闭套接字,因此持续增长通常指向异常分支未释放、连接池归还失败、超时取消缺失或线程阻塞。先按进程和目标统计状态及文件描述符,再用线程栈、资源对象和错误路径日志作为第二证据。若状态与文件描述符同窗上升,修复关闭路径后新增停止并逐步回落,应用泄漏假设才成立。内核参数不能替应用执行关闭。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:对端主动关闭是根因吗?
- 直接回答 1:只是触发条件,本地长期不关闭才解释 CLOSE_WAIT(等待本端关闭)积累。
- 追问 2:重启为什么不算修复?
- 直接回答 2:重启会清空状态但不消除泄漏路径,流量恢复后还会再次增长。
- 追问 3:如何设置监控?
- 直接回答 3:按进程和目标观察新增速率、存量年龄、文件描述符与业务错误。
- 详细章节
问题:如何判断临时端口或 NAT(网络地址转换)映射耗尽?
- 口述答案:典型分叉是旧长连接继续工作,而新连接集中失败。先在真实网络命名空间记录临时端口范围、状态分布、新建率、源地址和目标四元组;再让出口层核对 NAT(网络地址转换)或连接跟踪表水位。若关闭重试、恢复复用或切换源地址后新建恢复,且路由、监听和旧连接一直正常,容量假设更可信。单机端口未满也不代表共享出口映射未满。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么同一目标更容易耗尽?
- 直接回答 1:四元组组合受源地址、源端口和固定目标限制,可用组合更少。
- 追问 2:直接扩大端口范围够吗?
- 直接回答 2:未必,出口映射、渠道配额和短连接根因仍存在。
- 追问 3:支付场景如何处理未知结果?
- 直接回答 3:保留原交易号主动查单,不因新连接失败创建新交易。
- 详细章节
问题:看到 TCP(传输控制协议)重传应如何建立证据?
- 口述答案:重传只说明发送方未在预期内获得足够确认,报文可能在去程、回程、客户端、服务端或中间路径丢失,确认也可能丢失,乱序还会触发重复确认。先对
nstat做故障窗口前后差分,再用ss -ti锁定具体连接的往返时间、重传、拥塞窗口和接收窗口;第二证据来自接口错误、路径、对端计数或受限报文时间线。不能看到重传就归因服务端。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:累计重传总数有什么问题?
- 直接回答 1:它混合主机整个生命周期和全部流量,无法代表故障窗口。
- 追问 2:乱序是否等于丢包?
- 直接回答 2:不等于,多路径和调度会改变到达顺序,缺口可能随后自然补齐。
- 追问 3:修复后怎样验证?
- 直接回答 3:同流量比较区间重传率、具体连接尾部往返时间和业务分位延迟。
- 详细章节
- 问题:乱序、快速重传和超时重传有什么关系?
- 口述答案:接收方收到缺口后的后续数据会重复确认连续前缀,并可通过 SACK(选择确认)报告非连续区间;发送方据此可能在计时器到期前快速重传缺失段。乱序也会产生重复确认,所以单个重复确认不能证明丢包;若反馈不足,最终由 RTO(重传超时时间)兜底,代价通常更高并显著抬高尾延迟。排障要结合序列时间线、选择确认、往返时间和拥塞窗口,而不是只看一个计数。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么超时重传更伤尾延迟?
- 直接回答 1:它需要等待计时器到期,且通常伴随更强的发送能力收缩。
- 追问 2:SACK(选择确认)有什么价值?
- 直接回答 2:告诉发送方缺口之后哪些块已经到达,减少无谓补发。
- 追问 3:如何区分持续乱序和真实丢失?
- 直接回答 3:看缺口是否自然补齐、是否发生实际重传,并与路径和接口证据对齐。
- 详细章节
- 问题:零窗口出现时应该查网络还是应用?
- 口述答案:零窗口由接收方通告,表示接收缓冲暂时没有空间,是流量控制而非直接的路径拥塞信号。先确定哪一端通告,再看该端接收队列、应用读取速率、事件循环延迟、业务线程和下游等待;发送方会停止普通数据并进行窗口探测。若接收应用因数据库锁等待无法消费,即使链路完全健康也会零窗口。扩大缓冲只能推迟爆发,长期到达率高于消费率时仍会耗尽。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:零窗口时连接是否已经断开?
- 直接回答 1:没有,双方仍保留状态,发送方等待窗口恢复并做探测。
- 追问 2:换拥塞算法有用吗?
- 直接回答 2:通常无用,拥塞算法保护路径,零窗口受接收方消费限制。
- 追问 3:怎样回归?
- 直接回答 3:观察零窗口增量、接收队列、消费率、线程等待和业务尾延迟共同恢复。
- 详细章节
- 问题:为什么 P99(99 分位响应时间)升高而平均值可能稳定?
- 口述答案:少数请求经历 DNS(域名系统)解析超时、重传恢复、连接池等待、代理排队或事件循环阻塞时,会形成很长尾部;多数正常请求仍快速完成,因此平均值变化有限。以十八个数据段和 0.8% 单段丢失的教学独立假设为例,至少一段丢失概率约 13.5%,足以明显抬高尾部。真实报文并非独立同分布,所以公式只用于解释数量级,生产要把慢请求标识与具体连接、队列和线程时间线关联。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:只看 P99(99 分位响应时间)够吗?
- 直接回答 1:不够,还要看成功率、P50(中位响应时间)、吞吐和资源成本。
- 追问 2:怎样抽样慢请求?
- 直接回答 2:保留阶段耗时和请求标识,按实例、目标和错误类型分层采样。
- 追问 3:平均值什么时候仍有价值?
- 直接回答 3:用于总体容量趋势,但不能替代分布和关键业务时限。
- 详细章节
- 问题:如何区分主机丢包、网卡错误和中间路径丢包?
- 口述答案:先用
ip -s link观察接口收发丢弃和错误的区间增量,再用ethtool -S按驱动说明核对更细硬件或队列字段;容器还要映射虚拟接口与宿主物理接口。若本机接口无错但双端报文显示某段离开发送端却未到接收端,范围才收窄到中间路径。路径工具的中间跳不回应可能只是控制报文限速,必须看终点业务、后续跳和 TCP(传输控制协议)重传是否继承。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:为什么驱动字段不能背固定名称?
- 直接回答 1:不同网卡、驱动和版本字段语义不同,必须查目标环境说明。
- 追问 2:路径切换后恢复能否直接定责?
- 直接回答 2:只能收窄到原路径相关条件,还需原路径或双点证据。
- 追问 3:容器接口无错能排除宿主网卡吗?
- 直接回答 3:不能,容器看不到全部物理接口与宿主队列事实。
- 详细章节
- 问题:MTU(最大传输单元)黑洞有哪些典型表现?
- 口述答案:典型现象是小报文、解析和建连正常,甚至 TLS(传输层安全协议)握手成功,但发送较大载荷后卡住或反复重传。路径中隧道开销降低可承载大小,而必要反馈又被过滤时,发送端无法正确调整。排查用
tracepath形成路径大小候选,以受限抓包观察大段、重传和反馈,再核对容器、隧道及物理接口配置。临时缩小报文可验证和止血,但长期应统一路径配置并恢复反馈。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:为什么
ping小包成功没有意义吗? - 直接回答 1:有有限意义,只证明该控制报文和大小的路径可达,不能证明业务大包。
- 追问 2:直接关闭禁止分片可以吗?
- 直接回答 2:可能引发分片、性能和安全问题,应按协议与路径设计修复。
- 追问 3:回归应包含什么?
- 直接回答 3:覆盖不同载荷大小、双向传输、吞吐、重传和原业务请求。
- 详细章节
- 问题:IoT(物联网)流量带宽不高为什么仍会压垮网卡?
- 口述答案:网卡和协议栈不仅受每秒比特数限制,还受每秒报文数、队列、软中断、内存分配和应用解码预算限制。十八万个 180 字节小包的带宽并不夸张,但每个包都要走完整处理路径,包率可能先耗尽。证据应把接口丢弃、软中断、队列、事件循环延迟和消息率对齐;治理包括批量、连接分片、多队列、消息削峰和告警聚合,不能只扩带宽。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:合并小包的代价是什么?
- 直接回答 1:会增加等待和单包失败影响,需要在延迟目标、批次大小和重试成本间平衡。
- 追问 2:怎样区分网卡与事件循环瓶颈?
- 直接回答 2:比较接口丢弃和软中断与事件循环队列、线程栈及应用消费率。
- 追问 3:关键告警会被聚合丢失吗?
- 直接回答 3:用事件号和持久化流水保留映射,聚合只改变通知形态,不删除审计事实。
- 详细章节
- 问题:如何区分代理超时、负载均衡问题和后端慢?
- 口述答案:代理把链路拆成客户端入口、内部排队、上游连接池和后端处理。客户端阶段耗时只能显示总效果,必须结合代理的入口排队、上游池等待、重试和后端计时,再对齐后端接收与发送日志。若总耗时两秒而代理上游池等待 1.72 秒、后端处理 90ms,扩后端并不能解决。负载均衡还可能只把流量送到部分异常节点,因此要按后端实例和连接目标分层。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:
504是否一定是后端慢? - 直接回答 1:不一定,也可能是代理池等待、代理截止时间或回程问题。
- 追问 2:后端无日志代表请求没到吗?
- 直接回答 2:还可能停在监听队列、代理或日志采样前,需连接和队列证据。
- 追问 3:如何回归?
- 直接回答 3:比较代理各阶段、后端处理、实例分布和客户端尾延迟。
- 详细章节
- 问题:负载均衡健康检查正常为什么用户仍会失败?
- 口述答案:健康检查通常使用固定路径、低频小请求和独立连接,可能绕过真实认证、请求大小、连接复用、租户路由和下游依赖。节点能返回健康检查不代表业务线程、连接池和数据库可用,代理还可能因会话保持把用户集中到少数实例。排查应比较健康检查与真实请求的协议、路径、载荷和后端分布,并用用户请求标识对齐代理与服务端。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:应该把健康检查做得很重吗?
- 直接回答 1:也不应过重,否则会放大依赖压力;应分存活和就绪,并用业务监控补充。
- 追问 2:会话保持有什么风险?
- 直接回答 2:异常热点和节点退场时流量重分布会更剧烈。
- 追问 3:如何安全摘除节点?
- 直接回答 3:先停止接收新流量,等待有界在途请求和长连接迁移,再按超时强制结束。
- 详细章节
- 问题:TLS(传输层安全协议)握手失败如何定位?
- 口述答案:先用客户端阶段耗时和错误类型确认失败发生在握手,用
openssl s_client在授权下检查证书链、主机名、有效期和协议协商,再与证书发布记录、代理终止位置和不同节点结果交叉。端口可达只证明传输连接,不能证明服务身份和信任链。经代理终止时,客户端到代理和代理到后端是两段独立安全边界,必须分别验证。忽略证书校验不能作为生产默认止血。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:系统时间错误会有什么影响?
- 直接回答 1:会让有效证书被判断为尚未生效或已过期。
- 追问 2:证书轮换为何需要关注长连接?
- 直接回答 2:旧连接不会重新握手,可能长期使用旧证书上下文。
- 追问 3:安全止血有哪些?
- 直接回答 3:回滚错误证书、切健康终止节点或修复信任链,并保留身份校验。
- 详细章节
- 问题:如何设计连接池容量和获取超时?
- 口述答案:先以峰值到达率乘高分位响应时间估算在途请求,再除以每连接并发能力,并受下游连接配额、本机端口、内存和代理限制。池等待必须计入总截止时间,队列有界且有获取超时;池太小会在客户端排队,池太大则把过载推给下游。还要监控活跃、空闲、等待者、获取耗时、新建率、校验失败和连接年龄,调容必须灰度。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么用高分位而不是只用平均?
- 直接回答 1:故障和尾部请求持有连接更久,会显著增加峰值在途量。
- 追问 2:获取超时应大于读取超时吗?
- 直接回答 2:通常不应,两者都受总截止时间约束,等待过久会让后续阶段无预算。
- 追问 3:陈旧连接如何淘汰?
- 直接回答 3:设置最大生命周期和空闲校验,并加入随机抖动避免同时重建。
- 详细章节
- 问题:为什么多层重试会把短暂抖动放大成事故?
- 口述答案:上游超时不意味着下游任务已经停止,旧请求仍占连接、线程和数据库事务,新重试又进入同一拥塞路径。若客户端、网关和服务各允许三次尝试,最坏尝试数量可放大二十七倍;池等待增长又触发更多超时,形成正反馈。正确做法是指定唯一重试责任层,传递总截止时间和剩余预算,只对幂等且明确瞬时的错误退避重试,并设置全局重试配额。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:随机抖动有什么作用?
- 直接回答 1:避免大量实例按相同退避周期同时重试形成同步峰值。
- 追问 2:结果未知的写操作能重试吗?
- 直接回答 2:先按原业务键查询,必要时仍用原键幂等重试,不能生成新键。
- 追问 3:如何监控重试风暴?
- 直接回答 3:区分原始请求和重试请求,观察尝试放大倍数、在途量、池等待与下游成功率。
- 详细章节
- 问题:连接超时、读取超时和总截止时间如何配合?
- 口述答案:连接超时只覆盖建立连接,读取超时覆盖等待数据的局部阶段,总截止时间约束整个请求生命周期,包括池等待、解析、握手、排队、重试和回传。局部超时之和若超过总预算,上游可能已放弃而下游仍执行,造成结果未知和资源重叠。预算应从用户或业务截止时间反推,逐层保留处理与回传余量,并把剩余时间沿调用链传递。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:读取超时能否证明服务端没处理?
- 直接回答 1:不能,服务端可能已提交但响应未在截止时间内到达。
- 追问 2:取消请求能回滚数据库吗?
- 直接回答 2:不能假设,取消信号和事务提交是不同边界。
- 追问 3:支付超时后怎么办?
- 直接回答 3:标记未知,以原交易号查询、对账和补偿。
- 详细章节
- 问题:如何证明 Netty(网络通信框架)EventLoop(事件循环)被阻塞?
- 口述答案:事件循环线程绑定多个 Channel(通道),一个处理器中的同步数据库调用、慢序列化或日志刷盘会阻塞其他已就绪连接。第一证据是事件循环延迟、任务队列和同线程连接的共同抖动,第二证据是线程栈或 JFR(Java 飞行记录器)持续落在阻塞调用;同时用套接字队列确认数据已经就绪但应用未消费。网卡和重传正常可排除部分网络路径假设。修复是把阻塞任务卸载到有界业务池并建立预算,不是无限增加线程。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:事件循环忙一定是框架缺陷吗?
- 直接回答 1:不一定,更常见是业务处理器阻塞、任务过多或回调失控。
- 追问 2:如何避免跨线程回写乱序?
- 直接回答 2:按 Channel(通道)事件循环串行提交必要状态,并明确业务级顺序键。
- 追问 3:回归看什么?
- 直接回答 3:事件循环延迟、队列、吞吐、线程栈和业务尾延迟。
- 详细章节
- 问题:Netty(网络通信框架)写缓冲高水位如何治理?
- 口述答案:当待发送字节超过高水位,Channel(通道)变为不可写,说明生产速度高于网络或对端消费速度。上游应暂停或降低生产,限制单连接待发量,聚合非关键消息,并在低水位恢复可写后按公平预算续传。第一证据是可写状态和待发字节,第二证据是
ss发送队列、对端接收窗口和消费率。单纯调大水位只会延后爆发并增加直接内存,必须建立端到端背压。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:不可写是否等于连接断开?
- 直接回答 1:不是,是本地写缓冲压力信号,连接仍可能正常。
- 追问 2:暂停自动读取有什么风险?
- 直接回答 2:会影响入站控制消息和公平性,必须按协议设计恢复条件。
- 追问 3:IoT(物联网)非关键通知如何降级?
- 直接回答 3:聚合、采样或延迟,但关键事件以持久化事件号保留。
- 详细章节
- 问题:容器网络故障为什么必须区分网络命名空间?
- 口述答案:容器内的套接字、接口和路由属于独立网络命名空间,宿主机还包含虚拟以太网、桥接、策略、地址转换和物理网卡。应先在真实发起请求的容器中固定四元组、路由和套接字,再映射到宿主虚拟接口和物理接口;宿主全局计数可能由其他容器贡献,容器接口无错也不能排除宿主物理层。两层证据只有通过进程、容器标识和接口映射才能关联。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:在哪里执行
ip route get? - 直接回答 1:在实际发起连接的网络命名空间中执行。
- 追问 2:迁移容器后恢复能证明什么?
- 直接回答 2:只证明问题与原节点或路径相关,不能直接命名具体根因。
- 追问 3:抓包选哪个接口?
- 直接回答 3:按假设选择容器、宿主虚拟端、物理端或对端,必要时双点对齐。
- 详细章节
- 问题:如何正确使用 dig、curl、ss 和 nstat 建立命令链?
- 口述答案:
dig用来记录解析器、响应码、答案、生存时间和查询耗时;curl -w分离解析、连接、握手、首字节和总耗时;ss锁定进程或四元组的状态、队列、窗口、往返时间与重传;nstat必须前后差分得到同窗协议增量。命令顺序由假设决定,不是固定背诵。每次记录主机或容器、时间窗、对象和正常参照,再用应用日志、对端或接口作为独立第二证据。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。 - 追问 1:为什么单次
curl成功不能排除故障? - 直接回答 1:它可能错过间歇窗口、命中健康实例或复用已有连接。
- 追问 2:
ss全局输出有什么风险? - 直接回答 2:混合全部进程和目标,无法归属到业务请求。
- 追问 3:命令结果冲突怎么办?
- 直接回答 3:核对采样窗口、累计口径、命名空间和时钟,再取更接近责任对象的第三信号。
- 详细章节
- 问题:生产环境如何安全使用 tcpdump(抓包工具)?
- 口述答案:抓包不是第一动作,只有路由、套接字、协议计数和日志仍无法区分方向时才申请。必须限定网络命名空间、接口、五元组、方向、时长或包数、截断长度和环形文件,采集期间观察处理器、磁盘及工具报告的内核丢包。载荷可能含凭证和隐私,要最小化、加密保存、限制权限并按流程销毁。解释时还要考虑分段卸载、地址转换和单点观察局限。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:HTTPS(安全超文本传输协议)抓包有何价值?
- 直接回答 1:可看地址、时序、握手、长度、重传和关闭,但不能读取加密业务内容。
- 追问 2:本机没抓到报文代表没发送吗?
- 直接回答 2:不一定,可能选错接口、采集丢包或受卸载影响。
- 追问 3:为何需要第二观察点?
- 直接回答 3:单点只能证明该位置看到什么,双点才能更可靠地收窄丢失区间。
- 详细章节
- 问题:如何用容量公式分析网络性能而不陷入机械调参?
- 口述答案:公式用于形成数量级假设:并发约等于到达率乘停留时间,短连接状态量约等于新建率乘保留时间,带宽时延积说明高带宽长时延路径所需在途量,积压增长等于生产率减消费率。使用时必须说明稳定性、分位口径、重试、连接多路复用、协议开销和应用供数。随后用真实队列、窗口、吞吐和业务分位校准,不能把公式结果直接变成池大小或内核参数。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:利特尔法则在不稳定过载期适用吗?
- 直接回答 1:只能做短窗近似,积压持续增长时系统不满足稳定前提。
- 追问 2:带宽时延积大就应扩大窗口吗?
- 直接回答 2:先确认窗口确为瓶颈,并评估内存、排队、丢包恢复和公平性。
- 追问 3:容量验证为什么要灰度?
- 直接回答 3:参数会改变下游压力和故障形态,需要可回滚地观察全链路。
- 详细章节
- 问题:支付调用超时但渠道可能已扣款,应该怎么处理?
- 口述答案:读取超时只说明本地在截止时间前没有获得完整响应,渠道可能未收到、处理中、已提交或响应回程丢失。调用方必须以稳定交易号建立幂等状态机,把本地结果标为未知,优先按原交易号主动查询,必要时仍用原键重试,禁止创建新交易再次扣款。网络排障保存代理、连接和渠道时间线,但资金正确性由唯一流水、验签、状态迁移、对账和补偿保证。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:TCP(传输控制协议)确认能证明扣款成功吗?
- 直接回答 1:不能,只证明传输栈接收字节,不代表业务事务提交。
- 追问 2:查询也超时怎么办?
- 直接回答 2:保持未知并进入持久化补偿和对账,不擅自改为失败。
- 追问 3:如何止血?
- 直接回答 3:限制新写和重试,保留查询能力,必要时切安全渠道并设置差异回滚阈值。
- 详细章节
- 问题:跨境物流轨迹同步抖动如何排查和治理?
- 口述答案:先给出正常量级:分片、批次、渠道往返时间、成功率和积压年龄;事故时保存出口、连接、协议计数和任务状态。第一证据用指定连接的重传、往返时间和拥塞窗口,第二证据用渠道限流、健康出口对照和积压增长,并排除处理器、磁盘与业务锁。止血切健康出口、降低并发与批次、关闭内层重试;业务以运单号和轨迹事件号幂等,已签收状态不能回退。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:为什么切出口后仍要查原路径?
- 直接回答 1:切流只是恢复动作,原路径根因未修复会在回切时复发。
- 追问 2:积压如何安全清理?
- 直接回答 2:按渠道配额逐步放量,以积压年龄和错误率控制速度。
- 追问 3:乱序轨迹如何处理?
- 直接回答 3:按事件版本和允许状态迁移处理,连接内有序不等于业务全局有序。
- 详细章节
- 问题:WMS(仓储管理系统)库存接口慢如何避免误判为网络?
- 口述答案:库存接口慢可能来自数据库行锁、业务线程池、连接池、完成连接队列、重传或事件循环阻塞。先保存请求分阶段耗时和库存操作标识,网络侧查看具体连接、队列与协议增量,应用侧查看线程栈、数据库锁等待和池指标。只有重传或队列异常与慢请求时间线一致,且锁与资源正常,才把网络作为主要贡献。无论网络结果如何,库存扣减仍依靠条件更新、幂等预占号和补偿防超卖。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:接口超时能否直接释放库存?
- 直接回答 1:不能,数据库可能已提交,应按预占号查询状态再补偿。
- 追问 2:完成队列满会有什么表现?
- 直接回答 2:握手可能完成但业务日志为空,新连接失败或排队。
- 追问 3:修复如何回归?
- 直接回答 3:同并发下同时验证分位延迟、锁等待、队列、重传和库存一致性。
- 详细章节
- 问题:IoT(物联网)报警风暴如何构建端到端证据链?
- 口述答案:先量化设备数、连接数、每秒消息和报文大小,区分带宽、包率、连接重建和业务告警量。网络侧观察接口丢弃、软中断、套接字队列与重传;运行时观察事件循环延迟、写水位和业务池;业务侧观察 MQ(消息队列)积压、去重和告警聚合。止血按租户限速、批量、削峰和降级非关键通知,关键事件以设备事件号持久化。线上落地时,我会严格按十步闭环推进:先说明用户影响、错误率、分位延迟和开始时间,再固定源容器、目标地址、四元组与采样窗口;重启或改参前保存发布、流量、连接、队列、协议计数、线程和日志现场。第一命令必须指出关键字段及正常参照,第二层用不同对象交叉验证,并明确排除至少两个竞争假设。根因要能同时解释时间线、业务影响和全部证据;止血动作写清风险、恢复信号与回滚阈值,不能用无过滤抓包或直接修改内核参数作为默认动作。长期修复后复用原流量、原命令和故障注入回归,同时验证成功率、尾延迟、队列和业务正确性。为了让结论可复查,我还会把命令输出保存为带时间戳的原始证据,注明 Linux(操作系统)内核、工具版本、字段单位、是否为累计值、容器与宿主映射以及采样丢失;任何单点结果只支持相应观察边界,不能外推到未观察层。若两类证据冲突,我先核对时钟、采样窗口、流量归一化和观测点,再取得第三条更接近责任对象的信号。项目侧把网络恢复和业务正确性分开:支付看未决交易与对账差异,库存看预占和补偿,物流看状态版本和积压年龄,IoT(物联网)看入口事件与最终通知差异。
- 追问 1:连接重建为什么会放大事故?
- 直接回答 1:握手、认证和订阅恢复同时消耗端口、处理器和代理资源。
- 追问 2:如何保护事件循环?
- 直接回答 2:只做轻量编解码,阻塞业务卸载到有界池,并遵守写背压。
- 追问 3:怎样证明关键告警未丢?
- 直接回答 3:对齐入口事件流水、持久化记录、聚合映射和最终通知,差异进入补偿。
- 详细章节
3. 项目口述模板
“我不会看到 `ping` 成功就排除网络,也不会看到重传就归因服务端。事故发生后先量化业务影响并固定容器、四元组和时间窗,保存发布、流量、连接、协议计数和线程现场;随后用最能区分假设的第一命令取字段,再以另一层信号交叉。证据收敛后给出可回滚止血,资金、库存和履约结果仍由幂等键、状态机、查询、对账与补偿兜底。修复后我会用原流量、原命令和故障注入验证,而不是把切流或重启后的偶然恢复当成根因。”
4. 复习清单
- 能从客户端一直画到下游依赖,并给每层指出第一证据和第二证据。
- 能区分 DNS(域名系统)慢、连接拒绝、连接超时、半连接和完成连接队列。
- 能解释 TIME_WAIT(等待关闭)多为何不等于端口耗尽,CLOSE_WAIT(等待本端关闭)为何偏向应用关闭路径。
- 能区分重传、乱序、零窗口、路径丢包、MTU(最大传输单元)黑洞和网卡错误。
- 能使用 `dig`、`curl`、`openssl`、`ss`、`nstat`、`sar`、`ip`、`ethtool`、`tracepath`、`mtr` 和受限 `tcpdump`,并解释字段、边界和误判。
- 能证明代理池、应用池、事件循环和写背压问题,而不是统称网络慢。
- 能用十五组数据解释分位延迟、端口、窗口、包率、积压和重试放大。
- 能完整复述支付、跨境物流、WMS(仓储管理系统)和 IoT(物联网)项目证据链。
- 能说清止血优先级、回滚条件、长期修复和原指标回归。
