arthas 查看哪个方法调用最耗时_阿里巴巴问题排查神器Arthas使用实践
Apache Dubbo是Alibaba開源的高性能RPC框架,在國內有非常多的用戶。
- Github:https://github.com/apache/incubator-dubbo
- 文檔:http://dubbo.incubator.apache.org/zh-cn/
Arthas是Alibaba開源的應用診斷利器,9月份開源以來,Github Star數三個月超過6000。
- Github:https://github.com/alibaba/arthas
- 文檔:https://alibaba.github.io/arthas/
當Dubbo遇上Arthas,會碰撞出什么樣的火花呢?下面來分享Arthas排查Dubbo問題的一些經驗。
dubbo-arthas-demo
下面的排查分享基于這個dubbo-arthas-demo,非常簡單的一個應用,瀏覽器請求從Spring MVC到Dubbo Client,再發送到Dubbo Server。
Demo里有兩個spring boot應用,可以先啟動server-demo,再啟動client-demo。
- https://github.com/hengyunabc/dubbo-arthas-demo
Client端:
Server端:
Arthas快速開始
- https://alibaba.github.io/arthas/install-detail.html
啟動后,會列出所有的java進程,選擇1,然后回車,就會連接上ServerDemoApplication
Dubbo線上服務拋出異常,怎么獲取調用參數?
- https://alibaba.github.io/arthas/watch.html
當線上服務拋出異常時,最著急的是什么參數導致了拋異常?
在demo里,訪問http://localhost:8080/user/0,UserServiceImpl就會拋出一個異常,因為user id不合法。
在Arthas里執行 watch com.example.UserService * -e -x 2 '{params,throwExp}' ,然后再次訪問,就可以看到watch命令把參數和異常都打印出來了。
怎樣線上調試Dubbo服務代碼?
- https://alibaba.github.io/arthas/redefine.html
在本地開發時,可能會用到熱部署工具,直接改代碼,不需要重啟應用。但是在線上環境,有沒有辦法直接動態調試代碼?比如增加日志。
在Arthas里,可以通過redefine命令來達到線上不重啟,動態更新代碼的效果
比如我們修改下UserServiceImpl,用System.out打印出具體的User對象來:
本地編繹后,把
server-demo/target/classes/com/example/UserServiceImpl.class
傳到線上服務器,然后用redefine命令來更新代碼:
這樣子更新成功之后,訪問 http://localhost:8080/user/1,在ServerDemoApplication的控制臺里就可以看到打印出了user信息。
怎樣動態修改Dubbo的logger級別?
- https://alibaba.github.io/arthas/ognl.html
- https://alibaba.github.io/arthas/sc.html
- https://commons.apache.org/proper/commons-ognl/language-guide.html
在排查問題時,需要查看到更多的信息,如果可以把logger級別修改為DEBUG,就非常有幫助。
ognl是apache開源的一個輕量級表達式引擎。下面通過Arthas里的ognl命令來動態修改logger級別。
首先獲取Dubbo里TraceFilter的一個logger對象,看下它的實現類,可以發現是log4j。
再用sc命令來查看具體從哪個jar包里加載的:
可以看到log4j是通過slf4j代理的。
那么通過org.slf4j.LoggerFactory獲取root logger,再修改它的level:
可以看到修改之后,root logger的level變為DEBUG。
怎樣減少測試小姐姐重復發請求的麻煩?
- https://alibaba.github.io/arthas/tt.html
在平時開發時,可能需要測試小姐姐發請求過來聯調,但是我們在debug時,可能不小心直接跳過去了。這樣子就尷尬了,需要測試小姐姐再發請求過來。
Arthas里提供了tt命令,可以減少這種麻煩,可以直接重放請求。
上面的tt -t命令捕獲到了3個請求。然后通過tt --play可以重放請求:
Dubbo運行時有哪些Filter? 耗時是多少?
- https://alibaba.github.io/arthas/trace.html
Dubbo運行時會加載很多的Filter,那么一個請求會經過哪些Filter處理,Filter里的耗時又是多少呢?
通過Arthas的trace命令,可以很方便地知道Filter的信息,可以看到詳細的調用棧和耗時。
Dubbo動態代理是怎樣實現的?
- https://alibaba.github.io/arthas/jad.html
- com.alibaba.dubbo.common.bytecode.Wrapper
通過Arthas的jad命令,可以看到Dubbo通過javaassist動態生成的Wrappr類的代碼:
獲取Spring context
除了上面介紹的一些排查技巧,下面分享一個獲取Spring Context,然后“為所欲為”的例子。
在Dubbo里有一個擴展
com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory,把Spring Context保存到了里面。
因此,我們可以通過ognl命令獲取到。
- SpringExtensionFactory@contexts.iterator.next 獲取到SpringExtensionFactory里保存的spring context對象
- #context.getBean("userServiceImpl").findUser(1) 獲取到userServiceImpl再執行一次調用
只要充分發揮想像力,組合Arthas里的各種命令,可以發揮出神奇的效果。
文章來源:https://dwz.cn/5Vjkc9hh
作者: 云棲社區
總結
以上是生活随笔為你收集整理的arthas 查看哪个方法调用最耗时_阿里巴巴问题排查神器Arthas使用实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 整数逆位运算_Python
- 下一篇: java二重循环计数_java的二重循环