走完线上 BUG 定位最后一公里
一個(gè)小故事
周末12點(diǎn)的鬧鐘在回龍觀均價(jià)3000的出租屋急促的響起,程序員小A慵懶的拿過手機(jī),滑開手機(jī)通知欄,沒有未接電話,點(diǎn)開手機(jī)的攔截信箱,沒有報(bào)警短信,昨晚的發(fā)布一定很順利。小A幸福的伸了個(gè)懶腰。戴上3000塊的BeatsSolo Pro,音樂逐漸響起來,小A緩緩的閉上了眼睛,正午的陽光從窗戶漫進(jìn)來,撒在小A稀疏的頭發(fā)上。此時(shí)的小A正在腦海中勾勒著自己美好的未來。房東說:十年前住在這間屋的小B,現(xiàn)在已經(jīng)是某度的T10 大佬,五年前住在這兒的小T,現(xiàn)在已經(jīng)在某條帶領(lǐng)200人的團(tuán)隊(duì),想到這兒,小A的嘴角微微上揚(yáng),那我也一定不會太差吧~
嘀嘀..耳機(jī)里傳來兩聲消息提示音,小A心里咯噔一聲,刺骨的寒意彌漫開來,北京三月的陽光突然就不暖了。小A用力的微微睜開雙眼,通知欄測試同學(xué)小C的頭像一閃而過。
xx線上BUG緊急修復(fù)群
小C: “@小A 昨晚上線的代碼好像有點(diǎn)有問題,來公司看下?我在公司等你。”
點(diǎn)開群設(shè)置,老板的頭像赫然在列。
懷著愧疚、徘徊、悔恨、無奈、憤怒的心情,小A翻身穿上他在路邊買的價(jià)值20元的人字拖,坐上了前往西二旗的地鐵十號線。
不久,西二旗某辦公室傳來了亙古不變的對話,“這段代碼測試過,在我電腦上沒問題啊”、"你重啟下試試"、“是不是代碼沒上線”、“是不是誰把我代碼沖掉了”、“你們測試數(shù)據(jù)是不是有問題呀”……于是一個(gè)下午過去了、一個(gè)晚上過去了、一個(gè)周末過去了、一個(gè)程序員的青春過去了、一個(gè)程序員本就不長的職業(yè)生涯過去了。
一個(gè)小總結(jié)
上面這個(gè)虛構(gòu)的小故事只是想說明一個(gè)簡單的現(xiàn)象,程序員的很多時(shí)間被線上bug fix占據(jù)。因?yàn)榫€上線下環(huán)境不一致、輸入輸出不一等等原因,很多bug定位起來效率低下,耗時(shí)巨長,導(dǎo)致很多時(shí)候程序員遇到線上bug總是頭疼不已,不由自主的想要甩鍋給外在因素,在確定是自己的問題的時(shí)候再排查問題。那么線上問題排查到底難在哪兒?首先來看看我們排查線上問題的一個(gè)基本步驟,這個(gè)步驟一般是排查大多數(shù)線上問題的步驟。
步驟1:找到能復(fù)現(xiàn)問題的輸入;
步驟2:判斷該輸入能否在日常環(huán)境構(gòu)造, 如果能,調(diào)到步驟5。如果不能,繼續(xù)步驟3;
步驟3:查看線上環(huán)境日志,看能否找到異常輸入相關(guān)的異常日志,輔助排查問題;
步驟4:初步推斷問題原因,嘗試修復(fù)并加上更多日志輸出。然后打包、發(fā)布。重復(fù)步驟3直到定位根因;
步驟5:日常構(gòu)造相同輸入,單點(diǎn)調(diào)試,定位問題;
實(shí)際的場景中,因?yàn)榫€上線下環(huán)境隔離的問題,線上的輸入很多時(shí)候難以在日常環(huán)境中構(gòu)造,大多數(shù)時(shí)候我們都在步驟2、3、4中循環(huán),于是時(shí)間就在循環(huán)中慢慢的流逝了。
上面做這么多步驟其實(shí)對于查問題而言就是希望可以知道當(dāng)某段代碼執(zhí)行不符合預(yù)期的時(shí)候,這段代碼的輸入是什么,輸出是什么,拋出了什么異常,以及代碼中每一行的具體執(zhí)行情況。那么是否有一款產(chǎn)品可以讓用戶方便快捷的實(shí)現(xiàn)這個(gè)目標(biāo)呢?答案是有的。
聊一聊ARMS
阿里云的應(yīng)用實(shí)時(shí)監(jiān)控服務(wù)ARMS是一款應(yīng)用性能管理(APM)產(chǎn)品,包含應(yīng)用監(jiān)控、Prometheus監(jiān)控和前端監(jiān)控三大子產(chǎn)品,涵蓋分布式應(yīng)用、容器環(huán)境、瀏覽器、小程序、APP 等領(lǐng)域的性能管理,能幫助用戶實(shí)現(xiàn)全棧式性能監(jiān)控和端到端全鏈路追蹤診斷。
ARMS最新推出了Arthas診斷功能,其第一個(gè)版本主要包含四個(gè)能力,分別是JVM概覽、線程耗時(shí)分析、方法執(zhí)行分析以及性能分析:
- JVM概覽:查看實(shí)時(shí)的JVM內(nèi)存、GC信息以及操作系統(tǒng)信息、環(huán)境變量、系統(tǒng)變量等信息。
- 線程耗時(shí)分析:查看實(shí)時(shí)的線程耗時(shí)情況,并可查看每個(gè)線程實(shí)時(shí)的方法堆棧。
- 方法執(zhí)行分析:實(shí)時(shí)的抓取滿足指定條件的方法執(zhí)行明細(xì)、出入?yún)?shù)以及異常。
- 性能分析:快捷的通過火焰圖的的形式,展示系統(tǒng)性能瓶頸。
ARMS的Arthas功能使用起來也比較簡單,詳情可參照文檔。下面來簡單聊一聊如何利用ARMS的Arthas診斷能力來進(jìn)行線上問題的定位。
聊一聊ARMS Arthas診斷
上一節(jié)簡單介紹了下ARMS的Arthas診斷具備的能力,那么用這些能力能解決哪些線上問題呢?在這里,我們對線上問題進(jìn)行了一個(gè)歸納總結(jié),將其分為下面四類問題:
- 方法執(zhí)行不符合預(yù)期:包括方法執(zhí)行耗時(shí)、方法返回值、方法拋出了異常等情況,表現(xiàn)在應(yīng)用上可能是一些接口或者服務(wù)的RT增高,錯(cuò)誤率增高,返回值異常等。
- 進(jìn)程CPU耗時(shí)突增:一般有代碼死循環(huán)問題、FullGC導(dǎo) GC線程耗時(shí)高、并發(fā)使用HashMap等。
- 性能優(yōu)化問題:主要用于分析性能瓶頸,輔助性能優(yōu)化,包括 CPU 耗時(shí)、內(nèi)存分配、鎖競爭、itimer 等情況的性能分析。
- 其他問題:比如初始化環(huán)境變量讀取錯(cuò)誤、內(nèi)核版本不符合要求、類沖突等問題。
下面就以一個(gè)實(shí)際的demo來演示如何利用ARMS的Arthas來進(jìn)行方法執(zhí)行不符合預(yù)期這種問題的診斷,后續(xù)的文章會繼續(xù)介紹如何利用Arthas進(jìn)行其他類型問題的診斷。
利用ARMS Arthas診斷方法執(zhí)行不符合預(yù)期類問題
問題背景:product 應(yīng)用的com.alibabacloud.hipstershop.productserviceapi.service.ProductService@confirmInventory 接口某次發(fā)布后平均 RT 到達(dá) 400,發(fā)布以前的平均 RT 在 1ms 以下,如下圖所示。現(xiàn)在想定位耗時(shí)具體耗在哪兒。?
圖 1
首先,進(jìn)入ARMS Arthas診斷的頁面。當(dāng)我們進(jìn)行BUG定位的時(shí)候,首先需要知道出問題的類名和方法名,按照圖示截圖中的紅色注釋輸入相應(yīng)的類名和方法名。如果你是EDAS用戶,可直接選擇一個(gè)服務(wù)或者接口,后臺會自動推斷相應(yīng)的實(shí)現(xiàn)類和方法。對應(yīng)到本案例,對應(yīng)的類是com.alibabacloud.xxx.xxx.xxx.ProductService,方法是confirmInventory。填寫完畢后點(diǎn)擊確定。
圖 2
如下圖所示,點(diǎn)擊確定后可以得到confirmInventory方法執(zhí)行的紀(jì)錄,包含執(zhí)行的入?yún)?#xff0c;返回值異常以及方法執(zhí)行明細(xì)。
圖 3
但是這次執(zhí)行的耗時(shí)2.89ms,不是我們預(yù)期中的一次耗時(shí)高調(diào)用。此時(shí),可點(diǎn)擊右上角修改診斷參數(shù),設(shè)定抓取耗時(shí)大于300ms的方法調(diào)用(除此以外還可以設(shè)置更多的過濾條件,包括方法參數(shù)滿足的條件等等,具體可查看文檔。
圖 4
點(diǎn)擊確定后,點(diǎn)擊右上角刷新圖標(biāo)再次診斷,這次抓取到一次耗時(shí)1501ms的方法調(diào)用,發(fā)現(xiàn)原來是在該方法的執(zhí)行過程中,執(zhí)行了Thread.sleep() 方法。
圖5
到這里,你可能還會好奇,為什么會執(zhí)行sleep方法呢?這塊代碼的邏輯是怎樣的呢?點(diǎn)擊右上角查看方法源碼,一目了然的將方法源碼與方法執(zhí)行明細(xì)相結(jié)合。如下圖所示,confirmInventory方法中執(zhí)行的每一次方法調(diào)用最后會以“//-”為前綴展示該方法執(zhí)行的耗時(shí)情況。
圖 6
此外,你還可以點(diǎn)擊圖5 ,列表最右側(cè)的操作列的下鉆,快捷的進(jìn)一步分析confirmInventory調(diào)用的子方法的執(zhí)行情況。這在根因比較深的場景下十分方便好用。
至此,完成了我們這個(gè)問題的一個(gè)定位演示。
相信ARMS的Arthas診斷功能一定給你留下了深刻的印象,也一定會成為您線上問題診斷的利器,幫助您更快更方便的診斷線上故障。
寫在最后
點(diǎn)此快速免費(fèi)體驗(yàn)ARMS功能。此外,企業(yè)級分布式應(yīng)用服務(wù)EDAS K8s作為一款一體化的產(chǎn)品,既具備了應(yīng)用的托管能力,也集成了ARMS的監(jiān)控診斷能力,同樣可以體驗(yàn)ARMS的Arthas診斷功能,可根據(jù)您目前的實(shí)際情況選擇一款產(chǎn)品來體 ARMS的Arthas診斷能力。
備注:上述功能目前僅對部署在K8s為集群中的Java應(yīng)用有效,后續(xù)會支持部署的ECS上的Java應(yīng)用。
原文鏈接:https://developer.aliyun.com/article/783669?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的走完线上 BUG 定位最后一公里的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机淘宝轻店业务 Serverless
- 下一篇: 饿了么EMonitor演进史