天天看點

coredump 瘦身風雲

coredump 瘦身風雲

繼上一篇非典型程式員青囊搞定

記憶體洩露問題

後,美美地睡了一覺。睡夢中,突然金光閃閃,萬道光芒照進時光隧道,恍惚來到大唐神龍年間。青囊此時化身狄仁傑進階助理,陪同狄老大和元芳及千牛衛來到案發現場,一番勘察後迅速鎖定真兇。雖整日伏于桌前寫代碼,但早被生活馴服得謹小慎微、擅于察言觀色的青囊亦早已悟透了這斷案的奧秘。

隻是,站在一旁的元芳眉頭緊鎖,面露難色......

coredump 瘦身風雲

狄公上前問道:元芳,有心事?

元芳起身答道:“大人斷案如神,隻是像長安這種要案頻繁的地方,每次案發,都要出動上百千牛衛來大面積封鎖現場,走訪上萬群衆,耗費人力不說,還嚴重阻塞交通,影響了正常的生産秩序,導緻其它業務部門受損,一直以來是怨聲載道啊。”

狄公笑了笑,手指向青囊,“囊啊,給你元芳哥show一下”。

青囊一陣馬屁之後,從袋中摸出一羅盤,得意道:“我這乾坤袋喚做sysAk,這羅盤叫minicoredump,以後如何封鎖現場,看它就清楚了”。元芳接過羅盤,順手擺弄了幾下,上面顯示要封鎖的現場縮小了不少,官道也暢通許多。元芳臉色憂轉喜,不禁問道:有此利器,鎖定現場無憂矣!隻是它是怎麼做到的,還請大人示教一下。

狄公哈哈大笑:“不急,且聽我慢慢道來”。

什麼是coredump?

coredump 顧名思義,就是核心轉儲。我們的程式在運作過程中,如果發生了異常退出,光靠程式自身log往往是很難定位問題根因的。作業系統提供了一套coredump機制,在異常發生的時候,将程序現場的vma資訊存儲到core檔案中去。利用這個檔案,就能夠恢複異常現場的資訊,定位人員可以從中擷取到變量值、棧資訊、記憶體資料,程式異常時的運作位置(甚至記錄代碼行号)等等,提高問題定位效率。就像斷案最關鍵的步驟就是去擷取第一手資訊,還原案發現場,在此基礎上進行案件推演。

那麼,coredump的流程是什麼樣子的呢?

如下圖所示,當程序發生故障的時候,核心就會啟動coredump機制将故障現場的vma等資訊轉儲成core檔案。故障過後,利用gdb加載coredump檔案來還原故障現場。通過擷取故障現場變量值、調用棧等資訊,可以快速确定故障類型,鎖定故障代碼位置,找到根因。

coredump 瘦身風雲

就像狄公每次一次斷案,都要先鎖定發現場,然後親自勘查,提取所有物證和證言,結合現場資訊推演,還原案發經過,最終鎖定作案元兇。

coredump 瘦身風雲

coredump資源消耗問題

作業系統在核心态生成core檔案,是要将程序的有效vma資訊全量dump出來。這就意味着大程序的coredump檔案會非常龐大,甚至可以達到TB級别。這類大檔案在生成和儲存過程中嚴重消耗了IO、CPU、記憶體帶寬等資源,對系統的穩定性帶來沖擊。就像之前要偵破一起大案,需要封鎖方圓數公裡内交通,動用數百警力做大量的摸排走訪工作。但随着技術手段革新,收集資訊也更準确,摸排手段也越來越精細化。同樣的,coredump資訊收集是否也能做到精細化?

coredump 瘦身風雲

minicoredump登場

“元芳啊,定位問題,就像咱們天天去斷案一樣,走訪的關鍵是要先收集到高價值的線索,比如棧空間、data、bss等。其它的匿名頁資訊,像堆空間,裡面的資料雖然很重要,但是對于斷案來說大多情況下用不到,屬于低線索資訊。而在大程序的vma資訊中,低線索資訊占比還非常高。是以,我們要有選擇、有目标地收集。這個時候,就該minicoredump登場了,将現場資訊先篩選一遍。工作量優化了不說,對正常生産影響也可以降到最小。”

青囊在一旁,欽佩地望着狄老大,默默地把minicoredump收錄到sysAK裡。這裡面不僅有記憶體洩漏定位秘籍,網絡診斷利器,如今還有minicoredump加持,還可以有效地過濾過濾匿名頁資訊,對core檔案進行瘦身,妙哉妙哉!

舉個栗子

如下表所示,這個是一個典型的案發現場資訊分布。minicoredump會針對性地進行收集:标紅的區間需要收集起來,借助于gdb,就可以幫我們将案發過程回放(打調用棧)和關鍵物證提取(擷取棧上變量、全局變量等資訊),而标綠的區域可以在必要的時候再收集,不影響我們斷案。

103249:   ./main

0000000000400000      4K r-x-- main

0000000000600000      4K r---- main

0000000000601000      4K rw--- main    #可執行檔案的data段

0000000001fa5000    132K rw---   [ anon ]  #堆空間

00007f8188000000  10372K rw---   [ anon ]

00007f8188a21000  55164K -----   [ anon ]

00007f8190000000  10372K rw---   [ anon ]

……

00007f819ca21000  55164K -----   [ anon ]

00007f81a0000000  10372K rw---   [ anon ]

00007f81a0a21000  55164K -----   [ anon ]

00007f81a495d000      4K -----   [ anon ]

00007f81a495e000   8192K rw---   [ anon ]  #棧空間

00007f81a6dfe000  10244K rw---   [ anon ]

00007f81a77ff000      4K -----   [ anon ]

00007f81a7800000   8192K rw---   [ anon ]

00007f81a8000000  10372K rw---   [ anon ]

00007f81a8a21000  55164K -----   [ anon ]

00007f81ac15c000      4K -----   [ anon ]

00007f81ac15d000   8192K rw---   [ anon ]

00007f81ac95d000      4K -----   [ anon ]

00007f81ac95e000   8192K rw---   [ anon ]

00007f81ae160000      4K -----   [ anon ]

00007f81ae161000   8192K rw---   [ anon ]

00007f81ae961000   1808K r-x-- libc-2.17.so

00007f81aeb25000   2044K ----- libc-2.17.so

00007f81aed24000     16K r---- libc-2.17.so

00007f81aed28000      8K rw--- libc-2.17.so #so data段

00007f81aed2a000     20K rw---   [ anon ]   #so BSS段

00007f81aed2f000     92K r-x-- libpthread-2.17.so

00007f81aed46000   2044K ----- libpthread-2.17.so

00007f81aef45000      4K r---- libpthread-2.17.so

00007f81aef46000      4K rw--- libpthread-2.17.so

00007f81aef47000     16K rw---   [ anon ]

00007f81aef4b000    136K r-x-- ld-2.17.so

00007f81af159000     12K rw---   [ anon ] #so link map

00007f81af169000     12K rw---   [ anon ]

00007f81af16c000      4K r---- ld-2.17.so

00007f81af16d000      4K rw--- ld-2.17.so

00007f81af16e000      4K rw---   [ anon ]

00007fff7eafc000    132K rw---   [ stack ]

00007fff7eb58000      8K r----   [ anon ]

00007fff7eb5a000      8K r-x--   [ anon ]

ffffffffff600000      4K r-x--   [ anon ]  #syscall

total           532892K

實際表現

該要拿真實資料說話:我們挑了一個真實的環境對比。同樣的程序coredump,檔案大小從3.5G下降到了1.9G。

coredump 瘦身風雲

coredump空間縮小後,不影響推棧等功能:

coredump 瘦身風雲

在更為複雜的生産環境,實際優化幅度可以達到80%以上,業務抖動下降了30%。換句話說,在引用了新技術以後,封鎖量減少,交通也就更順暢了。

狄公問:元芳,此法可好?

元芳連連點頭,啧啧稱贊:minicoredump神也神也,狄公了不得、了不得啊!

作為進階助理的青囊,站在一旁,用衣袖一遍一遍擦拭羅盤,心裡也樂開了花。半年後,狄公和元芳一行在清理大理寺檔案庫房,眼前已然不是堆疊成山的卷宗。得益于變薄的新卷宗,還騰挪出了一方天地,品茶說案,心曠神怡。

狄公戲問——

coredump 瘦身風雲

在一旁的青囊正要開心,突然斥候送來一份搪報,狄公拆開看了,說道:官道上剛出了樁大案,影響甚大,我們要馬上出發。青囊一驚,從夢中醒來,尋思着:官道?難道是新出了網絡問題。欲知後事如何,且聽下回分解。(完)

參考内容

https://blog.csdn.net/zp31415929/article/details/77528903?ref=myread https://www.cnblogs.com/lidabo/p/5014710.html http://hutaow.com/blog/2013/10/25/linux-core-dump/ https://www.cnblogs.com/secondtonone1/p/5732938.html

加入龍蜥社群

加入微信群:添加社群助理-龍蜥社群小龍(微信:openanolis_assis),備注【龍蜥】拉你入群;加入釘釘群:可掃碼或搜釘釘群号(33311793)。歡迎開發者/使用者加入龍蜥OpenAnolis社群交流,共同推進龍蜥社群的發展,一起打造一個活躍的、健康的開源作業系統生态!

coredump 瘦身風雲
coredump 瘦身風雲

龍蜥社群_小龍                                            龍蜥社群釘釘群二維碼

關于龍蜥社群

龍蜥社群是由企事業機關、高等院校、科研機關、非營利性組織、個人等按照自願、平等、開源、協作的基礎上組成的非盈利性開源社群。龍蜥社群成立于2020年9月,旨在建構一個開源、中立、開放的Linux上遊發行版社群及創新平台。

短期目标是開發Anolis OS作為CentOS替代版,重新建構一個相容國際Linux主流廠商發行版。中長期目标是探索打造一個面向未來的作業系統,建立統一的開源作業系統生态,孵化創新開源項目,繁榮開源生态。

加入我們,一起打造面向未來的開源作業系統!

Https://openanolis.cn

繼續閱讀