記一次ES中RestHighLevelClient使用不當(dāng),造成的線程溢出問題

前天同事在我們的數(shù)據(jù)服務(wù)spring boot項(xiàng)目中發(fā)現(xiàn)請(qǐng)求某個(gè)接口昌简,導(dǎo)致內(nèi)存不停增長(zhǎng),最后導(dǎo)致內(nèi)存溢出绒怨,程序崩潰的問題纯赎。最初懷疑是不是有什么大對(duì)象在JVM中進(jìn)行了垃圾回收也沒有釋放,順著這個(gè)思路一步步排查南蹂。

  1. 使用jstat查看垃圾回收頻率
jstat -gc 1 250 20 

發(fā)現(xiàn)MinorGC頻率很低犬金,F(xiàn)ullGC頻率很高。初步定位是老年代內(nèi)存分配太少引起的碎紊。過(guò)然查看java程序啟動(dòng)參數(shù)發(fā)現(xiàn)以下設(shè)定:"-Xms300m","-Xmx300m","-MaxNewSize=300"
很顯然這個(gè)配置存在明顯的問題佑附,整個(gè)堆分配300m內(nèi)存,給新生代的是300m仗考,導(dǎo)致老年代幾乎沒有內(nèi)存可以使用音同,所以會(huì)導(dǎo)致頻繁的FullGC。把MaxNewSize去掉秃嗜,使用系統(tǒng)默認(rèn)的2:8权均。然后觀察垃圾回收情況,這次不會(huì)頻繁發(fā)生FullGC了锅锨,但是內(nèi)存還是一直增長(zhǎng)叽赊,直到內(nèi)存溢出。

  1. 使用jmap查看堆對(duì)象
jmap -dump:format=b,file=test.bin pid

因?yàn)槌霈F(xiàn)的問題在生產(chǎn)服務(wù)器中必搞,使用JProfiler遠(yuǎn)程連接以前沒有試過(guò)必指。暫時(shí)先用JVM自帶的工具jmap把堆快照下載下來(lái),然后使用本地JProfiler進(jìn)行分析恕洲。初步定為發(fā)現(xiàn)LauchedURLClassLoader占用了很多內(nèi)存塔橡,但是由于分析的是快照,沒法知道該對(duì)象的增長(zhǎng)速度霜第,無(wú)果葛家。


image.png
  1. 在本地使用JProfiler實(shí)時(shí)監(jiān)控分析
    使用JVM自帶的工具能看到的信息有限。權(quán)衡使用JProfiler遠(yuǎn)程連接定位還不如在本地開啟調(diào)試環(huán)境泌类,然后使用JProfiler附加該java進(jìn)程監(jiān)控癞谒。標(biāo)記內(nèi)存分配比較多的大對(duì)象,然后模擬點(diǎn)擊持續(xù)請(qǐng)求,發(fā)現(xiàn)很多對(duì)象的調(diào)用實(shí)例都一直在增加弹砚,然后觀察線程一直在增加并且停止請(qǐng)求双仍,線程也沒有釋放。線程名稱I/O dispatcher迅栅,查看線程堆棧是一個(gè)NIO線程殊校,由AbstractMultiworkerIOReactor創(chuàng)建。通過(guò)包名不難定位是引用的CloseableHttpAsyncClient異步http請(qǐng)求的問題读存。然后在代碼端查找使用該類的地方,發(fā)現(xiàn)該段代碼中使用ES進(jìn)行搜索呕屎,而搜索用的對(duì)象RestHighLevelClient让簿,內(nèi)部使用的是異步http請(qǐng)求。至此問題已經(jīng)定位到秀睛,是es使用的相關(guān)問題尔当。經(jīng)驗(yàn)證把es相關(guān)代碼注釋掉,程序運(yùn)行正常蹂安,線程分配也正常椭迎。


    image.png
  2. 調(diào)整RestHighLevelClient的使用方式
    定位到是RestHighLevelClient使用的問題,開始懷疑是否是使用的姿勢(shì)不對(duì)田盈,于是查看文檔畜号,然后設(shè)置CloseableHttpAsyncClient的IO線程數(shù)等一系列參數(shù),線程還是暴漲允瞧,無(wú)果简软。下面是在es github和論壇中查看的一些issues.
// Hight I/O dispatch Thread
https://github.com/elastic/elasticsearch/issues/61675
// Direct buffer memory problems with RestHighLevelClient
https://discuss.elastic.co/t/direct-buffer-memory-problems-with-resthighlevelclient/106647)
  1. 通過(guò)源碼定位到問題
    無(wú)奈只能硬著頭皮查看源碼(具體對(duì)CloseableHttpAsyncClient源碼分析有時(shí)間再寫一篇筆記),無(wú)意跟蹤代碼的過(guò)程中發(fā)現(xiàn)RestHighLevelClient每次請(qǐng)求的過(guò)程中述暂,都會(huì)初始化痹升,然后初始化資源也沒有釋放。
public RestHighLevelClient(RestClientBuilder restClientBuilder) {
        this(restClientBuilder, Collections.emptyList());
    }

繼續(xù)跟蹤本地自己寫的代碼畦韭,發(fā)現(xiàn)在一個(gè)Optional初始化的過(guò)程中在orElse有一個(gè)初始化的代碼疼蛾。經(jīng)調(diào)試驗(yàn)證,原來(lái)orElse就算不走該分支艺配,程序執(zhí)行的過(guò)程中會(huì)預(yù)先初始化察郁。在RestHighLevelClient預(yù)先分配了線程,然后程序也沒有釋放妒挎,所以導(dǎo)致線程溢出和內(nèi)存溢出绳锅,去掉orElse,然后重新測(cè)試觀察JProfiler中線程的趨勢(shì)圖已經(jīng)正常酝掩,至此問題解決鳞芙。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子原朝,更是在濱河造成了極大的恐慌驯嘱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳坠,死亡現(xiàn)場(chǎng)離奇詭異鞠评,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)壕鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門剃幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晾浴,你說(shuō)我怎么就攤上這事负乡。” “怎么了脊凰?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抖棘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我狸涌,道長(zhǎng)切省,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任帕胆,我火速辦了婚禮朝捆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惶楼。我一直安慰自己右蹦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布歼捐。 她就那樣靜靜地躺著何陆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豹储。 梳的紋絲不亂的頭發(fā)上贷盲,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音剥扣,去河邊找鬼巩剖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钠怯,可吹牛的內(nèi)容都是我干的佳魔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晦炊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鞠鲜!你這毒婦竟也來(lái)了宁脊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贤姆,失蹤者是張志新(化名)和其女友劉穎榆苞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞捡,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐漏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碧信。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赊琳。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖音婶,靈堂內(nèi)的尸體忽然破棺而出慨畸,到底是詐尸還是另有隱情,我是刑警寧澤衣式,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站檐什,受9級(jí)特大地震影響碴卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乃正,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一住册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓮具,春花似錦荧飞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至传睹,卻和暖如春耳幢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欧啤。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工睛藻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邢隧。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓店印,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倒慧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子按摘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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