如何使用jemalloc分析Flink使用的native memory

前言

最近筆者因?yàn)閒link集群運(yùn)行在kubernetes上,由于不可抗力導(dǎo)致pod重生说搅,job需要restart僵缺,在沒有開啟checkpoint的情況下获三,作業(yè)只要重啟就會頻繁被os kill,這明顯是堆外內(nèi)存超用的現(xiàn)象梳凛。

heap memory和direct memory被jvm控制了耿币,顯然不會被os kill,而是OOM韧拒,可以被flink 捕捉而爆出異常的淹接,被os kill只有托管給rocksdb的native memory了。

如何分析native memory的leak呢叛溢,就需要引入jemalloc蹈集。

什么是jemalloc

系統(tǒng)的物理內(nèi)存是有限的,而對內(nèi)存的需求是變化的, 程序的動態(tài)性越強(qiáng)雇初,內(nèi)存管理就越重要拢肆,選擇合適的內(nèi)存管理算法會帶來明顯的性能提升。
比如nginx靖诗, 它在每個連接accept后會malloc一塊內(nèi)存郭怪,作為整個連接生命周期內(nèi)的內(nèi)存池。 當(dāng)HTTP請求到達(dá)的時候刊橘,又會malloc一塊當(dāng)前請求階段的內(nèi)存池, 因此對malloc的分配速度有一定的依賴關(guān)系鄙才。

內(nèi)存管理可以分為三個層次,自底向上分別是:

  • 操作系統(tǒng)內(nèi)核的內(nèi)存管理
  • glibc層使用系統(tǒng)調(diào)用維護(hù)的內(nèi)存管理算法
  • 應(yīng)用程序從glibc動態(tài)分配內(nèi)存后促绵,根據(jù)應(yīng)用程序本身的程序特性進(jìn)行優(yōu)化攒庵, 比如使用引用計(jì)數(shù)std::shared_ptr嘴纺,apache的內(nèi)存池方式等等。
    當(dāng)然應(yīng)用程序也可以直接使用系統(tǒng)調(diào)用從內(nèi)核分配內(nèi)存浓冒,自己根據(jù)程序特性來維護(hù)內(nèi)存栽渴,但是會大大增加開發(fā)成本

glibc malloc的實(shí)現(xiàn)是ptmalloc2,其替代品tcmalloc 和 jemalloc稳懒。

tcmalloc

tcmalloc是Google開源的一個內(nèi)存管理庫闲擦, 作為glibc malloc的替代品。目前已經(jīng)在chrome场梆、safari等知名軟件中運(yùn)用墅冷。
根據(jù)官方測試報(bào)告,ptmalloc在一臺2.8GHz的P4機(jī)器上(對于小對象)執(zhí)行一次malloc及free大約需要300納秒或油。而TCMalloc的版本同樣的操作大約只需要50納秒寞忿。

jemalloc

jemalloc是facebook推出的, 最早的時候是freebsd的libc malloc實(shí)現(xiàn)顶岸。 目前在firefox罐脊、facebook服務(wù)器各種組件中大量使用。

對應(yīng)的git地址如下

https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md

jemalloc有一項(xiàng)功能蜕琴,對應(yīng)長時間運(yùn)行的程序可以trace內(nèi)存,見文檔[6]萍桌。

如果想更加詳細(xì)的了解這三者的性能和對比,可以參考文檔[5]

環(huán)境

筆者的flink集群版本是1.10.1凌简,運(yùn)行在1.17的kubernetes上上炎。

編譯jemalloc

下載

wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2

解壓


tar -zxvf  jemalloc-5.2.1.tar.bz2

開始編譯

./configure --enable-prof --enable-stats --enable-debug --enable-fill

一定要加上--enable-prof 才可以使用heap-prof的功能

make 
make install

對我們來說,需要的是

bin
lib

將文件打入flink鏡像中

bin
lib

打入flink鏡像

ADD jemalloc /opt/jemalloc/

不知道怎么自己構(gòu)建鏡像的可以參考

https://guosmilesmile.github.io/2020/05/27/Flink-on-native-kubernetes-%E4%BD%BF%E7%94%A8%E5%92%8C%E4%BF%AE%E6%94%B9/

配置jemalloc

如果flink的運(yùn)行方式的native kubernetes雏搂,可以在構(gòu)建集群的腳本添加

-Dcontainerized.taskmanager.env.LD_PRELOAD: /opt/jemalloc/lib/libjemalloc.so.2
-Dcontainerized.taskmanager.env.MALLOC_CONF: prof:true,lg_prof_interval:25,lg_prof_sample:17,prof_prefix:/opt/state/jeprof.out

如果是on kubernetes的standalone藕施,那么需要修改deployment

env:
    - name: LD_PRELOAD
        value: /opt/jemalloc/lib/libjemalloc.so.2
    - name: MALLOC_CONF
        value: prof:true,lg_prof_interval:30,lg_prof_sample:17,prof_prefix:/opt/state/tmp/jeprof.out

配置解釋:

LD_PRELOAD: 將內(nèi)存分配從ptmalloc2改為libjemalloc.so.2

MALLOC_CONF: jemalloc的配置,prof_prefix是將生成的內(nèi)存文件dump到指定文件凸郑。lg_prof_interval:30 是 2^30 byte(1G)生成一個文件裳食,具體參數(shù)可以參考

https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md

進(jìn)入容器補(bǔ)充工具

可以到/opt/state/tmp/下看到很多jeprof.out開頭的heap文件

image

由于flink的容器是最簡化模式,會缺少很多工具芙沥,想要直接使用jeprof是會缺少很多的诲祸,需要補(bǔ)充下載

先將源改為國內(nèi)的源

在容器內(nèi)運(yùn)行

mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list

apt-get update 


安裝對應(yīng)的工具

apt-get install -y binutils graphviz ghostscript 

分析內(nèi)存

/opt/jemalloc/bin/jeprof --show_bytes `which java` /opt/state/tmp/jeprof.out.301.808.i808.heap

root@flink-taskmanager-69df85b5b9-dq42m:/opt/state/tmp# /opt/jemalloc/bin/jeprof --show_bytes `which java` /opt/state/tmp/jeprof.out.301.808.i808.heap 
Using local file /usr/local/openjdk-8/bin/java.
Argument "MSWin32" isn't numeric in numeric eq (==) at /opt/jemalloc/bin/jeprof line 5124.
Argument "linux" isn't numeric in numeric eq (==) at /opt/jemalloc/bin/jeprof line 5124.
Using local file /opt/state/tmp/jeprof.out.301.808.i808.heap.
Welcome to jeprof!  For help, type 'help'.
(jeprof) top
Total: 5580982945 B
2350833429  42.1%  42.1% 2350833429  42.1% os::malloc@8b2970
2002406207  35.9%  78.0% 2002406207  35.9% rocksdb::UncompressBlockContentsForCompressionType
1182793728  21.2%  99.2% 1183056000  21.2% rocksdb::Arena::AllocateNewBlock
11014112   0.2%  99.4% 13300172   0.2% rocksdb::LRUCacheShard::Insert
 9440064   0.2%  99.6% 2011846271  36.0% rocksdb::BlockBasedTable::PartitionedIndexIteratorState::NewSecondaryIterator
 6151347   0.1%  99.7%  6151347   0.1% std::string::_Rep::_S_create
 3335701   0.1%  99.7%  3335701   0.1% readCEN
 2621559   0.0%  99.8%  2621559   0.0% rocksdb::WritableFileWriter::Append
 2381515   0.0%  99.8%  3581933   0.1% rocksdb::VersionSet::ProcessManifestWrites
 2286059   0.0%  99.9%  2286059   0.0% rocksdb::LRUHandleTable::Resize
(jeprof) 

可以導(dǎo)出成pdf或者svg

Output type:
   --text              Generate text report
   --callgrind         Generate callgrind format to stdout
   --gv                Generate Postscript and display
   --evince            Generate PDF and display
   --web               Generate SVG and display
   --list=<regexp>     Generate source listing of matching routines
   --disasm=<regexp>   Generate disassembly of matching routines
   --symbols           Print demangled symbol names found at given addresses
   --dot               Generate DOT file to stdout
   --ps                Generate Postcript to stdout
   --pdf               Generate PDF to stdout
   --svg               Generate SVG to stdout
   --gif               Generate GIF to stdout
   --raw               Generate symbolized jeprof data (useful with remote fetch)

 /opt/jemalloc/bin/jeprof --show_bytes -svg `which java` /opt/state/tmp/jeprof.out.301.1009.i1009.heap  > 105.svg

image

Refernce

[1]Flink任務(wù)物理內(nèi)存溢出問題定位

[2]jemalloc初體驗(yàn)

[3]Using jemalloc to get to the bottom of a memory leak

[4]Debugging Java Native Memory Leaks

[5]內(nèi)存優(yōu)化總結(jié):ptmalloc、tcmalloc和jemalloc

[6]Use Case: Heap Profiling

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載而昨,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者救氯。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歌憨,隨后出現(xiàn)的幾起案子着憨,更是在濱河造成了極大的恐慌,老刑警劉巖务嫡,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲抖,死亡現(xiàn)場離奇詭異漆改,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)准谚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門挫剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氛魁,你說我怎么就攤上這事暮顺√ǎ” “怎么了秀存?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羽氮。 經(jīng)常有香客問我或链,道長,這世上最難降的妖魔是什么档押? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任澳盐,我火速辦了婚禮,結(jié)果婚禮上令宿,老公的妹妹穿的比我還像新娘叼耙。我一直安慰自己,他們只是感情好粒没,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布筛婉。 她就那樣靜靜地躺著,像睡著了一般癞松。 火紅的嫁衣襯著肌膚如雪爽撒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天响蓉,我揣著相機(jī)與錄音硕勿,去河邊找鬼。 笑死枫甲,一個胖子當(dāng)著我的面吹牛源武,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播想幻,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼软能,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了举畸?” 一聲冷哼從身側(cè)響起查排,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抄沮,沒想到半個月后跋核,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖瑰,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年砂代,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹋订。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刻伊,死狀恐怖露戒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捶箱,我是刑警寧澤智什,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丁屎,受9級特大地震影響荠锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨川,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一证九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共虑,春花似錦愧怜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至供炎,卻和暖如春渴逻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背音诫。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工惨奕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竭钝。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓梨撞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親香罐。 傳聞我的和親對象是個殘疾皇子卧波,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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

  • 一、x86 Linux 32位系統(tǒng)虛擬地址空間布局: 這里的段基址從0開始庇茫,可以訪問管理的內(nèi)存是4G港粱;如果是段基址...
    mindhook閱讀 1,077評論 0 1
  • linux內(nèi)存尋址 3種地址:虛擬地址、物理地址、邏輯地址物理地址:內(nèi)存的電路地址查坪,對應(yīng)內(nèi)存地址線上的高低電平寸宏,物...
    grimlock44閱讀 1,121評論 0 1
  • 前言 在互聯(lián)網(wǎng)時代,大部分的應(yīng)用程序基本都是IO密集型偿曙,而IO密集型的程序運(yùn)行效率的關(guān)鍵在于內(nèi)存管理氮凝,因此充分理解...
    淡泊寧靜_3652閱讀 1,870評論 0 8
  • 本文主要講用戶態(tài)進(jìn)程的內(nèi)存管理,而不是內(nèi)核的內(nèi)存管理望忆。簡單地說罩阵,就是和 malloc 和 free 相關(guān)的內(nèi)存管理...
    linjinhe閱讀 2,949評論 0 2
  • 久違的晴天,家長會启摄。 家長大會開好到教室時稿壁,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗(yàn)鞋仍。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22