全部產品
Search
文件中心

Application Real-Time Monitoring Service:Arthas診斷

更新時間:Dec 10, 2024

Arthas是診斷Java領域線上問題的利器,利用位元組碼增強技術,可以在不重啟JVM進程的情況下,查看程式的運行情況。

ARMS 100%整合Arthas的所有能力,且相比自行掛載使用有如下優勢:

  • 不依賴JDK環境,您無需下載安裝Arthas,可按需批量一鍵開啟/關閉。

  • 常用功能白屏化,免去記命令、查命令、寫運算式的煩惱。

  • 和ARMS上下文關聯,通過Trace命令可以看到ARMS的鏈路TraceID。

前提條件

重要
  • ARMS應用監控面向已開通新版計費的使用者提供全新的監控詳情頁面,新版計費詳情,請參見產品計費(新版)

    對於未開通新版計費的使用者,如需查看新版監控詳情頁面,可在應用列表頁面單擊切換新版

  • 該功能目前僅支援Java應用。

  • Arthas診斷功能建議只在排查問題時開啟,在日常使用時建議關閉。

  • ARMS Agent版本為v2.7.1.3或以上。

  • 已接入應用監控。具體操作,請參見應用監控概述

  • 應用的程式設計語言需要為Java。

背景資訊

ARMS提供的Arthas診斷功能主要用於補齊ARMS在即時診斷方面的能力。ARMS的Arthas診斷功能包括以下幾種類型:

  • JVM概覽:查看當前JVM進程即時的記憶體使用量情況、系統資訊、系統變數和環境變數。

  • 線程耗時分析:查看當前JVM進程的線程耗時情況以及指定線程的即時方法棧。

  • 方法執行分析:抓取任意方法(非JDK方法)滿足指定條件的一次執行記錄,記錄該方法的參數、異常、傳回值以及方法內部各個方法執行耗時。

  • 對象查看器:查看任意類的某個執行個體即時的屬性取值情況。

  • 即時看板:常見組件的即時看板,例如,Druid串連池的即時看板可以看到串連池的配置、使用方式以及SQL執行耗時情況。

  • Arthas Shell:通過命令列方式使用Arthas診斷。

說明

Arthas效能分析已經全面升級為持續剖析功能,使用更加便捷,功能更加強大,可常態化開啟,隨時使用。

持續剖析功能可以有效發現Java程式中因CPU、記憶體和IO導致的瓶頸問題,並且按照方法名稱、類名稱和行號進行細分統計,最終協助開發人員最佳化程式、降低延遲、增加輸送量、節約成本。更多資訊,請參見接入持續剖析功能

開通Arthas診斷功能

  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    image:接入應用監控的Python應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在上方導覽列選擇應用配置 > 自訂配置

  4. Arthas監控地區,開啟Arthas開關,根據需求選擇是否僅對部分IP進行Arthas診斷,並添加目標IP。

  5. 單擊儲存

查看Arthas診斷資訊

  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    image:接入應用監控的Python應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在上方導覽列選擇應用診斷 > Arthas診斷

  4. 在Arthas診斷頁面頂部下拉式清單選擇待診斷的應用執行個體。

    • 若該執行個體的Agent版本未升級至2.7.1.3或以上,頁面會提示您需要先升級Agent。

    • 若該執行個體的Agent版本已升級至2.7.1.3或以上,頁面會顯示該執行個體的Arthas診斷資訊。

JVM概覽

JVM概覽支援查看應用的JVM相關資訊,包括JVM記憶體、作業系統資訊、變數資訊等,協助您瞭解JVM的總體情況。

Arthas診斷頁面預設顯示JVM概覽頁簽,您可以在JVM概覽頁簽查看以下資訊:

  • JVM記憶體:JVM記憶體的相關資訊,包括堆記憶體使用量情況、非堆記憶體使用量情況、GC情況等。JVM記憶體

  • 作業系統資訊:作業系統的相關資訊,包括平均負載情況,作業系統名稱、作業系統版本、Java版本等。作業系統資訊

  • 變數資訊:變數的相關資訊,包括系統變數和環境變數。變數資訊

線程耗時分析

線程耗時分析支援顯示該應用的所有線程和查看線程的堆棧資訊,協助您快速定位耗時較高的線程。

  1. 在Arthas診斷頁面,單擊線程耗時分析頁簽。

    線程耗時分析頁簽會即時擷取當前JVM進程的線程耗時情況,並將相似線程彙總。新版Arthas診斷-線程耗時分析

  2. 單擊線程左側的+表徵圖展開線程明細,可以查看線程的ID、CPU使用率和狀態。

  3. 如需查看目標線程的堆棧資訊,您可以在目標線程右側的操作列,單擊查看即時堆棧

    堆棧詳情

方法執行分析

方法執行分析支援抓取方法的某一次執行的耗時、入參、傳回值等資訊和鑽入,協助您快速定位導致慢調用的根本原因,以及問題線下無法複現或日誌缺失等情境。

  1. 在Arthas診斷頁面,單擊方法執行分析頁簽。

  2. 方法執行分析頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊搜尋表徵圖。

  3. 在搜尋到的類中選擇需要診斷的類,然後在右側方法選擇框選取該類的某個方法,單擊確定

    頁面將會顯示ARMS隨機抓取的該方法的某一次執行的資訊。新版Arthas診斷-方法執行分析

    • 左側執行堆棧地區顯示診斷方法的內部執行記錄。

      • 如需鑽入某個內部方法,在其右側操作列,單擊鑽入

      • 如需查看方法源碼,單擊執行堆棧地區頂部的查看方法源碼

        如下圖所示,每一次內部方法的執行耗時都會以注釋的方式顯示在原始碼中。方法源碼

    • 右側方法執行結果地區顯示方法執行的參數值、傳回值、異常、成員變數以及此次方法執行的TraceID。

    • 右側設定執行條件地區執行以下步驟,可以設定方法執行條件來抓取滿足條件的方法執行記錄。

      1. 選擇當前方法中的一個重載方法。

      2. 請選擇初始過濾key下拉框選擇初始過濾Key的類型,單擊向左箭頭表徵圖。

        初始過濾Key的類型:

        • params[n]:方法的第n個參數。

        • returnObj:方法的傳回值。

        • 方法執行耗時:方法執行的耗時。

        • 是否拋出異常:方法執行時是否拋出異常。

        說明

        如果選取的初始過濾Key為巢狀型別,則還需要繼續選擇該巢狀型別的內部欄位,直到選擇欄位為基礎類型。

      3. 選擇過濾條件。

      4. 輸入過濾值。

      5. 單擊添加

        當前過濾條件地區會顯示已添加的過濾條件。

        設定執行條件

      6. 在左側執行堆棧地區右上方單擊重新整理表徵圖,系統會按照設定的條件重新抓取一次方法執行。

對象查看器

對象查看器用於查看一些單例對象當前的狀態,用於排查應用狀態異常問題,例如應用配置、黑白名單、成員變數等。

  1. 在Arthas診斷頁面,單擊對象查看器頁簽。

  2. 對象查看器頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊搜尋表徵圖。

  3. 在搜尋到的類中選擇需要診斷的類,然後在右側執行個體選擇框選擇該類的某個執行個體,單擊確定

    頁面則會顯示該執行個體中當前欄位的即時取值。Arthas診斷-對象查看器

    • 對於簡單類型的欄位,在左側對象欄位即時取值地區的詳情列會是欄位的取值。

    • 對於複製類型的欄位,在左側對象欄位即時取值地區的詳情列單擊點擊查看詳情,在右側欄位詳情地區查看欄位取值詳情。

      欄位詳情地區僅支援將複雜類型欄位還原序列化一層進行展示,如果需要查看更具體的資料,單擊點擊查看欄位更詳細的資料。

即時看板

即時看板用於查看系統中用到的關鍵組件的即時狀態,例如查看資料庫連接池的使用方式、HTTP串連池的使用方式等,有利於排查資源類型的問題。

  1. 在Arthas診斷頁面,單擊即時看板頁簽。

  2. 即時看板頁簽的下拉式清單中選擇一個看板,然後在右側執行個體選擇框選擇該看板的一個執行個體,單擊添加到看板

    頁面顯示該看板的即時情況。如下圖顯示為一個Druid串連池的即時狀態資訊,包括基礎配置、串連池狀態、執行耗時分布等。Arthas診斷-即時看板

Arthas Shell

通過命令列方式自訂Arthas診斷。

Arthas Shell

常見問題

Arthas開啟後無提示無心跳

出現這種情況可能存在以下兩個原因:

  • 網路不通。

    檢測網路連通性,若公網應用診斷連接埠(9092)和內網應用診斷連接埠(9092)同時失敗,則需要在網路安全性群組中開啟應用診斷網域名稱的9092連接埠出方向存取權限以及對應地區的存取點網域名稱。需要開放的網域名稱請參見Java應用監控網路設定,其中應用診斷網域名稱與調用鏈中繼資料網域名稱一致。

  • 應用掛載了 SkyWalking 探針。

    目前 ARMS 整合的 Arthas 和 SkyWalking 不相容,無法同時存在,需要卸載 SkyWalking 探針或者自行掛載高版本 Arthas(3.7.0及以上版本)。

    執行cat ~/logs/arthas/arthas.log命令,在日誌結尾處可以看到探針不相容的異常資訊。

    2023-09-11 09:09:47 [arthas-binding-thread] ERROR c.t.a.core.server.ArthasBootstrap -start channel client failure
    java.lang.ExceptionInInitializerError: null
    	at com.alibaba.arthas.channel.proto.ArthasServiceGrpc$ArthasServiceStub.register(ArthasServiceGrpc.java:306)
    	at com.alibaba.arthas.channel.client.ChannelClient.connect(ChannelClient.java:165)
    	at com.alibaba.arthas.channel.client.ChannelClient.start(ChannelClient.java:111)
    	at com.taobao.arthas.core.server.ArthasBootstrap.bind(ArthasBootstrap.java:478)
    	at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:162)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:613)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:601)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:182)
    	at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20)
    	at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:152)
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at io.grpc.stub.ClientCalls.<clinit>(ClientCalls.java:52)
    	... 14 common frames omitted
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:139)
    	... 19 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: Lorg/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter;
    	at java.lang.Class.getDeclaredFields0(Native Method)
    	at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    	at java.lang.Class.getDeclaredField(Class.java:2068)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:163)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:233)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3655)
    	... 24 common frames omitted
    Caused by: java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at com.taobao.arthas.agent.ArthasClassloader.loadClass(ArthasClassloader.java:34)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	... 30 common frames omitted
    

方法執行分析頁簽轉圈一段時間後提示命令執行失敗

image

方法執行分析是即時抓取使用者當前選擇的方法執行情況,如果在等待的時間內,指定的方法並沒有執行,就會出現該錯誤。可以單擊右側重新整理表徵圖重試。

Arthas展示的survivor_space空間為實際值的一半

Survivor_space分為from和to兩部分,兩者各佔一半。Arthas只展示了from區的大小。

Arthas診斷額外收費嗎

不額外收費。

ARMS控制台開啟Arthas後,手動掛載Arthas提示串連拒絕

Arthas預設使用3658連接埠來接收新的串連用戶端,ARMS整合的Arthas為了避免一台機器上的多個進程同時掛載Arthas時出現連接埠衝突,使用的是隨機連接埠,所以會出現掛載失敗的問題,出現這種情況需要在ARMS控制台關閉Arthas功能。

ARMS控制台開啟Arthas後,日誌裡面提示Arthas server already bind.

如果應用之前掛載過開源的Arthas,則ARMS Arthas不支援重複開啟,需要先刪除開源的Arthas,再開啟ARMS的Arthas。