核心是带着问题筛日志,重点抓耗时字段、异常堆栈、上下游时间差三类线索:提取cost/db/http-call等结构化耗时字段聚合统计;搜索TimeoutException等隐性异常并关联±2秒内日志;比对客户端X-Req-Start与服务端时间差定位网络或代理瓶颈;结合JVM安全点日志与JFR火焰图识别Safepoint挂起根源。

用日志分析工具定位高延时接口,核心不是“看日志”,而是“带着问题筛日志”——重点抓耗时字段、异常堆栈、上下游时间差这三类线索。
提取关键耗时字段并聚合统计
确保日志中明确记录接口总耗时(如 cost=128ms)、数据库耗时(db=95ms)、外部调用耗时(http-call=420ms)等结构化字段。避免只记“处理完成”,要带单位和标签。
- 用正则或日志解析工具(如 Logstash、自研 Java 工具)提取所有
cost=\d+ms的行,按接口路径分组,计算 p95/p99 耗时 - 筛选出
cost > 500的日志,再检查其子项:若db占比超 80%,优先查慢 SQL;若http-call突增,说明依赖服务抖动 - 对比同一接口在不同时间段的耗时分布,确认是偶发毛刺还是持续劣化
关联异常与耗时突增的时间点
高延时常伴随隐性异常:比如 JSON 序列化失败重试、连接池等待超时、GC 导致线程挂起,这些未必打 ERROR 日志,但会拖慢响应。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 搜索关键词:
TimeoutException、Connection refused、pool exhausted、OutOfMemoryError - 把异常日志时间戳 ±2 秒范围内的接口日志全捞出来,看是否集中出现耗时飙升
- 特别注意 WARN 级别日志,例如
Exchanger exchange timeout或VirtualThread pinned,这类提示往往直指阻塞根源
比对客户端与服务端日志时间差
如果调用方测得 320ms,而服务端日志只记了 180ms,差值 140ms 就是网络、网关或容器层开销,不能只盯业务代码。
立即学习“Java免费学习笔记(深入)”;
- 要求客户端在请求头加
X-Req-Start: 1726515140123(毫秒时间戳),服务端记录接收时刻,算出网络传输延迟 - 检查 Nginx / Spring Cloud Gateway 日志中的
$upstream_response_time和$request_time,差值大说明后端处理慢,差值小说明网络或代理本身有瓶颈 - 若服务端耗时稳定但客户端波动大,重点排查 DNS 解析、TLS 握手、TCP 建连等环节
结合 JVM 安全点日志交叉验证
当常规日志看不出明显瓶颈,但 p99 延迟持续偏高,大概率是 JVM 层停顿导致——这时安全点日志就是物理证据。
- 开启 JVM 参数:
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1,观察NonVoluntary是否频繁大于 0 - 若某分钟内
NonVoluntary: 37,说明至少 37 个线程被强制挂起,大概率卡在长循环、synchronized 块或阻塞 I/O 上 - 配合 JFR 录制 + 火焰图,聚焦
SafepointEnd耗时 >5ms 的样本,直接定位到具体方法栈(如ObjectMapper.writeValueAsString深度递归)

















