Arthas是診斷Java領域線上問題的利器,利用字節碼增強技術,可以在不重啟JVM進程的情況下,查看程序的運行情況。EDAS白屏化支持Arthas的常用功能,包括JVM概覽、線程耗時分析、方法執行分析和性能分析。

前提條件

要使用Arthas診斷的應用必須滿足以下條件:
  • 部署環境為EDAS K8s環境。
    說明 本文以容器服務Kubernetes版為例。
  • 編程語言為Java。
  • 3658端口和8563端口未被占用。

背景信息

Arthas是一款開源Java診斷工具,深受開發者歡迎。關于Arthas的更多信息,請參見Arthas官網

升級arms-pilot并重啟應用

在使用Arthas診斷前,您需要先升級arms-pilot并重啟應用。
重要 升級arms-pilot不會對您的應用產生任何影響。但需要注意的是,在升級arms-pilot的過程中,請不要進行應用發布、應用重啟、應用回滾等操作。

為容器服務Kubernetes版升級arms-pilot并重啟應用的操作步驟如下:

  1. 升級arms-pilot。
    1. 登錄容器服務管理控制臺
    2. 在左側導航欄,單擊集群
    3. 集群列表頁面,單擊目標集群名稱或者目標集群右側操作列下的詳情
    4. 在左側導航欄,選擇工作負載 > 無狀態
    5. 無狀態頁面,從命名空間下拉列表中選擇arms-pilot-system或arms-pilot。
    6. 找到名稱為arms-pilot-ack-arms-pilot的無狀態應用(Deployment),在其右側操作列,選擇更多 > 重新部署
    7. 重新部署對話框,單擊確定
  2. 如果您的集群同時安裝了mse-pilot, 您需要在升級arms-pilot后升級mse-pilot。
    1. 在當前的無狀態頁面下,從命名空間下拉列表中選擇mse-pilot。
    2. 找到名稱為arms-pilot-ack-arms-pilot的無狀態應用(Deployment),在其右側操作列,單擊編輯
    3. 編輯頁面,設置鏡像Tag為v1.29,然后單擊更新
    重要 升級mse-pilot不會對您的應用產生任何影響。但需要注意的是,在升級mse-pilot的過程中,請不要進行應用發布、應用重啟、應用回滾等操作。
  3. 如果被監控的應用的PID為1,您需要修改應用的YAML配置文件。
    1. 無狀態頁面,從命名空間下拉列表,選擇應用所在命名空間,找到應用的Deployment,在其右側操作列,選擇更多 > 查看Yaml
    2. 編輯YAML對話框,在spec>template>metadata>annotations下添加ArthasEnable: 'on',然后單擊確定
      說明 如果沒有metadata下沒有annotations,您需要先添加annotations:,然后添加ArthasEnable: 'on'
      編輯YAML
  4. 重啟應用。
    1. 無狀態頁面,從命名空間下拉列表,選擇應用所在命名空間,找到應用的Deployment,在其右側操作列,選擇更多 > 重新部署
    2. 重新部署對話框,單擊確定

功能入口

  1. 登錄EDAS控制臺
  2. 按需執行以下任一操作來進入應用的詳情頁面:
    • 在左側導航欄選擇資源管理 > 容器服務K8s集群(或資源管理 > Serverless K8s集群),在頂部菜單欄選擇地域并在頁面上方選擇微服務空間,在容器服務K8s集群Serverless K8s集群頁面單擊集群ID,然后在集群詳情頁面的應用列表區域單擊具體應用名稱。
    • 在左側導航欄單擊應用列表,在頂部菜單欄選擇地域并在頁面上方選擇微服務空間,在集群類型下拉列表中選擇容器服務/Serverless K8s集群,然后單擊目標應用名稱。
  3. 在應用詳情的左邊導航欄中選擇監控 > 應用診斷-Arthas診斷
  4. 在Arthas診斷頁面,選擇應用的Pod。
    下載并掛載Arthas
    • 如果檢測未下載Arthas,您需要重新部署探針以下載Arthas。具體操作,請參見步驟1
    • 如果檢測未掛載Arthas,EDAS會為您重新部署應用以掛載Arthas。如何手動部署應用,請參見步驟4
    • 如果嘗試掛載Arthas失敗,您需要檢查應用的PID:

JVM概覽

JVM概覽支持查看應用的JVM相關信息,包括JVM內存、操作系統信息、變量信息等,幫助您了解JVM的總體情況。

Arthas診斷頁面默認顯示JVM概覽頁簽,您可以在JVM概覽頁簽下查看以下信息:
  • JVM內存:JVM內存的相關信息,包括堆內存使用情況、非堆內存使用情況、GC情況等。JVM內存
  • 操作系統信息:操作系統的相關信息,包括平均負載情況,操作系統名稱、操作系統版本、Java版本等。操作系統信息
  • 變量信息:變量的相關信息,包括系統變量和環境變量。變量信息
  • 可選:線程Top-10:CPU使用率排名前10的線程的相關信息,包括名稱、ID、CPU使用率、狀態。線程Top-10

    如需查看某個線程的堆棧信息,您可以在某個線程右側的操作列,單擊查看

    堆棧詳情

線程耗時分析

線程耗時分析支持顯示該應用的所有線程和查看線程的堆棧信息,幫助您快速定位耗時較高的線程。

  1. 在Arthas診斷頁面,單擊線程耗時分析頁簽。
    線程耗時分析頁簽下按照CPU使用率降序顯示該應用的所有線程的相關信息,包括線程的名稱、ID、CPU使用率、狀態。線程耗時分析
  2. 如需查看某個線程的堆棧信息,您可以在某個線程右側的操作列,單擊查看
    堆棧詳情

方法執行分析

方法執行分析支持抓取方法的某一次執行的耗時、入參、返回值等信息和鉆入,幫助您快速定位導致慢調用的根本原因。方法執行分析適用于調用線下無法復現或日志缺失等場景。

  1. 在Arthas診斷頁面,單擊方法執行分析頁簽。
  2. 方法執行分析頁簽下,選擇服務,單擊確定
    重要 選擇服務后,EDAS將自動推斷該服務對應到代碼的類和方法,為您自動填寫對應的類和方法。如果推斷失敗,您需要手動填寫該服務對應到代碼的類和方法。
    方法頁簽下顯示EDAS隨機抓取的該方法的某一次執行的信息,包括方法名、執行耗時、入參、返回值、異常以及該方法的內部方法的信息。該方法的內部方法中執行耗時最高的方法的時間軸標紅顯示。方法執行分析
  3. 可選:如需鉆入某個內部方法,在其右側操作列,單擊鉆入
    方法頁簽下顯示該方法的該次執行信息,包括方法名、執行耗時、入參、返回值、異常以及該方法的內部方法的信息。該方法的內部方法中執行耗時最高的方法的時間軸標紅顯示。鉆入
  4. 如需指定抓取方法的執行的滿足條件,執行以下操作:
    1. 在方法頁簽下,單擊修改診斷參數
    2. 診斷參數設置對話框,設置以下參數,然后單擊確認
      參數描述示例值
      僅當拋出異常是否僅當方法的執行拋出異常時才抓取。取值:
      • :僅當方法的執行拋出異常時才抓取。
      • :方法的執行不拋出異常時也抓取。
      耗時大于方法的執行耗時大于該耗時才被抓取。單位為ms。30
      對象反序列化層級方法的執行的參數和返回值為復雜對象時的反序列化深度。取值越大,反序列化深度越深,能看到的復雜對象的內部字段越多。5
      添加參數方法的執行的參數的取值滿足該條件時才被抓取。示例:
      • 示例方法:方法createOrder的源代碼片段如下:
        class User {
            private int userId;
            private String userName;
            private boolean isVIP;
            }
            public void createOrder(User user, String productId, double price)
      • 抓取條件:userId為8753的方法執行。
      • 參數設置:params[0].userId ; = ; 8753
      params[0].userId ; = ; 8753
    3. 單擊刷新圖標。
      方法頁簽下顯示滿足該抓取條件的某一次方法的執行信息。
  5. 可選:如需查看方法源碼,在方法頁簽下,單擊查看方法源碼

    如下圖所示,每一次內部方法的執行耗時都會以注釋的方式顯示在源代碼中。該方法的內部方法中執行耗時最高的方法的源代碼標紅顯示。

    方法堆棧

性能分析

性能分析支持對CPU耗時、內存分配等對象進行一定時間的采樣并生成相應的火焰圖,幫助您快速定位應用的性能瓶頸。

  1. 在Arthas診斷頁面,單擊性能分析頁簽。
  2. 性能分析頁簽下方,單擊新建火焰圖
  3. 新建火焰圖對話框,選擇火焰圖類型,輸入采樣時間,輸入備注信息,然后單擊確認
    參數描述示例值
    火焰圖類型采樣對象的類型。取值:
    • cpu耗時
    • 內存分配
    • 鎖耗時
    • itimer
    cpu耗時
    輸入采樣時間(單位:秒)采樣的時長。取值:10~1800。30
    性能分析頁簽下方顯示新建火焰圖的任務信息,包括開始時間、采樣時間、任務執行Pod等。性能分析
  4. 性能分析頁簽下方,找到任務記錄,在其右側任務狀態,單擊查看火焰圖,根據頁面提示下載SVG格式的火焰圖文件,然后在瀏覽器中打開。
    火焰圖