.NET Core dump 分析

服務(wù) CPU 或 內(nèi)存偶爾飆高是部署環(huán)境中經(jīng)常遇到的問題握联,一般會采用記錄日志的方式來診斷洞翩,不過有些情況靠日志可能并不能分析出個所以然,面對實在無頭緒的問題也只能暫時使用重啟大法先恢復(fù)。

為了盡可能精準的定位問題首懈,掌握通過 dump 分析服務(wù)運行堆棧信息也是非常必要的,本文將分別介紹如何對 .NET Core 2.2 和 .NET Core 3.1 項目進行 dump 分析(這里只針對 Linux 下使用容器部署的方式)谨敛。

創(chuàng)建 dump 文件

在創(chuàng)建 dump 文件之前究履,最好先查看具體是服務(wù)中哪些線程引發(fā)的異常,然后針對特定線程進行分析脸狸,不然全掃一遍將是一件非常耗時的工作最仑。

進入容器后,安裝 htop:

apt-get update
apt-get install htop

通過 htop 查看資源使用情況:

以上是測試程序模擬的狀況炊甲,可知 PID 12 是需要關(guān)注的線程

執(zhí)行以下命令即可創(chuàng)建 dump 文件(這里以 2.2.8 為例泥彤,另外可通過 createdump --help 查看更多參數(shù)設(shè)置,容器內(nèi)默認 dotnet 進程對應(yīng) pid 均為 1):

/usr/share/dotnet/shared/Microsoft.NETCore.App/2.2.8/createdump 1

命令執(zhí)行完成后卿啡,將生成 dump 文件 /tmp/coredump.1吟吝,我們需要通過 docker cpkubectl cpcoredump.1 文件復(fù)制到主機目錄下,然后下載到用于 dump 分析的機器上颈娜。

注意:在 Docker 部署模式下剑逃,createdump 命令執(zhí)行需要有容器特權(quán),所以在容器啟動時需要加 --privileged = true 參數(shù)官辽。另外 dump 文件生成需要使用較大內(nèi)存蛹磺,需適當調(diào)整容器內(nèi)存限制參數(shù)。

.NET Core 2.2

目前大多使用 lldb 進行分析同仆,但從零開始搭建環(huán)境實在有些折騰萤捆,不推薦。網(wǎng)上已有封裝好的鏡像可直接使用,如:6opuc/lldb-netcore 俗或,6opuc/lldb-netcore 默認是基于 .NET Core SDK 2.2.8 構(gòu)建的鏡像市怎,如果當前要 dump 的服務(wù) .NET Core 版本非 2.2.8,則需要修改 lldb-netcore 源碼 重新構(gòu)建鏡像蕴侣。

執(zhí)行以下命令進入 lldb:

docker run --rm -it -v /root/coredump.1:/tmp/coredump 6opuc/lldb-netcore

查看當時運行的線程:

clrthreads -live

指定需要分析的線程編號(PID 12 的線程對應(yīng)的 16 進制為 c焰轻,所以找到 OSID 為 c 的記錄,對應(yīng)編號為 7【第一列】

thread select 7

查看當前線程在托管代碼中的堆棧信息

clrstack

更多命令可通過執(zhí)行 soshelp 查看

.NET Core 3.1

.NET Core 3 開始昆雀,官方已提供 dotnet-dump 工具進行 dump 分析辱志,使用起來也相對簡單,當然我們依然可以繼續(xù)使用 lldb 的方式狞膘。

安裝 dotnet-dump

dotnet tool install --global dotnet-dump --version 3.1.141901

進入分析

dotnet-dump analyze /root/coredump.1

如果出現(xiàn)以下錯誤揩懒,說明 .NET Core SDK 沒有安裝到 /usr/shard/dotnet 路徑下,可通過 DOTNET_ROOT 單獨指定或重新安裝挽封。

查看正在運行的托管線程:

clrthreads

如果出現(xiàn)以下錯誤已球,是因為當前安裝的 .NET Core SDK 版本與容器內(nèi) createdump 使用的 SDK 版本不一致(如:createdump 使用 3.1.3,分析使用 3.1.12)辅愿。

也可根據(jù)輸出鏈接前往查看更多解決方案 https://go.microsoft.com/fwlink/?linkid=2135652

方式1:

dotnet-dump analyze /root/coredump.1 -c "setsymbolserver -ms"

方式2:

dotnet-dump analyze /root/coredump.1
setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.21

指定當前需要分析的線程 DBG

setthread 7

查看當前線程在托管代碼中的堆棧信息

clrstack

更多 dotnet-dump 命令請查看:https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump#analyze-sos-commands

案例說明

以下是生產(chǎn)環(huán)境中遇到的一個具體案例智亮,有一服務(wù)運行一段時間就會出現(xiàn) CPU 100%,而且也降不下來点待,如下監(jiān)控:

通過鎖定異常線程后阔蛉,多次 dump 并對堆棧信息進行分析,發(fā)現(xiàn)出問題時都和以下代碼相關(guān):

這里使用了一個表達式計算的開源組件 NCalc 癞埠,初步判斷可能是表達式本身的不合法引起的循環(huán)解析状原,通過 dumpobj 對方法參數(shù)的查看,發(fā)現(xiàn)都是很正常的表達式苗踪,所以猜測并不成立颠区。

繼續(xù)在 Github 項目中的 issues 進行查找可能存在的類似問題,發(fā)現(xiàn)在較早版本中通铲,確實存在卡死的現(xiàn)象 https://github.com/sklose/NCalc2/issues/22 毕莱,這個問題在新版本中已修復(fù),而我們出問題的這個服務(wù)使用的 NuGet 包確實是比較老的一個版本颅夺,所以問題基本上可以定位朋截,在經(jīng)過 NuGet 包版本升級后,這種現(xiàn)象終于消失了碗啄。

總結(jié)

實際在遇到棘手問題的時候,可能經(jīng)常毫無頭緒稳摄,太多問題都不是那么容易定位的稚字。在構(gòu)建服務(wù)支持業(yè)務(wù)能力的同時,要注意代碼本身的健壯性,在使用外部組件時胆描,需要多關(guān)注其生態(tài)情況瘫想,dump 分析只是一種協(xié)助解決問題的手段。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昌讲,一起剝皮案震驚了整個濱河市国夜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌短绸,老刑警劉巖车吹,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異醋闭,居然都是意外死亡窄驹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門证逻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乐埠,“玉大人,你說我怎么就攤上這事囚企≌筛溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵龙宏,是天一觀的道長棵逊。 經(jīng)常有香客問我,道長烦衣,這世上最難降的妖魔是什么歹河? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮花吟,結(jié)果婚禮上秸歧,老公的妹妹穿的比我還像新娘。我一直安慰自己衅澈,他們只是感情好键菱,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著今布,像睡著了一般经备。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上部默,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天侵蒙,我揣著相機與錄音,去河邊找鬼傅蹂。 笑死纷闺,一個胖子當著我的面吹牛均芽,可吹牛的內(nèi)容都是我干的昔期。 我是一名探鬼主播六剥,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸执,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浸卦?” 一聲冷哼從身側(cè)響起署鸡,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎限嫌,沒想到半個月后靴庆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡萤皂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年撒穷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裆熙。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡端礼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出入录,到底是詐尸還是另有隱情蛤奥,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布僚稿,位于F島的核電站凡桥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚀同。R本人自食惡果不足惜缅刽,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢络。 院中可真熱鬧衰猛,春花似錦、人聲如沸刹孔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽髓霞。三九已至卦睹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間方库,已是汗流浹背结序。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纵潦,地道東北人徐鹤。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓配喳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凳干。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容