日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java在線問題排查利器之Btrace&Greys

瀏覽:164日期:2022-09-05 13:45:25
1. 前言

前段時間升級了urs新的遠程cookie校驗模式。功能上線后,發現涉及用戶cookie 校驗的接口,有時會報接口超時。通過日志埋點方式,確認了與urs提供的jar包內的新驗證方法有關。通過反編譯,看到相關方法執行過程中涉及參數校驗、參數組裝、遠程訪問校驗、本地校驗等步驟,究竟哪個步驟出了問題?

一種方式是讓urs幫忙提供一個新的jar包,在關鍵步驟處加日志,記錄執行時間,另一種方法,就是使用一些在線分析工具。顯然第二種方式更方便快捷。本文主要介紹兩款在線問題排的工具: BtraceGreys

2. 工具簡介

Btrace和 Greys 都比較適合對生成環境的問題進行排查,都屬于“事后工具” ,即服務已經上線了,無法再通過打印日志等方式埋點分析。這時可以使用這些工具,來跟蹤代碼執行耗時、堆棧情況等。

原理

都是基于動態字節碼修改技術(Hotswap)來實現運行時 java 程序的跟蹤和替換。

利用了Java SE 6 新特性Instrumentation 。

使用場景

分析哪些方法慢,查詢具體的故障點; 查看方法的參數、返回值; 查看對象屬性等;

Btrace 和 Greys

Btrace 和 Greys 都屬于工具,本文以實例,介紹如何使用,不再對其本身進行介紹,如果想進一步了解,可以直接去下面的鏈接:

類型 介紹Btrace https://github.com/btraceio/btrace/wikiGreys介紹 https://yq.aliyun.com/articles/2390 3. 實例-使用工具排查問題

urs新提供了遠程cookie的校驗jar包,其中關鍵的方法為遠程調用方法

CookieDecoder.requestDecode(**),我們主要對這個方法進行跟蹤。

3.1 使用Btrace

由于我們的tomcat 在 appuser 用戶下,為了有相應權限,我們的操作都在 appuser 用戶下進行。

大體步驟分為:

下載解壓 btrace 工具; 編寫監控腳本; 設置jdk/btrace 環境變量,上傳腳本,編譯 獲取tomcat 進程號 啟動監控 查看詳情

具體操作:

(1)下載btrace工具 btrace-bin-1.3.9.tgz 并解壓縮

Java在線問題排查利器之Btrace&Greys

(2) 編寫一個監控腳本(java代碼 UrsInterfaceCalls.java),

即需要監控的具體類和方法

@BTrace // 備注1public class UrsInterfaceCalls{/** * 備注2 * 本代碼用于監控 CookieDecoder 中 requestDecode 方法的執行時間,如果執行時間大于 500ms,則打印花費的時間和堆棧 * @param duration */@OnMethod(clazz='com.netease.urs.CookieDecoder',method='requestDecode',location=@Location(Kind.RETURN)) // 備注2 public static void requestDecode( @Duration long duration ) { // 備注3//備注4if(duration /1000000 > 500){println('==CookieDecoder requestDecode spend: ' + duration /1000000 + ' ms');jstack();} }/** * 本代碼用于監控 CustomHttpComponent 中 execute 方法的執行時間,如果執行時間大于 500ms,則打印花費的時間和堆棧 * @param duration */@OnMethod(clazz='com.netease.urs.http.CustomHttpComponent',method='execute',location=@Location(Kind.RETURN)) public static void execute( @Duration long duration ) {if(duration /1000000 > 500){println('==ursCookieHttp doExecute spend: ' + duration /1000000 + ' ms');jstack();} }}

簡要說明

本監控類,寫了兩個監控方法:

一個是監聽CookieDecoder.requestDecode()的執行時間,如果大于 500ms,則打印日志,并打印相關堆棧;

另一個監聽CustomHttpComponent.execute()的執行時間。

備注1:添加注釋 @BTrace ,代表本腳本將使用btrace相關功能;

備注2:攔截方法定義 ,@OnMethod 可以指定 clazz 、 method、location。由此組成了在什么時機(location 決定)監控某個類/某些類(clazz 決定)下的某個方法/某些方法(method 決定)。

@OnMethod(clazz='com.netease.urs.CookieDecoder',method='requestDecode',location=@Location(Kind.RETURN))

意思是監控CookieDecoder.requestDecode() ,在執行結束后(location=@Location(Kind.RETURN) 執行相關操作。

備注3:@Duration 代表方法執行時間,納秒。

備注4:只打印 耗時超過500ms的信息及堆棧,防止記錄打印大多。

方法注解說明

@OnMethod:指定使用當前注解的方法應該在什么情況下觸發: claszz屬性指定要匹配的類的全限定類名,可以用正則表達式; method屬性指定要匹配的方法名稱,可以用正則表達式; type屬性void(java.lang.String)可以用于匹配:public void funcName(String param) 中的方法入參; location屬性用@Location來表明,匹配了clazz,method情況,在方法執行的何時去執行腳本(前,后,異常,行,某個方法調用) @OnTimer:指定一個定時任務 @OnExit:當腳本運行Sys.exit(code)時觸發 @OnError:當腳本運行拋出異常時觸發 @OnEvent:腳本運行時Ctrl+C可以發送事件 @OnLowMemory:讓你指定一個閥值,內存低于閥值觸發 @OnProbe:可以用一個xml文件來描述你想在什么時候觸發該方法

方法參數注解說明

@Self:目標對象本身 @Retrun:目標程序方法返回值(Kind.RETURN) @ProbeClassName:目標類名 @ProbeMethodName:目標方法名 @targetInstance:@Location指定的clazz,method的目標(Kind.CALL) @targetMethodOrField:@Location指定的clazz,method的目標的方法或字段(Kind.CALL) @Duration:目標方法執行時間,單位是納秒,需要與 Kind.RETURN 或者 Kind.ERROR 一起使用

(3)設置jdk/btrace 環境變量

export JAVA_HOME=/home/jdk1.8.0export JRE_HOME=/home/jdk1.8.0/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=$JAVA_HOME/bin:$PATHexport BTRACE_HOME=/home/appuser/bTraceexport PATH=$BTRACE_HOME/bin:$PATH

上傳監控腳本 UrsInterfaceCalls.java 到服務器;

可以用 btracec 進行預編譯,以保證代碼無誤

(4)獲取tomcat的執行進程號 ps aux |grep “/fa.163.com”

Java在線問題排查利器之Btrace&Greys

(5)進入UrsInterfaceCalls.java所在目錄,啟動btrace監控,監聽指定進程號19504(即jvm的進程號)

sh btrace -p 2021 19054 UrsInterfaceCalls.java

-p 2021 :指定一個端口號,防止多個執行導致端口沖突;

19054 :要監聽的進程號

UrsInterfaceCalls.java :監聽腳本

(6)查看結果

如果方法執行超過500ms,會打印日志,同時打印堆棧;

==CookieDecoder requestDecode spend: 525 mscom.netease.urs.CookieDecoder.requestDecode(CookieDecoder.java:64)com.netease.urs.ntescode.validate_cookie_online(ntescode.java:49)com.netease.common.util.CookieUtil.getUserInfoFromUrsRemoteCookie(CookieUtil.java:317)com.netease.lottery.service.util.CookieUtilServiceImpl.getUserInfoFromUrsRemoteCookie(CookieUtilServiceImpl.java:88)com.netease.lottery.service.util.CookieUtilServiceImpl$$FastClassByCGLIB$$1bd66cf1.invoke(<generated>)org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204).......org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1708)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)

如果要定位具體耗時,需要對各個關鍵方法,都添加監控腳本。

3.2 使用Greys

使用greys,無需編寫 腳步,它是命令交互式的,直接輸入命令指定監控的類、方法。

但是每次只能監控一個方法,不能像 Btrace,可以同時監控多個方法。

使用過程大體步驟:

下載解壓 Greys工具,安裝; 設置jdk 環境變量 獲取tomcat 進程號 啟動監控 查看詳情

具體步驟:

(1)下載最新版本的Greys、解壓后,執行安裝命令

sh ./install-local.sh

(2)設置環境變量

export JAVA_HOME=/home/jdk1.8.0export JRE_HOME=/home/jdk1.8.0/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=$JAVA_HOME/bin:$PATH

(3)查詢 jvm的進程號,進入greys安裝目錄,啟動Greys

./greys.sh 10437

10437 為 jvm的進程號

(4)啟動后,就可以通過交互式命令方式,對指定的類、方法進行分析。

使用help 可以看到各種命令。

Java在線問題排查利器之Btrace&Greys

(5)使用 trace命令 跟蹤指定類、方法的執行時間、參數、返回值情況;

使用 help trace,查詢使用方式

Java在線問題排查利器之Btrace&Greys

例如:跟蹤CookieDecoder類中 requestDecode()方法耗時超過500ms 的方法執行情況:

trace -n 2 com.netease.urs.CookieDecoder requestDecode ’#cost>500’

-n 2 :代表只打印2次就退出(防止刷屏,影響性能);

com.netease.urs.CookieDecoder :監聽的類名

requestDecode :監聽的方法名

‘#cost>500’ : 打印條件為 耗時超過 500ms

執行后,會顯示:

ga?>trace -n 2 com.netease.urs.CookieDecoder requestDecode ’#cost>10’Press Ctrl+D to abort.Affect(class-cnt:1 , method-cnt:2) cost in 262 ms.

代表動態修改了一個類,對兩個方法(例如方法重載)進行監控,修改花費262毫秒。

如果出現滿足條件的情況,則我們會看到打印結果:

`---+Tracing for : thread_name='http-nio-8003-exec-8' thread_id=0x7a;is_daemon=true;priority=5; `---+[5283,5283ms]com.netease.urs.CookieDecoder:requestDecode()+---[1,0ms]java.lang.System:nanoTime()+---[2,1ms]org.apache.http.client.methods.HttpPost:<init>(@39)+---[2,0ms]java.lang.StringBuffer:<init>(@41)+---[2,0ms]java.lang.StringBuffer:append(@42)+---[2,0ms]java.net.URLEncoder:encode(@43)+---[2,0ms]java.lang.StringBuffer:append(@43)+---[2,0ms]java.lang.StringBuffer:append(@44)+---[2,0ms]java.lang.StringBuffer:append(@45)+---[2,0ms]java.lang.StringBuffer:append(@46)+---[2,0ms]java.lang.StringBuffer:append(@47)+---[2,0ms]java.lang.StringBuffer:append(@48)+---[2,0ms]java.lang.Integer:<init>(@49)+---[2,0ms]java.lang.Integer:<init>(@49)+---[2,0ms]java.lang.reflect.Method:invoke(@49)+---[2,0ms]java.lang.StringBuffer:append(@49)+---[2,0ms]java.lang.StringBuffer:toString(@50)+---[2,0ms]org.apache.http.entity.StringEntity:<init>(@50)+---[2,0ms]org.apache.http.entity.StringEntity:setContentType(@51)+---[2,0ms]org.apache.http.client.methods.HttpPost:setEntity(@52)+---[2,0ms]org.apache.http.client.methods.HttpPost:getParams(@53)+---[2,0ms]org.apache.http.params.HttpParams:setIntParameter(@55)+---[2,0ms]org.apache.http.params.HttpParams:setIntParameter(@58)+---[5282,5280ms]com.netease.urs.http.CustomHttpComponent:execute(@60)+---[5283,0ms]org.apache.http.HttpResponse:getEntity(@61)+---[5283,0ms]org.apache.http.util.EntityUtils:toString(@62)+---[5283,0ms]com.netease.urs.util.LogUtil:debug(@63)+---[5283,0ms]org.apache.http.client.methods.HttpPost:releaseConnection(@71)+---[5283,0ms]java.lang.System:nanoTime(@64)`---[5283,0ms]com.netease.urs.CookieDecoder:$btrace$com$netease$fa$trace$UrsInterfaceCalls$2$requestDecode(@64)

可以看到,主要耗時在

+---[5282,5280ms]com.netease.urs.http.CustomHttpComponent:execute(@60)

只要一層一層跟蹤下去,就可以最終定位問題。

(6)退出前可以使用 reset 恢復增強類(即被動態修改的代碼)

(7)最后,使用shutdown 關閉greys 并退出

4.總結說明

(1) 相比兩個工具,btrace 需要手寫腳步,每次更新都要重新上傳再執行,而greys 支持命令式交互,無需手寫腳本;

(2)btrace 腳步中,可以寫多個監聽類和方法,但是greys 命令同時只能輸入一個。(但是greys 可以支持多個用戶操作,所如果想同時監控多個方法,只能開多窗口)

(3)btrace 要確保監控腳本的正確性,使用前最好預編譯,防止動態增強后影響在線功能;

(4)監控時,設置合適的條件,例如在 greys實例中,花費時間大于 N ms才輸出,且只打印2個。

(5)greys 中只能顯示1層的方法調用情況,無法直接跟蹤到最底層;只能自己一層一層往下跟進。

來自:http://tech.lede.com/2017/10/11/rd/server/javaToolsBTrace/

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
不卡一区2区| 欧美久久香蕉| 色婷婷亚洲mv天堂mv在影片| 国产精品一级在线观看| 国产精品亚洲欧美一级在线| 国产精品99久久免费观看| 国产精品亚洲欧美| 麻豆精品视频在线| av中文字幕在线观看第一页| 国产精品免费99久久久| 欧美精品91| 中国字幕a在线看韩国电影| 国产成人精品一区二区三区视频| 97精品国产福利一区二区三区| 国产成人精品三级高清久久91 | 日本午夜精品久久久| 青青伊人久久| 久久wwww| 日韩久久精品| 久久久久久久久久久妇女 | 亚洲韩日在线| 国产亚洲网站| 日日夜夜免费精品视频| 国产乱论精品| 国产精品99一区二区三区| 999久久久91| 亚洲欧美日韩综合国产aⅴ| 亚洲2区在线| 麻豆成人在线观看| 色婷婷精品视频| 中文一区二区| 国产日本亚洲| 美女网站视频一区| 国产日韩综合| 狠狠干成人综合网| 日本国产欧美| 国产拍在线视频| 亚洲一区国产| 国产精品videosex极品| 日韩福利一区| 蜜桃一区二区三区在线| 国产精品网在线观看| 韩国久久久久久| 久久最新视频| 高清日韩中文字幕| 美女精品网站| 久久久国产精品入口麻豆| 婷婷激情久久| 久久精品超碰| 欧美aa一级| 亚洲精品乱码| 91看片一区| 青青国产精品| 欧美亚洲激情| 国产精品乱战久久久| 极品日韩av| 欧美国产中文高清| 亚洲欧美日韩在线观看a三区| 欧美黄色精品| 国产精品婷婷| 成人在线视频免费看| 男人操女人的视频在线观看欧美| 久久精品国产在热久久| 亚洲精华国产欧美| 国产精品第一| 久久亚洲风情| 欧美gv在线| 国产伦精品一区二区三区在线播放| 天堂资源在线亚洲| 免费在线观看一区| 一区二区精品| 日韩大片在线观看| 欧美在线看片| 午夜一区在线| 丝袜美腿一区| 国产高清精品二区| 日韩在线卡一卡二| 婷婷成人在线| 日产午夜精品一线二线三线| 午夜在线视频观看日韩17c| 日韩av在线播放网址| 清纯唯美亚洲综合一区| 樱桃成人精品视频在线播放| 六月婷婷综合| 久久精品国产久精国产| 天堂俺去俺来也www久久婷婷| 亚洲香蕉网站| 久久电影tv| 国产高清日韩| 日韩国产欧美在线播放| 日韩午夜免费| 久久精品青草| 国产在线视频欧美一区| 日韩一区网站| 99re国产精品| 日韩欧美综合| 国产精品一区免费在线| 久久亚洲二区| 日韩欧美一区二区三区免费观看| 国产精久久一区二区| 亚洲精品麻豆| 中文精品在线| 伊人成人网在线看| 欧美在线观看视频一区| 私拍精品福利视频在线一区| 福利一区二区三区视频在线观看| 国产高清亚洲| 美女视频黄久久| 欧美激情aⅴ一区二区三区| 亚洲免费福利一区| 国产一级一区二区| 99国产精品99久久久久久粉嫩| 欧美日韩一二三四| 999久久久精品国产| 日韩精品麻豆| 久久久久久免费视频| 日韩精品免费一区二区三区| 日韩精品诱惑一区?区三区| 中文av在线全新| 在线亚洲人成| 日韩欧美另类一区二区| 电影天堂国产精品| 1024精品一区二区三区| 亚洲成人一区| 在线综合视频| 亚洲少妇在线| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲精品第一| 四虎精品一区二区免费| 日韩欧美美女在线观看| 欧美日韩中文| 久久精品一区二区国产| 国产91欧美| 欧美成人a交片免费看| 高清av不卡| 亚洲国产专区| 丝袜诱惑制服诱惑色一区在线观看 | 蜜桃av在线播放| 亚洲特级毛片| 午夜在线精品| 亚洲tv在线| 国产精品久久久免费| 美女久久久久久| 91视频精品| 日本不良网站在线观看| 婷婷成人综合| 日韩影院在线观看| 18国产精品| 精品国产乱码久久久| av亚洲一区二区三区| 伊人久久婷婷| 日韩av一区二区三区四区| 国产精品天天看天天狠| 美女av在线免费看| 亚洲激情社区| 日本精品在线播放| 久久麻豆视频| 国产一区久久| 日韩 欧美一区二区三区| 国产精品a级| 亚洲成av在线| 亚洲精品成人一区| 精品三级av在线导航| 欧美aa国产视频| 日本色综合中文字幕| 精品丝袜久久| 夜夜精品视频| 国产精品magnet| 国内激情久久| 日本强好片久久久久久aaa| 国产成人精品一区二区三区免费| 国产二区精品| 国产日本精品| 欧美一区三区| 日韩美女国产精品| 激情国产在线| 亚欧洲精品视频在线观看| 成人在线视频中文字幕| 久久国产福利| 国产精品国产一区| 亚洲在线观看| 国产一区二区三区不卡视频网站 | 亚洲免费专区| 国产传媒在线观看| 中文字幕亚洲精品乱码| 91一区二区| 日韩精彩视频在线观看| 日韩毛片视频| 日韩精品电影一区亚洲| 女生影院久久| 亚州av日韩av| 久久蜜桃精品| 青青草国产成人99久久| 999国产精品视频| 国产精品久久国产愉拍| 在线一区视频| 久久精品国产精品亚洲毛片| 人人爽香蕉精品| 日本蜜桃在线观看视频| 日韩精品免费视频一区二区三区|