採集 Elasticsearch 火焰圖

背景

有個 ES 集羣,業務寫數入集羣時經常導致集羣 CPU 告警和集羣端口響應超時(20s無響應),故希望通過採集火焰圖分析原因。

工具選擇

Arthas

Introduction

Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛。

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

  1. 這個類從哪個 jar 包加載的?爲什麼會報各種類相關的 Exception?
  2. 我改的代碼爲什麼沒有執行到?難道是我沒 commit?分支搞錯了?
  3. 遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
  4. 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  5. 是否有一個全局視角來查看系統的運行狀況?
  6. 有什麼辦法可以監控到JVM的實時運行狀態?
  7. 怎麼快速定位應用的熱點,生成火焰圖?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,採用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

以上描述摘自官方描述~~~

Arthas 自 3.1.5 版本起集成了開箱即用的 Profiler / 火焰圖功能,因此首選了通過 Arthas 工具來採集。

Version

筆者在此使用的是 3.2.0 版本 Arthas

#1坑

運行工具自帶的測試 demo ,測試採集程序火焰圖,出現如下報錯:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CNgH2ajF-1588863523157)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507215651945.png)]

[arthas@16648]$ profiler start
/home/es/gaoyh/arthas/async-profiler/libasyncProfiler-linux-x64.so: /lib64/libc.so.6: version `GLIBC_2.14’ not found (required by /home/es/gaoyh/arthas/async-profiler/libasyncProfiler-linux-x64.so)

從網上查找資料後,發現是 GLIBC 版本不支持。測試機器的 GLIBC 支持版本如下:

strings /lib64/libc.so.6 | grep GLIBC

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xwYrMv3E-1588863523161)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507220300898.png)]

參考文章:

但生產環境部署 ES 機器的機器,是支持 GLIBC_2.14 的,因不確定升級帶來的影響,另找了另外一臺和生產環境一致的測試機器進行測試:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LOBYWErG-1588863523164)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507220532070.png)]
成功採集測試 demo 的火焰圖信息。

採集命令參考官方說明文檔。

#2坑

似乎沒有問題了,接下來,準備採集自測 ES 集羣火焰圖:

筆者自測 ES 集羣環境信息:

ES 版本:V_5.4.2;

JDK 版本:JDK_1.8.0_231;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pYrLvbpr-1588863523167)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507221059263.png)]

[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121)
at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:104)
at com.taobao.arthas.core.Arthas.(Arthas.java:28)
at com.taobao.arthas.core.Arthas.main(Arthas.java:123)
[ERROR] attach fail, targetPid: 37133

在進入 Arthas 對 ES 運行狀況查看時即報錯,通過查閱資料得知,此問題原因是由於 ES 集羣權限限制所致,可查看 Issue#156[https://github.com/alibaba/arthas/issues/156#] ,按照其中討論,採用在 java.policy 文件(jdk1.8.0_231/jre/lib/security/java.policy)中新增如下配置:

permission java.security.AllPermission;
permission java.lang.RuntimePermission "*";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.net.NetPermission "*";
permission java.net.SocketPermission "localhost:0","resolve,listen";
permission java.net.URLPermission "http:*","*:*";
permission java.net.URLPermission "https:*","*:*";
permission org.elasticsearch.ThreadPermission "modifyArbitraryThreadGroup";

新增之後,仍然報原先的錯誤,重啓 ES 節點之後,Arthas 恢復正常,可以正常採集火焰圖信息了。

但生產環境,重啓 ES 節點,肯定不合適,故此方式不合適。

java.policy 可參考文章:

因此,只能放棄通過 Arthas 工具採集火焰圖信息。

async-profiler

Introduction

async-profile 目前支持 Linux 和 macOS 平臺(macOS 下只能分析用戶空間的代碼)。

  • Linux / x64 / x86 / ARM / AArch64
  • macOS / x64

根據系統環境,從 GitHub 上下載對應版本

https://github.com/jvm-profiling-tools/async-profiler

async-profiler 工具進行火焰圖採集,從 1.2 版本起已經內置了開箱即用的 SVG 文件生成功能,更早之前的版本生成火焰圖則需要 FlameGraph 工具。

更多詳細信息可查看官方文檔:https://github.com/jvm-profiling-tools/async-profiler

Version

筆者在此使用的是 1.7 版本的 async-profiler 。

過程

async-profiler 工具的安裝和使用本文不予介紹,可自行上網查閱資料。

可參考文章:

安裝完成之後,對自測 ES 集羣進行火焰圖採集,一帆風順哈哈哈哈哈哈哈哈哈

Commands

火焰圖採集,命令簡析

Arthas
	https://arthas.gitee.io/profiler.html
	
async-profiler
	Usage: ./profiler.sh [action] [options] <pid>
	eg:
		./profiler.sh -d 30 -f profile.svg 3456
		對 PID 爲 3456 的 java 進程採樣 30 秒,然後生成 profile.svg 結果文件
		默認情況下是分析 CPU 性能,如果要進行其他分析,可以使用 -e 參數:
			-e event     profiling event: cpu|alloc|lock|cache-misses etc.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章