Arthas能解決什麼問題?

2020-12-26 OFweek維科網

轉載本文需註明出處:微信公眾號EAWorld,違者必究。

什麼是Arthas

Java 診斷利器 Arthas,是阿里的一款開源工具。Github-alibaba/arthas 上可以看到它的介紹。

在日常開發中,當我們發現應用的某個接口響應比較慢,這個時候想想要分析一下原因,找到代碼中耗時的部分,比較容易想到的是在接口鏈路的 IO 操作上下遊列印時間日誌,再根據幾個時間點的日誌算出耗時長的 IO 操作。這種方式沒有問題,但是加日誌需要發布,既繁瑣又低效,這個時候可以引入一些線上 debug 的工具,arthas 就是很好的一種,除了分析耗時,還可以列印調用棧、方法入參及返回,類加載情況,線程池狀態,系統參數等等,其實現原理是解析 JVM 在作業系統中的文件,大部分操作是只讀的,對服務進程沒有侵入性,因此可以放心使用。

Arthas能解決什麼問題?

從我個人的使用經驗來看,Arthas至少幫我解決了以下幾個問題:

監控某方法查看其整個調用鏈路,從而找出某次調用的性能瓶頸。

反編譯某個類,查看線上的代碼是否與本地代碼一致,避免沒有提交代碼而導致的問題。

站在全局視角查看整個系統的運行情況,比如觀察內存增長、GC的情況。

在微服務架構背景下,通常本地沒有完整的環境,此時可以直接在測試環境監控某個方法傳入的參數是否正確,返回值是否正確。

快速開始

下載並啟動arthas

輸入以下命令啟動arthas程序

curl -O https://arthas.aliyun.com/arthas-demo.jarjava -jar arthas-demo.jar

選擇需要監控應用的進程編號,回車後Arthas會attach到目標進程上,並輸出日誌:

容器中使用

docker exec -it arthas-demo /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"

甚至我們可以直接把arthas放到容器鏡像文件中:

COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

Arthas常用命令

下面簡要為大家介紹一下Arthas常用的幾個命令。

dashboard

使用dashboard命令會顯示以下信息:

1. 當前最繁忙的一些線程

2. 顯示應用當前使用的內存信息,包括堆內存、新生代伊甸區、老年代、非堆內存的使用情況。

3. 顯示程序的GC情況,包括YGC次數、總花費時間,FGC的次數、總花費時間。

4. 當前程序的一些信息,包括系統版本、JDK版本、程序運行時長等。

Thread

查看當前線程信息,查看線程的堆棧

// 查看 CPU 使用率 top n 的線程的棧,當前最忙的前 n 個線程:thread -n 3// 查看 5 秒內的 CPU 使用率 top n 的線程棧:thread -n 3 -i 5000

// 查看線程是否有阻塞:thread -b

watch

有時候我們不太方便進行本地調試,這個時候可以使用watch監控某個方法,然後點擊相關的功能,查看該方法的調用情況:

watch com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool "{params,returnObj}" -x 2

執行以上命令後,控制臺會hold在被監控的方法上,此時再次點擊頁面上的按鈕,控制臺就會列印此次的調用結果。

trace

trace 命令能主動搜索 class-pattern/method-pattern 對應的方法調用路徑,渲染和統計整個調用鏈路上的所有性能開銷和追蹤調用鏈路。通常我們用這個方法可以看到整個調用路徑的耗時,從而找出真正的性能瓶頸,幫助解決問題。

trace com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool

tt

tt方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測,使用方法如下:

tt -t com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool

執行此命令後,arthas會記錄下指定方法的每次調用環境現場,並列印一些相關的信息,如調用時長、是否正常返回、是否拋出異常等。

顯示所有被記錄的調用列表

tt -l

重做一次調用。tt 命令由於保存了當時調用的所有現場信息,所以我們可以自己主動對一個 INDEX 編號的時間片自主發起一次調用,從而解放你的溝通成本。此時你需要 -p 參數。通過 --replay-times 指定 調用次數,通過 --replay-interval 指定多次調用間隔(單位ms, 默認1000ms)

tt -i 1001 -p --replay-times 3 --replay-interval 3000

jad

jad 命令將 JVM 中實際運行的 class 的 byte code 反編譯成 java 代碼,便於你理解業務邏輯;反編譯出來的源碼是帶語法高亮的,閱讀更方便。當我們看到某個方法的調用時長明顯過長,或者時空隧道中某方法拋出異常,這個時候就可以直接反編譯相關的方法,看看是否能找出原因。

其他

除了以上很常用的命令以外,arthas還有很多實用命令,大家可以參考官方文檔來使用

另外,每一個命令都支持-help參數,可以查看該命令的說明、參數,甚至包括了使用例子,可以說是非常貼心了

案例

案例1

我們準備了一個簡單的springboot應用,應用內有一個Controller,返回一個字符串,代碼如下:

@RestControllerpublic class DemoController {

@GetMapping(value = "/getDemo")public String getDemo(){return "demo 1";    }}

啟動程序,訪問剛剛準備好的controller得到了下面的結果

接下來我們要嘗試在沒有源碼的情況下修改demo controller的返回值,並在不重啟應用的情況下,使我們修改的返回值生效。

首先啟動arthas並織入到剛才的demo,然後反編譯DemoController到臨時文件夾。

jad --source-only com.example.arthas.DemoController >  /tmp/DemoController.java

接下來我們用vim修改反編譯出來的代碼

查詢加載原有DemoController類的ClassLoader

sc -d com.example.arthas.DemoController

重新編譯修改後的類

mc -c 685f4c2e /tmp/DemoController.java

重新加載修改後的類

redefine -c 685f4c2e /opt/arthas/demo/com/example/arthas/DemoController.class

此時,無需重啟應用,我們重新訪問剛才的controller,會發現返回結果已經成功更改了。

案例2

某燃氣系統由於被眾多地區的燃氣公司所使用,所以版本繁多,經歷過很多輪的測試,其中比較耗時的當屬性能測試了。以往性能測試工作通常耗時很長,主要是性能測試人員並不一定熟悉項目代碼,導致壓力測試出現問題的時候不容易找到問題的所在。

在本次的表具接口的性能測試中,我們使用Arthas工具進行故障的快速定位,大幅減少了性能測試的時間,達到了很好的效果。

本次壓力測試的過程中我們發現,當並發達到一定數量的時候系統會卡死,大量新的請求會超時。使用dashboard查看發現系統的大量線程處於block或者wating中。

使用trace命令,將壓力測試的方法進行監控,並保存到日誌文件中,接著重新跑一輪壓力測試。

trace -n 150000 com.towngas.tcis.interfaces.nb.NbInfoServlet getService >> tt-2020-10-17-NbServlet-getService

監控日誌,當用戶數達到500+的時候果然發現了問題

繼續使用trace命令跟蹤,發現了可能出現問題的方法

使用jad命令反編譯該代碼可以看到HttpClient並沒有被立即關閉,使用release的釋放後關閉通常沒有問題,但是釋放資源有一個過程通常是180秒,所以如果短時間有大量接口調用,會導致打開的socket連接數量超過系統設定值。找到原因後問題得以順利解決,壓力測試得以順利完成。

小結

本次的分享為大家介紹了Arthas的基本概念與基礎的使用方法。更為詳細的使用方法、命令的更多參數,還請查看Arthas的官方文檔。

關於作者:李雲濤,普元高級開發工程師,擅長性能調優、微服務、容器、消息隊列等技術。先後參與郵儲銀行Java開發平臺、中移總ERP流程平臺、中煤信息技術中臺等平臺的的架構設計與平臺研發工作。

相關焦點

  • 無法解決問題的痛苦,根源是什麼?
    有人說:人生就是一個不斷遇到問題,不斷解決問題的過程。有這樣一個故事:一個小夥子愁眉不展的呆在咖啡館的角落裡。這時,一位老人走了過來,問道:「年輕人,遇到什麼困難了嗎?跟我這個老頭子說說,說不定能幫助你。」小夥子漠然的看了老人一眼,說:「我遇到的問題太多了,任何人都幫不了我。」老人接著說:「你現在有時間嗎?
  • 什麼稅收優惠政策既能解決增值稅又能解決企業所得稅問題呢?
    難道就眼睜睜的看著那麼高的稅率,投資人創業經營也是非常不容易的,平常面對業務上的公司經營上的問題都已經夠煩了,那麼公司內部的問題就不應該還那麼的拖著,抓緊時間尋找合理的方式方法解決,在當下的形式把錢全部放進自己的口袋才是蕞讓人放心的。那麼如何來解決沒有進項,所得稅高的問題呢?採取什麼樣的方式才能儘可能的合理合法的少繳稅呢?請先了解了解總部經濟稅收優惠政策之個人獨資企業的核定徵收政策,就明白了。
  • 做能解決實際問題的研究
    我們要靜下心來,甘心坐冷板凳,踏踏實實把問題解決,取得實實在在的成果。導向太重要了。」中國工程院院士、天津中醫藥大學校長張伯禮在接受科技日報記者採訪時提到的這兩個字,就是「實效」。日前,《中共中央關於制定國民經濟和社會發展第十四個五年規劃和二〇三五年遠景目標的建議》(以下簡稱《建議》)全文發布。
  • 早睡,能解決絕大多數問題
    02早睡,讓你身體健康人在年輕的時候,在身體沒有出問題的時候,總會以為自己身體很健康,疾病只會關顧別人。熬一次夜,也許你感覺不到會有什麼,熬兩次夜你也不會有什麼不適,可是當數十次,數百次,熬夜對身體的細微傷害,一次次累加,就變成了不可小覷的傷害。健康不是一切,但是失去它就意味著失去了一切。懂得早睡,拒絕熬夜,是對你的身體負責,也是在對你的人生負責。
  • 幾十年的戰機能靠保養解決問題嗎?能給飛機續續命,問題無法解決
    資料圖戰鬥機是奪取制空權的重要力量,對於任何一個國家的空軍來說,維持其戰鬥機的機況都是非常重要的事情,不僅需要保證飛機的飛行狀態良好,還需要隔一段時間就換裝新款戰鬥機才能不被敵人的戰鬥機比下去,在空戰當中奪得優勢,但是有些國家往往軍費不足,那麼能不能通過保養來解決服役了三十幾年的飛機產生的問題呢
  • 導熱矽膠片能解決什麼問題?其優點有哪些?
    在產品設計的初期,應在產品結構設計中加入導熱矽膠片,要求導熱矽膠片能很好地解決產品的導熱問題,符合產品設計,安裝方便。1、如果選擇散熱器方案,則可以使用其他導熱材料,如導熱雙面膠帶和導熱矽脂。但雙面膠的導熱性相對較差,導熱矽脂不具備減震和抗壓能力,可選用導熱性好、散熱效果好、操作方便的輕質導熱矽膠片。
  • 小管家,也能解決大問題
    小管家,也能解決大問題 2020-12-14 17:18 來源:澎湃新聞·澎湃號·政務
  • 坦誠清晰,能解決90%的溝通問題
    我給她提了一個建議,反正老姐都是要買的,每年自己看中的禮物,截好圖讓發過去,一來她能買對,二來你也中意,皆大歡喜,老娘聽了眼前一亮,連連點頭稱是。我又逗她「你為啥不肯最早修身的羊絨呢不喜歡,你怕什麼?怕姐姐覺得麻煩,或者是生氣?」可能老娘是有這樣的擔心,但我敢肯定我老姐絕對不會有這種心思。你看,僅僅是幫老娘表達她的真實想法,就解決了頭疼的問題。
  • 痤瘡是什麼?怎麼解決痤瘡問題?
    怎麼解決這些問題?其實他們有一個「正經」的名字---痤瘡。打開百度APP,查看更多高清圖片1.痤瘡是什麼?2.痤瘡的產生原因?3.如何解決痤瘡問題?-------------------解決辦法初步的大多數痤瘡不需治療注意清潔,注意飲食,注意生活規律。炎症性痤瘡需要在醫生指導下用藥。切記不可自己用手擠,不可到非正規場所處理。
  • 什麼才是解決社會問題的好方式?
    他一語戳破:「非洲資源那麼豐富,怎麼可能是資源的問題?是制度的問題」。如果是制度讓教育落後,教育又影響到社會的進步,那麼當我們把視角放在非洲,什麼才是解決社會問題的好方式呢?前段時間,Lady Gaga 組織的那場「One World,Together at home」的線上公益演出,讓不少人想起了1985年那場轟動全球的「LIVE AID」公益演出。
  • FTP是否能解決跨網段的文件擺渡問題?
    FTP是一種標準的網絡協議,可以用於在網際網路上傳遞文件,它是可以解決不同網段之間數據交換的部分問題的。但是在文件擺渡中,還是存在著一些問題。 4、出現問題難以追溯。由於FTP沒有日誌記錄功能,所有操作行為沒有留痕,所以一旦出現問題,不管是洩露問題還是文件丟失問題等等,都是難以審計和追溯的。 5、速度比較慢。在傳輸大文件時,或者網絡條件較差的情況下,速度是很慢的,影響業務的時效性。 6、需要專人操作。
  • 耳夢中國#採耳能為你解決什麼問題?
    專業採耳技術護理耳朵各種問題。採耳是通過專業技能培訓,使用各種採耳工具,幫助客戶解決耳部護理問題,能通過手法技能使客戶達到身心放鬆、醒腦減壓、助眠養身目的。耳夢採耳解你所憂!
  • 國足頭重腳輕沒有腰,歸化特謝拉能解決什麼問題
    多說一句,就國足目前陣容,頭重腳輕沒有腰,歸化特謝拉真能解決問題?一堆前鋒,沒人串聯,沒人傳球,有什麼用?超級外援沒了,大家一起爭奪超級歸化,換湯不換藥!苦命的大郎。蘇寧反轉歸化特謝拉,是在下一盤很大的模大棋,難道是為明年亞冠,世俱杯?
  • 《瘋狂動物城》沒能解決的兩個問題
    根據專家的說法,毒品合法化的趨勢正是為了解決如今美國日益嚴峻的毒品問題。美國的毒品問題有多嚴重?一是致死人數逐年上升。據統計在1999年至2015年期間,美國有超過56萬人因吸毒而喪生,甚至成為2015年和2016年美國人預期壽命連續兩年下降(半個世紀來首次出現)的主要原因;二是嚴重影響了公共衛生安全以及社會經濟福利。
  • 沉默是金能解決問題嗎
    沉默是金能解決問題嗎?我個人覺得,控制不住情緒要多調整自己心態,多調整一下自己的心理承受能力,多鍛鍊自己的心理素質,對自己控制情緒是有幫助的。如果在情緒要爆發的時候選擇沉默是金可以嗎?我認為,如果在控制情緒的時候能保持沉默是金,這樣能解決問題嗎?能保持沉默是金就能控制住情緒,這樣就能解決問題,所以,在控制不住情緒的時候,保持沉默,讓自己冷靜下來,就是解決問題的最好方式。
  • 《怪物獵人世界冰原》常見問題解決方法分享 dlc有什麼常見問題
    怪物獵人世界冰原dlc有什麼常見問題?冰原的pc版已經正式上線了,很多小夥伴在遊戲中遇到了很多問題,今天小編給大家帶來怪物獵人世界冰原常見問題解決方法分享,快來看一下吧。冰原的pc版已經正式上線了,很多小夥伴在遊戲中遇到了很多問題,今天小編給大家帶來怪物獵人世界冰原常見問題解決方法分享,快來看一下吧。
  • 你生命的問題——能本質地減化為你性的問題,你能繼續解決你的其它問題,但你永不能解決...
    因為痛苦的人是迷茫的,痛苦的人不會自我肯定,他是自責的,感到他一定是做錯了什麼事。一個痛苦的人沒有根基:你能把他從這裡推到那裡:它能非常容易地被變成無用的人。一個痛苦的人總是準備好去受支配,去被命令,去被加以訓練。因為他知道:「在我而言只剩下痛苦。也許其他人能訓練我的人生?」它已準備好去犧牲。第五,讓他們之間儘可能地疏遠。
  • 有錢能解決80%的婆媳問題
    最近,朋友小魚的婚姻亮起了紅燈,原因很簡單,婆媳問題。因為搞不定婆婆想離婚的,小魚不是第一個,也不是最後一個。小魚從一結婚,就跟婆婆一起住。一開始覺得婆婆還挺好,直到後來生了孩子,全職在家裡,婆婆雖然沒有明說,但是態度頓時就變了。月子裡的照顧,就只是做個月子餐,帶孩子、做家務什麼的幾乎不管,每天到了下午,固定的要去打麻將。
  • 私域流量池能幫我們解決什麼問題?
    什麼是「私域流量池」?提到「私域流量池」,每個人的理解都不太了解一樣,有的人把它理解成一種新的流量方式,有的人把它理解成一個企業用戶池。我們給「私域流量池」做了這樣一個企業比較寬泛的界定:私域流量的本質問題不是流量,而是根據用戶的精細化運營。私域流量池裡的用戶是自己的,可以通過反覆進行利用,可以提供免費觸達。
  • 失眠的人,麻醉一下能解決問題嗎?
    失眠的人,麻醉一下能解決問題嗎?作為麻醉醫生,經常能看到門診病人因做了一個無痛胃鏡而感到無比舒服的情景。這是因為,這個麻醉讓她們體驗到了久違的睡眠舒適感。做醫生之前,我也曾體驗過睡到自然醒、太陽刺眼後醒來的那種舒服。然而,恍然間十幾年過去,我幾乎忘記了那是一種什麼感覺。直到看到病人在麻醉醒來後的伸腰、打哈切,我才能稍稍回憶起一點點那種感覺。那種場景,真是太羨慕人了。