Arthas、BTrace線上問題診斷工具比較

生產環境中可能出現各種問題,可能是邏輯性錯誤,可能是環境相關,這時候需要獲取程序運行時的數據信息,如方法參數、返回值來定位問題,通過傳統的增加日誌記錄的方式非常繁瑣,而且需要重啓server,代價很大。arthas、BTrace可以動態地跟蹤java運行程序,將跟蹤字節碼注入到運行類中,對運行代碼侵入較小,對性能上的影響可以忽略不計

btrace簡單介紹

btrace有諸多安全限制,需要增加jvm啓動參數-Dcom.sun.btrace.unsafe=true,並且需要編寫代碼。arthas類似linux shell,直接敲命令解決所有問題,好用太多

1.下載地址

https://github.com/btraceio/btrace/releases/download/v1.3.11.3/btrace-bin-1.3.11.3.zip

2.啓動命令

btrace [-p ] [-cp ]
樣例:
./bin/btrace -cp mylib/fastjson-1.2.41.jar:mylib/spring-web-5.0.8.RELEASE.jar:. 18962 Btrace.java

3.獲取方法參數、返回值例子

package com.test;

import com.alibaba.fastjson.JSONObject;
import com.sun.btrace.BTraceUtils;
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
import org.springframework.web.client.RestTemplate;

/**
 * 監控myMethod方法入參、返回值 
 */
@BTrace
public class Btrace {
    @OnMethod(
            clazz = "com.test.MyClass",
            method = "myMethod",
            location = @Location(Kind.RETURN) //函數返回的時候執行
    )
    public static void myMethod(RestTemplate template, String param,  @Return JSONObject result) {
        println("param:" + param);
    }
}

arthas使用介紹

arthas線上問題診斷工具,可查看classloader信息,類加載情況,jstack,方法調用監控,線上性能分析等

1.下載安裝arthas

下載地址:https://alibaba.github.io/arthas/arthas-boot.jar,windows上使用瀏覽器打開,linux支持wget下載保存到本地

2.啓動arthas

執行java -jar arthas-boot.jar啓動arthas,成功啓動會打印java進程列表,輸入相應序號進入arthas。
我們使用windows的powershell演示arthas啓動如下:

PS D:\dev> java -jar .\arthas-boot.jar
[INFO] arthas-boot version: 3.1.0
[INFO] Process 20892 already using port 3658
[INFO] Process 20892 already using port 8563
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 20892 demo.test.myweb.MywebApplication
  [2]: 11952 org.jetbrains.plugins.scala.nailgun.NailgunRunner

3.查看應用的classloader信息

該命令會顯示classloader名、實例數、加載的類數量

$ classloader //打印classloader信息
 name                                                numberOfInstances  loadedCountTotal
 sun.misc.Launcher$AppClassLoader                    1                  4029
 BootstrapClassLoader                                1                  2947
 com.taobao.arthas.agent.ArthasClassloader           1                  1079
 sun.reflect.DelegatingClassLoader                   82                 82
 sun.misc.Launcher$ExtClassLoader                    1                  29
 javax.management.remote.rmi.NoCallStackClassLoader  2                  2
Affect(row-cnt:6) cost in 12 ms.
$ classloader -c 3444d69d -a //查看hash值爲3444d69d的classloader加載的所有類

4.使用watch觀察方法入參、返回值、異常信息

通過編寫OGNL表達式進行對應變量的查看。假如有下面controller方法,入參User有name、pass兩個屬性
params[0]代表第一個參數
params[0].name代表第一個參數user的name屬性值
returnObj代表返回值

@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(User user) {
    if ("tom".equals(user.getName())) {
        if ("123456".equals(user.getPass())) {
            return "success";
        }
    }
    return "failed";
}
$ watch demo.test.myweb.UserController login "{params[0].name,params[0].pass,returnObj}"
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 37 ms.
ts=2019-03-25 15:05:44; [cost=0.178959ms] result=@ArrayList[
    @String[tom],
    @String[123456],
    @String[success],
]
ts=2019-03-25 15:06:03; [cost=0.172545ms] result=@ArrayList[
    @String[tom],
    @String[aaaaaa],
    @String[failed],
]

5.monitor/watch/trace相關

請注意,這些命令,都通過字節碼增強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,因此在線上、預發使用時,請儘量明確需要觀測的類、方法以及條件,診斷結束要執行 shutdown 或將增強過的類執行 reset 命令。
monitor——方法執行監控
watch——方法執行數據觀測
trace——方法內部調用路徑,並輸出方法路徑上的每個節點上耗時
stack——輸出當前方法被調用的調用路徑
tt——方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測

6.基礎命令

help——查看命令幫助信息
cat——打印文件內容,和linux裏的cat命令類似
pwd——返回當前的工作目錄,和linux命令類似
cls——清空當前屏幕區域
session——查看當前會話的信息
reset——重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
version——輸出當前目標 Java 進程所加載的 Arthas 版本號
history——打印命令歷史
quit——退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
shutdown——關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
keymap——Arthas快捷鍵列表及自定義快捷鍵

7.jvm相關

dashboard——當前系統的實時數據面板
thread——查看當前 JVM 的線程堆棧信息
jvm——查看當前 JVM 的信息
sysprop——查看和修改JVM的系統屬性
sysenv——查看JVM的環境變量
getstatic——查看類的靜態屬性
ognl——執行ognl表達式

8.class/classloader相關

sc——查看JVM已加載的類信息
sm——查看已加載類的方法信息
jad——反編譯指定已加載類的源碼
mc——內存編繹器,內存編繹.java文件爲.class文件
redefine——加載外部的.class文件,redefine到JVM裏
dump——dump 已加載類的 byte code 到特定目錄
classloader——查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章