生產環境故障處理是後端工程師的核心技能。本文構建系統化排查框架,從業務日誌、數據庫瓶頸、JVM 異常到作業系統資源,提供標準化工具鏈與實戰案例,幫助工程師快速定位根因、精準止血。
異常發生時,業務日誌是第一現場。
grep "ERROR" app.log | grep "OrderService"tail -f /var/log/app/error.log禁忌: 絕不使用 vim 直接打開超大日誌文件(會佔滿內存導致 OOM)。
Java 應用 80% 以上性能問題源於數據庫。
Could not get JDBC Connectionshow processlist 查看連接狀態Query 或 Sleep 狀態進程EXPLAIN 分析執行計劃,優化索引或 SQLJVM 問題主要集中在:GC 耗時過長、OOM、死鎖、線程阻塞、線程數暴增。
| 工具 | 核心用途 |
|---|---|
jps -v | 列出 JVM 進程及啟動參數 |
jinfo <pid> | 查看運行時配置、系統屬性 |
jstat -gcutil <pid> 1000 10 | GC 統計:各代區佔用、GC 次數/耗時 |
jstack -l <pid> | 線程堆棧快照,死鎖/阻塞分析 |
jmap -dump:format=b,file=heap.hprof <pid> | 堆轉儲文件生成 |
OutOfMemoryError-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumpsjmap -dump:format=b,file=manual.hprof <pid> 或 kill -3 <pid>運維提示: 確保磁盤剩餘空間 > JVM 最大堆內存(-Xmx)。
jstack -l <pid> 分析線程堆棧BLOCKED 狀態、waiting for monitor entry、waiting on condition# 統計總線程數
jstack -l <pid> | wc -l
# 統計 BLOCKED 狀態
jstack -l <pid> | grep "BLOCKED" | wc -l
# 統計等待條件
jstack -l <pid> | grep "Waiting on condition" | wc -l
阻塞類型判斷:
重點關注:Full GC 頻率、單次耗時、老年代佔用率。推薦閱讀 Oracle G1GC 調優指南。
top # 交互模式下常用快捷鍵:
# h 幫助 R 反向排序 x 高亮排序列 y 高亮運行進程
# Shift+>/< 切換排序字段 d/s 設置刷新間隔 f 字段管理 k kill 進程
關鍵指標:
load average:1/5/15 分鐘負載,超過 CPU 核心數表示擁塞%us(用戶態)、%sy(內核態)、%wa(IO 等待)、%st(虛擬機偷佔時間)# 連續觀察
free -m -c 10 -s 1 # 每秒刷新,共 10 次,MB 單位
# vmstat 系統級視角
vmstat 1 10 # 每秒輸出,共 10 次
# 關鍵列:r(運行隊列長度,持續 >1 需擴容 CPU)、b(IO 等待進程數)
iostat -m 1 10 # MB 單位,每秒刷新 10 次
# 關注:%util(設備利用率)、await(平均等待時間)、svctm(服務時間)