日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

jdk下載慢怎么辦 jdk下載快速方法

導(dǎo)語:

本文作者為解決一個JDK性能問題,從堆棧分析,到GC分析,再到Safepoint原因分析,最終定位到問題根因與所用的JDK版本有關(guān) 。并整理成文,與所有Java相關(guān)開發(fā)的同學(xué)分享此次經(jīng)驗(yàn) 。
01 問題來了
筆者近期在工作中遇到這樣一個問題:某客戶新上線了一個Elasticsearch應(yīng)用,但運(yùn)行一段時間后就變的特別慢,甚至查詢超時 。重啟后服務(wù)恢復(fù),但每隔3~4小時后問題重現(xiàn) 。
針對這個問題,我身邊的同事也幫忙做了簡單分析,發(fā)現(xiàn)存在大量Merge的線程,應(yīng)該怎么辦呢?根據(jù)我之前定位問題的經(jīng)驗(yàn),一般通過Thread Dump日志分析,就能找到問題原因的正確方向,然后再分析該問題不斷重復(fù)的原因 。按照這個思路,問題分析起來應(yīng)該不算復(fù)雜 。But,后來劇情還是出現(xiàn)了波折 。
02 困惑的堆棧日志
因網(wǎng)絡(luò)隔離原因,只能由客戶配合獲取Thread Dump日志 。并跟客戶強(qiáng)調(diào)了獲取Thread Dump日志的技巧,每個節(jié)點(diǎn)每隔幾秒獲取一次,輸出到一個獨(dú)立的文件中 。集群涉及到三個節(jié)點(diǎn),我們暫且將這三個節(jié)點(diǎn)稱之為39,158,211 。問題復(fù)現(xiàn)后,拿到了第一批Thread Dump文件:

jdk下載慢怎么辦 jdk下載快速方法


從文件的大小,可輕易看出39節(jié)點(diǎn)大概率是一個問題節(jié)點(diǎn),它的Thread Dump日志明顯大出許多:查詢變慢或者卡死,通常表現(xiàn)為大量的Worker Thread忙碌,也就是說,活躍線程數(shù)量顯著增多 。而在ES(Elasticsearch,以下簡稱為ES)的默認(rèn)查詢行為下,只要有一個節(jié)點(diǎn)出現(xiàn)問題,就會讓整個查詢受牽累 。
那么我們先對三個節(jié)點(diǎn)任選的1個Thread Dump文件的線程總體情況進(jìn)行對比:
節(jié)點(diǎn)名稱39158211線程總數(shù)366341282RUNNABLE264221162WAITING648892TIME_WAITING283228BLOCKED1000再按線程池進(jìn)行分類統(tǒng)計(jì):
節(jié)點(diǎn)名稱39158211Lucene Merge Thread7700http_server_worker646464search494949transport_client_boss286430bulk323232generic1564transport_server_worker275529refresh10510management523warmer555flush555others495451可以發(fā)現(xiàn):39節(jié)點(diǎn)上的Lucene Merge Thread明顯偏多,而其它兩個節(jié)點(diǎn)沒有任何Merge的線程 。
再對39節(jié)點(diǎn)的Thread Dump文件進(jìn)行深入分析,發(fā)現(xiàn)的異常點(diǎn)總結(jié)如下:
1. Lucene Merge Thread達(dá)到77個,其中一個線程的調(diào)用棧如下所示:

jdk下載慢怎么辦 jdk下載快速方法


2. 有8個線程在競爭鎖定ExpiringCache:

jdk下載慢怎么辦 jdk下載快速方法


3. 有8個線程都在做HashMap#hash計(jì)算:

jdk下載慢怎么辦 jdk下載快速方法


現(xiàn)象1中提到了有77個同時在做Merge的線程,但無法確定這些Merge任務(wù)是同時被觸發(fā)的,還是因?yàn)橄到y(tǒng)處理過慢逐步堆積成這樣的狀態(tài) 。無論如何這像是一條重要線索 。再考慮到這是一個新上線的應(yīng)用,關(guān)于環(huán)境信息與使用姿勢的調(diào)研同樣重要:
  • 集群共有3個節(jié)點(diǎn),目前共有500+個Indices 。每個節(jié)點(diǎn)上寫活躍的分片數(shù)在70個左右 。
  • 按租戶創(chuàng)建Index,每個租戶每天創(chuàng)建3個Indices 。上線初期,寫入吞吐量較低 。每個索引在每分鐘Flush成的Segment在KB~數(shù)MB之間 。
我開始懷疑這種特殊的使用方式:集群中存在多個寫活躍的索引,但每分鐘的寫入量都偏小,在KB至數(shù)MB級別 。這意味著,F(xiàn)lush可能都是周期性觸發(fā),而不是超過預(yù)設(shè)閾值后觸發(fā) 。這種寫入方式,會導(dǎo)致產(chǎn)生大量的小文件 。抽樣觀察了幾個索引中新產(chǎn)生的Segment文件,的確每一次生成的文件都非常小 。
關(guān)于第2點(diǎn)現(xiàn)象,我認(rèn)真閱讀了java.io.UnixFileSystem的源碼:

推薦閱讀