文章目录
- Java应用线上故障排查与优化实战指南
- 一、快速响应机制与流程
- 1.1 故障分级与响应机制
- 1.2 诊断工具箱标准化
- 二、内存泄漏深度排查
- 2.1 内存泄漏诊断流程
- 2.2 实战:MAT内存分析
- 2.3 内存分析脚本与工具
- 2.4 eBPF内存泄漏检测
- 三、线程阻塞与死锁排查
- 3.1 线程问题诊断矩阵
- 3.2 实战:死锁检测与分析
- 3.3 线程分析自动化脚本
- 3.4 使用strace分析系统调用阻塞
- 四、代码部署流程优化
- 4.1 自动化部署流水线设计
- 4.2 蓝绿部署与回滚策略
- 4.3 性能基准测试与对比
- 五、eBPF高级监控与诊断
- 5.1 eBPF全方位监控系统
- 5.2 eBPF数据收集与分析平台
- 六、总结与最佳实践
- 6.1 故障排查SOP清单
- 6.2 性能优化检查表
- 6.3 持续改进机制
- 6.4 关键成功因素
Java应用线上故障排查与优化实战指南
一、快速响应机制与流程
1.1 故障分级与响应机制
# incident-response.yaml故障级别:P0-紧急:标准:核心功能不可用,影响所有用户响应:5分钟内响应,30分钟内恢复参与:值班SRE+开发负责人+架构师P1-严重:标准:主要功能降级,影响>30%用户响应:10分钟内响应,2小时内恢复参与:值班SRE+开发组长P2-一般:标准:非核心功能异常,影响<10%用户响应:30分钟内响应,24小时内修复参与:值班SRE+开发人员响应流程:1. 告警接收:通过PagerDuty/钉钉/企业微信2. 故障确认:查看监控指标,验证问题3. 紧急止血:重启、扩容、限流、降级4. 根因分析:使用诊断工具定位问题5. 修复上线:热修复/滚动发布6. 复盘改进:编写故障报告,优化流程
1.2 诊断工具箱标准化
# diagnostics-kit.sh#!/bin/bash# 一键收集诊断信息工具set-eDIAG_DIR="/tmp/diagnostics_$(date+%Y%m%d_%H%M%S)"mkdir-p$DIAG_DIR# 1. 系统级信息collect_system_info(){echo"收集系统信息..."top-b-n1>$DIAG_DIR/top.txtvmstat15>$DIAG_DIR/vmstat.txt iostat-dx15>$DIAG_DIR/iostat.txtdmesg-T>$DIAG_DIR/dmesg.txtnetstat-tunlp>$DIAG_DIR/netstat.txt ss-tunap>$DIAG_DIR/ss.txt sar-nDEV15>$DIAG_DIR/sar_network.txtfree-m>$DIAG_DIR/free.txtdf-h>$DIAG_DIR/df.txtpsauxf>$DIAG_DIR/ps.txt}# 2. JVM进程信息collect_jvm_info(){localpid=$1echo"收集JVM进程$pid信息..."# 基础信息jps-lv>$DIAG_DIR/jps.txt jinfo$pid>$DIAG_DIR/jinfo_$pid.txt2>&1# GC信息jstat-gcutil$pid100010>$DIAG_DIR/jstat_gc_$pid.txt&jstat-gccapacity$pid>$DIAG_DIR/jstat_capacity_$pid.txt# 堆转储(谨慎使用)if["$HEAP_DUMP"="true"];thenjmap -dump:live,format=b,file=$DIAG_DIR/heap_$pid.hprof$pidelsejmap-heap$pid>$DIAG_DIR/jmap_heap_$pid.txt jmap-histo$pid>$DIAG_DIR/jmap_histo_$pid.txtfi# 线程堆栈foriin{1..3};dojstack$pid>$DIAG_DIR/jstack_${pid}_${i}.txtsleep2done# 原生内存pmap-x$pid>$DIAG_DIR/pmap_$pid.txt}# 3. 高级诊断collect_advanced_info(){localpid=$1echo"收集高级诊断信息..."# strace系统调用跟踪(采样)timeout10strace-c-p$pid2>&1>$DIAG_DIR/strace_cpu_$pid.txttimeout10strace-etrace=network,file-p$pid2>&1>$DIAG_DIR/strace_io_$pid.txt# perf性能分析perf record-F99-p$pid-g--sleep10perf report--stdio>$DIAG_DIR/perf_report_$pid.txt perf script>$DIAG_DIR/perf_script_$pid.txt# eBPF/BCC工具ifcommand-vbcc;then/usr/share/bcc/tools/offcputime-p$pid5>$DIAG_DIR/offcputime_$pid.txt /usr/share/bcc/tools/execsnoop-p$pid5>$DIAG_DIR/execsnoop_$pid.txt /usr/share/bcc/tools/opensnoop-p$pid5>$DIAG_DIR/opensnoop_$pid.txtfi}# 4. 应用日志collect_logs(){echo"收集应用日志..."journalctl-ujava-app--since"5 minutes ago">$DIAG_DIR/journalctl.txttail-n1000/var/log/java-app/app.log>$DIAG_DIR/app_log.txttail-n1000/var/log/java-app/gc.log>$DIAG_DIR/gc_log.txt}# 主流程main(){APP_PID=$(pgrep-f"java.*myapp")if[-z"$APP_PID"];thenecho"未找到Java进程"exit1fiecho"诊断目标进程:$APP_PID"collect_system_info collect_jvm_info$APP_PIDcollect_advanced_info$APP_PIDcollect_logs# 打包tar-czf$DIAG_DIR.tar.gz$DIAG_DIRecho"诊断包已生成:$DIAG_DIR.tar.gz"# 生成报告摘要generate_summary}generate_summary(){cat>$DIAG_DIR/summary.md<<EOF # 故障诊断报告摘要 - 时间:$(date)- 进程PID:$APP_PID- 系统负载:$(cat$DIAG_DIR/top.txt|head-1)- 内存使用:$(grep"Mem:"$DIAG_DIR/free.txt)- JVM GC情况:$(tail-1$DIAG_DIR/jstat_gc_$APP_PID.txt)- 线程状态统计:$(grepjava.lang.Thread.State $DIAG_DIR/jstack_${APP_PID}_1.txt|sort|uniq-c)EOF}main"$@"
二、内存泄漏深度排查
2.1 内存泄漏诊断流程
2.2 实战:MAT内存分析
// 内存泄漏典型模式示例publicclassMemoryLeakExample{// 1. 静态集合引起的内存泄漏privatestaticfinalMap<String,Object>CACHE=newHashMap<>();publicvoidaddToCache(