第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. 采集策略决策流程
以下决策树帮助快速确定快照类型与时机组合,适用于大多数线上问题。
5. 判断规则与避坑
- 规则一:先系统后进程——当症状不明确时,先执行系统快照(资源全景),再针对可疑进程执行线程/内存快照。
- 规则二:线程快照至少采集 3 次——间隔 3~5 秒,避免单次快照遗漏瞬时状态。
- 规则三:内存快照谨慎触发——Heap dump 可能导致服务暂停,优先用 jmap -histo 替代;仅在确认 OOM 后使用 dump。
规避常见陷阱:不要在业务低峰期之外采集 Kill -9 后的 core dump;快照文件名必须包含时间戳和进程 PID,避免覆盖。