成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 問題排查技術分享

開發 后端
最近翻看以前寫的 PPT, 發現了在2019年做的一次技術分享,關于 Java 問題排查,由于沒什么公司機密可言,整理下分享給大家~

 [[437902]]

前言

最近翻看以前寫的 PPT, 發現了在2019年做的一次技術分享,關于 Java 問題排查,由于沒什么公司機密可言,整理下分享給大家~

線上問題處理流程

直接放PPT截圖吧,現在看來依然不過時

問題排查

可從三個方面入手

  • 知識:有些問題,思考一下就有答案,就像傳說中多隆那樣,回憶下就知道第83行代碼有問題~

  • 工具:當然不是每個人都能做到過目不忘,也有可能這代碼完全不是你寫的,這時就需要靠工具來定位問題

  • 數據:程序運行時產生的數據,也能提供很多線索

知識

知識有很多方面,這里簡單列舉一下:

  • 語言(本文特指 Java):如 JVM 知識、多線程知識等

  • 框架:如 Dubbo、Spring 等

  • 組件:如 Mysql、RocketMq 等

  • 其他:如網絡、操作系統等

舉個例子,我們需要理解 Java 對象從申請到被回收整個過程,這個圖非常清晰,建議爛熟于心:

然后也要了解常見的垃圾收集器:

吞吐量=單位時間內處理的請求數量=運行代碼時間 / (運行代碼時間 + 垃圾回收時間)

以 ParNew + CMS 為例 ,嘗試回答如下幾個問題:

  • 為什么要分代收集?— 關鍵字:效率

  • 對象什么時候進入老年代?— 關鍵字:年齡、大小

  • Young GC 與 Full GC 什么時候發生?— 關鍵字:Eden 不足、Old 不足、Meta 不足、map/System.gc

如果我們了解上述的這些知識后,舉個實際例子,當我們發現 Young GC 頻繁觸發,耗時高,該如何優化?

首先思考,Young GC 什么時候觸發?答案是 Eden 區不足。

接著,Young GC 耗時主要是哪里耗時?答案是掃描 + 復制,掃描通常很快,復制比較慢。

那我們對癥下藥,增加新生代大小試試,結果真的解決問題了,為什么?我們也分析一下

新生代大小為 M 時,假設對象存活  750ms,young GC間隔 500ms,掃描時間為 T1,復制時間為 T2

  • 新生代大小為 M 時:頻率 2次/s,每次耗時 T1 + T2

  • 新生代擴大為 2M 時:頻率 1次/s,每次耗時 2T1

由于T2遠遠大于T1,所以2T1 < T1 + T2

這就是知識的力量~

工具

Java 棧中的工具,也分為這幾類:

  • JDK 自帶:如 jstat、jstack、jmap、jconsole、jvisualvm

  • 第三方:MAT(eclipse插件)、GCHisto、GCeasy(在線GC日志分析工具,https://gceasy.io/)

  • 開源:大名鼎鼎的Arthas、bistoury(去哪網開源)、Async-profiler

這些工具的原理,我們也需要稍微了解下,比如 Cpu profiler大概有兩類:

  • 基于采樣:優點是性能開銷低,缺點是采樣有頻率限制,存在SafePoint Bias問題

  • 插樁:所有方法添加  AOP 邏輯,優點是精準采集,缺點是性能開銷高

比如 uber 開源的 uber-common/jvm-profiler,它就是基于采樣的 Cpu profiler,缺點就是存在 SafePoint Bias 問題,比如有一次排查一個 Cpu 占用問題,就采集到了這樣的火焰圖,可以看到幾乎沒啥用

SafePoint(安全點) 可以簡單理解為 JVM 可以停頓下來的特定位置的點,如果采樣的位置是特定的點,那么采樣就不具有代表性,因為可能在非 SafePoint 時可能消耗了更多的 Cpu,這種現象就被稱為 SafePoint Bias 問題。

但我用另一個 jvm-profiling-tools/async-profiler 來采集,就能看到性能瓶頸:

雖然 Async-profiler 也是基于采樣做,但它能避免 SafePoint Bias 問題,原因是它采用了 AsyncGetCallTrace 的黑科技。于是依據 Async-profiler 給出的火焰圖進行優化,Qps 從 58k 漲到 81k,Cpu 反而從72%下降到了41%

數據

數據包括:

  • 監控數據,如APM、metric、JVM監控、分布式鏈路追蹤等等數據

  • 程序運行數據:如業務數據、AccessLog、GC log、系統日志等

這部分就按實際來分析,沒有統一模板可言。

經驗

說了這么多,從經驗角度總結了如下常見問題該從哪些方面入手:

  • 執行異常:查看日志、debug、請求重放

  • 應用僵死:jstack

  • 耗時高:trace跟蹤、Benchmark

  • Cpu利用率高:Cpu profile分析

  • GC頻繁、耗時高:GC log分析

  • OOM、內存占用高、泄漏:dump內存分析

案例分享

Cobar僵死,進程端口在,但不能處理請求

先踢掉故障機器,保留現場再排查問題,根據日志,定位為內存泄漏

小思考:能通過日志直接確定是哪里內存泄露嗎?— 答案:不能

具體定位可dump內存下載到本地分析,文件如果太大,可以先壓縮下

jmap -dump:format=b,file=/cobar.bin ${pid}

使用 eclipse 的插件 MAT 分析,過程就不放了,結果是發現了一個我們對 Cobar 自定義修改導致的 Bug

 

網關耗時高

使用 Arthas trace 跟蹤調用

  1. trace com.beibei.airborne.embed.extension.PojoUtils generalize 

接入 Sentinel 導致應用僵死

接入限流降級利器 Sentinel 后,配置一條規則,觸發后導致應用僵死,可使用 jstack 進行排查,一眼就看出問題所在

  1. jstack ${pid} > jstack.txt 

最后

本文最早分享于2019年12月,剛好過去2年,由于是 PPT 整理而來,行文沒有那么絲滑,但問題排查的思路、手段依然是這些,大家學廢了嗎?

責任編輯:張燕妮 來源: 捉蟲大師
相關推薦

2021-11-30 19:58:51

Java問題排查

2018-09-11 13:47:35

數據不平衡數據分布數據集

2022-02-08 16:17:41

MySQL主從復制數據庫

2024-08-14 14:20:00

2021-11-14 05:00:56

排查Sdk方式

2022-01-26 19:42:05

MySQL亂碼排查

2021-06-01 07:55:42

DockerEOFk8s

2017-10-12 12:24:50

java

2024-12-02 09:10:15

Redis性能優化

2010-06-29 14:51:26

UML建模技術

2018-10-09 15:00:43

Hadoop分布式架構

2009-10-23 15:50:07

接入技術

2019-04-29 14:23:46

Java服務器CPU

2021-10-14 07:28:03

Kubernetes通用排查

2023-07-26 07:18:54

死鎖線程池

2021-06-28 08:00:00

Python開發編程語言

2024-08-19 00:10:00

C++內存

2021-06-30 13:57:07

Arthas JVMTI

2023-12-26 11:39:50

CPU系統進程

2018-11-06 12:12:00

MySQL內存排查
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久五月天 | 亚洲欧美日韩精品久久亚洲区 | 91一区二区 | 成年人黄色免费视频 | 国产ts人妖一区二区三区 | 精品欧美色视频网站在线观看 | 国产目拍亚洲精品99久久精品 | 一区视频在线免费观看 | 二区中文字幕 | 亚洲精品1区 | av二区三区 | 亚洲欧美精品在线 | 亚洲精品视频一区 | 亚洲午夜精品一区二区三区 | 91热爆在线观看 | 久久久久精 | 精品综合久久 | 中文字幕日韩欧美一区二区三区 | 青青草在线视频免费观看 | av黄色免费 | 国产亚洲一区二区在线观看 | 丝袜美腿一区 | 精品久久久久久久久久久久久久久久久 | 三级黄视频在线观看 | 视频在线一区二区 | 一区二区高清在线观看 | 色就干| 亚洲一区久久 | 欧美一级免费看 | 成人免费在线播放视频 | 国产成人在线看 | 99色视频| 精品国产乱码一区二区三区a | 日韩电影中文字幕 | 欧美男人天堂 | 欧美久久久久 | 精品国产一区二区三区成人影院 | 国产综合久久 | 欧美黄色网 | 91在线精品视频 | 成人不卡 |