第2章 现场快照技术原理与采集策略

1. 快照类型

现场快照按采集对象可分为以下四类,实际排查中常组合使用以覆盖完整数据面。

快照类型 采集对象 典型数据 排查用途
进程快照 进程全集 进程列表、启动参数、资源占用 识别僵尸、异常退出、资源泄漏
线程快照 线程堆栈 线程数、Jstack/Thread dump 死锁、阻塞、CPU 热点
内存快照 堆/栈/共享内存 Heap dump、gc日志、/proc/status OOM、内存泄漏、大对象
系统快照 操作系统/中间件 CPU/IO/网络指标、系统日志 资源争抢、集群异常、底层故障

2. 触发条件

触发条件决定什么时候启动快照采集,分为手动和自动两类。

  • 手动触发:当运维或开发人员通过监控告警或用户反馈感知到异常时,主动执行采集命令。例如:
    # 收集线程快照
    jstack <pid> > thread_dump_$(date +%s).txt
    
    # 收集系统快照
    sysstat -u -w -d 1 10 > sys_snapshot.log
  • 自动触发:基于预设规则或系统事件自动触发。常见规则包括:
    • CPU 使用率超过 85%(持续 30s)
    • 内存使用量超过 JVM 最大堆的 80%
    • 响应时间(RT)> 5 秒的请求次数达到阈值
    • 错误日志关键词匹配(如 OutOfMemoryError、Deadlock)
    • 操作系统 oom-killer 事件

3. 采集时机

时机选择直接影响快照的排查价值。分为三个时间窗口:

窗口 描述 适用场景 典型快照
事前(定期) 按分钟/小时/天定时采集基线快照 资源水位趋势、异常前基线对比 系统指标、线程数、活跃对象数
事中(实时) 异常告警触发后立即采集 定位正在发生的故障根因 线程堆栈、内存快照、网络包
事后(延迟) 故障恢复后采集残留数据 分析事后日志、未清理的资源文件 Dump 文件、崩溃日志、core 文件
建议在生产环境同时开启定期基线快照和自动触发快照,避免“事后已无法复现”的窘境。

4. 采集策略决策流程

以下决策树帮助快速确定快照类型与时机组合,适用于大多数线上问题。

现场快照采集策略决策树 是否有异常现象? 是:进入故障排查 否:定期基线快照 判断是否为持续伴随现象? 持续:立即执行手动快照 间断:配置自动触发规则 快照类型选择 (参考下表判断规则) 采集并归档快照 采集系统/进程基线 循环 判断规则:线程阻塞 → 优先采集线程快照;内存超限 → 采集内存快照;CPU突增 → 采集线程+系统快照

5. 判断规则与避坑

  • 规则一:先系统后进程——当症状不明确时,先执行系统快照(资源全景),再针对可疑进程执行线程/内存快照。
  • 规则二:线程快照至少采集 3 次——间隔 3~5 秒,避免单次快照遗漏瞬时状态。
  • 规则三:内存快照谨慎触发——Heap dump 可能导致服务暂停,优先用 jmap -histo 替代;仅在确认 OOM 后使用 dump。
规避常见陷阱:不要在业务低峰期之外采集 Kill -9 后的 core dump;快照文件名必须包含时间戳和进程 PID,避免覆盖。