天天看點

Arthas診斷工具在docker中使用

作者:迷茫的田略略略

在實際工作中很多的服務都使用docker部署,如果直接在伺服器中使用Arthas則找不到運作的服務而無法使用Arthas進行診斷,是以需要進入到容器内部才能使用Arthas進入診斷。

1.進入伺服器下載下傳arthas-boot

curl -O https://arthas.aliyun.com/arthas-boot.jar
           
[root@localhost data-service-search]# curl -O https://arthas.aliyun.com/arthas-boot.jar
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  138k  100  138k    0     0   301k      0 --:--:-- --:--:-- --:--:--  301k
           

2.複制arthas-boot到容器内

# 複制arthas到容器内根目錄下
docker cp arthas-boot.jar d78b2477186c:/arthas-boot.jar 

#進入容器内部
docker exec -it d78b2477186c bash;           

3.運作arthas

java -jar arthas-boot.jar
           
root@d78b2477186c:/# java -jar arthas-boot.jar
[INFO] JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/jre
[INFO] arthas-boot version: 3.6.7
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 data-service-search.jar
1
[INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.6.7?mirror=aliyun
[INFO] File size: 12.92 MB, downloaded size: 8.95 MB, downloading ...
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/3.6.7/arthas
[INFO] Try to attach process 1
Picked up JAVA_TOOL_OPTIONS: 
[INFO] Attach process 1 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          

wiki       https://arthas.aliyun.com/doc                                        
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
version    3.6.7                                                                
main_class                                                                      
pid        1                                                                    
time       2022-12-04 10:29:31                                                  

[arthas@1]$ 
           

4.輸入arthas指令

輸入指令dashboard就可以看到,到這裡就可以對服務進行診斷了,具體的arthas指令見官方文檔或安裝idea插件

Arthas 官方的工具還不夠足夠的簡單,需要記住一些指令,特别是一些擴充性特别強的進階文法,比如ognl擷取spring context 為所欲為,watch、trace 不夠簡單,需要構造一些指令工具的資訊,是以隻需要一個能夠簡單處理字元串資訊的插件即可使用。當在處理線上問題的時候需要最快速、最便捷的指令,是以插件還是有存在的意義和價值的。

5.指令清單

jvm 相關

  • dashboard - 目前系統的實時資料面闆
  • getstatic - 檢視類的靜态屬性
  • heapdump - dump java heap, 類似 jmap 指令的 heap dump 功能
  • jvm - 檢視目前 JVM 的資訊
  • logger - 檢視和修改 logger
  • mbean - 檢視 Mbean 的資訊
  • memory - 檢視 JVM 的記憶體資訊
  • ognl - 執行 ognl 表達式
  • perfcounter - 檢視目前 JVM 的 Perf Counter 資訊
  • sysenv - 檢視 JVM 的環境變量
  • sysprop - 檢視和修改 JVM 的系統屬性
  • thread - 檢視目前 JVM 的線程堆棧資訊
  • vmoption - 檢視和修改 JVM 裡診斷相關的 option
  • vmtool - 從 jvm 裡查詢對象,執行 forceGc

class/classloader 相關

  • classloader - 檢視 classloader 的繼承樹,urls,類加載資訊,使用 classloader 去 - getResource
  • dump - dump 已加載類的 byte code 到特定目錄
  • jad - 反編譯指定已加載類的源碼
  • mc - 記憶體編譯器,記憶體編譯.java檔案為.class檔案
  • redefine - 加載外部的.class檔案,redefine 到 JVM 裡
  • retransform - 加載外部的.class檔案,retransform 到 JVM 裡
  • sc - 檢視 JVM 已加載的類資訊
  • sm - 檢視已加載類的方法資訊

monitor/watch/trace 相關

注意 請注意,這些指令,都通過位元組碼增強技術來實作的,會在指定類的方法中插入一些切面來實作資料統計和觀測,是以線上上、預發使用時,請盡量明确需要觀測的類、方法以及條件,診斷結束要執行 stop 或将增強過的類執行 reset 指令。
  • monitor - 方法執行監控
  • stack - 輸出目前方法被調用的調用路徑
  • trace - 方法内部調用路徑,并輸出方法路徑上的每個節點上耗時
  • tt - 方法執行資料的時空隧道,記錄下指定方法每次調用的入參和傳回資訊,并能對這些不同的時間下調用進行觀測
  • watch - 方法執行資料觀測

profiler/火焰圖

  • profiler - 使用async-profiler對應用采樣,生成火焰圖
  • jfr - 動态開啟關閉 JFR 記錄

鑒權

  • auth - 鑒權

options

  • options - 檢視或設定 Arthas 全局開關

管道

Arthas 支援使用管道對上述指令的結果進行進一步的處理,如 sm java.lang.String * | grep 'index'

  • grep - 搜尋滿足條件的結果
  • plaintext - 将指令的結果去除 ANSI 顔色
  • wc - 按行統計輸出結果

背景異步任務

當線上出現偶發的問題,比如需要 watch 某個條件,而這個條件一天可能才會出現一次時,異步背景任務就派上用場了,詳情請參考這裡

  • 使用 > 将結果重寫向到日志檔案,使用 & 指定指令是背景運作,session 斷開不影響任務執行(生命周期預設為 1 天)
  • jobs - 列出所有 job
  • kill - 強制終止任務
  • fg - 将暫停的任務拉到前台執行
  • bg - 将暫停的任務放到背景執行

基礎指令

  • base64 - base64 編碼轉換,和 linux 裡的 base64 指令類似
  • cat - 列印檔案内容,和 linux 裡的 cat 指令類似
  • cls - 清空目前螢幕區域
  • echo - 列印參數,和 linux 裡的 echo 指令類似
  • grep - 比對查找,和 linux 裡的 grep 指令類似
  • help - 檢視指令幫助資訊
  • history - 列印指令曆史
  • keymap - Arthas 快捷鍵清單及自定義快捷鍵
  • pwd - 傳回目前的工作目錄,和 linux 指令類似
  • quit - 退出目前 Arthas 用戶端,其他 Arthas 用戶端不受影響
  • reset - 重置增強類,将被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
  • session - 檢視目前會話的資訊
  • stop - 關閉 Arthas 服務端,所有 Arthas 用戶端全部退出
  • tee - 複制标準輸入到标準輸出和指定的檔案,和 linux 裡的 tee 指令類似
  • version - 輸出目前目标 Java 程序所加載的 Arthas 版本号