在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用G1 GC時HBase為什么性能下降了近20%

Rokr_wireless_t ? 來源:HBase技術社區 ? 作者:林軍軍、彭成寒 ? 2021-08-13 14:42 ? 次閱讀

編者按:筆者在 HBase 業務場景中嘗試將 JDK 從 8 升級到 11,使用 G1 GC 作為垃圾回收器,但是性能下降 20%。到底是什么導致了性能衰退?又該如何定位解決?本文介紹如果通過使用 JFR、火焰圖等工具確定問題,最后通過版本逐一驗證找到了引起性能問題的代碼。在畢昇 JDK 中率先修復問題最后將修復推送到上游社區中。希望通過本文的介紹讓讀者了解到如何解決大版本升級中遇到的性能問題;同時也提醒 Java 開發者要正確地使用參數(使用前要理解參數的含義)。

HBase 從 2.3.x 開始正式默認的支持 JDK 11,HBase 對于 JDK 11 的支持指的是 HBase 本身可以通過 JDK 11 的編譯、同時相關的測試用例全部通過。由于 HBase 依賴 Hadoop 和 Zookeeper,而目前最新的 Hadoop 和 Zookeeper 尚未支持 JDK 11,所以 HBase 中仍然有一個 jira 來關注 JDK 11 支持的問題,具體參考:https://issues.apache.org/jira/browse/HBASE-22972。

G1 GC 從 JDK 9 以后就成為默認的 GC,而且 HBase 在新的版本中也采用 G1 GC,對于 HBase 是否可以在生產環境中使用 JDK 11?筆者嘗試使用 JDK 11 來運行新的 HBase,驗證 JDK 11 是否比 JDK 8 有優勢。

環境介紹

驗證的方式非常簡單,搭建一個 3 節點的 HBase 集群,安裝 HBase,采用的版本為 2.3.2,關于 HBase 環境搭建可以參考官網。

另外為了驗證,使用一個額外的客戶端機器,通過 HBase 自帶的 PerformanceEvaluation 工具(簡稱 PE)來驗證 HBase 讀、寫性能。PE 支持隨機的讀、寫、掃描,順序讀、寫、掃描等。

例如一個簡單的隨機寫命令如下:

hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=10000 --valueSize=8000 randomWrite 5

該命令的含義是:創建 5 個客戶端,并且執行持續的寫入測試。每個客戶端每次寫入 8000 字節,共寫入 10000 行。

PE 使用起來非常簡單,是 HBase 壓測中非常流行的工具,關于 PE 更多的用法可以參考相關手冊。

本次測試為了驗證讀寫性能,采用如下配置:

org.apache.hadoop.hbase.PerformanceEvaluation --writeToWAL=true --nomapred --size=256 --table=Test1 --inmemoryCompaction=BASIC --presplit=50 --compress=SNAPPY sequentialWrite 120

JDK 采用 JDK 8u222 和 JDK 11.0.8 分別進行測試,當切換 JDK 時,客戶端和 3 臺 HBase 服務器統一切換。JDK 的運行參數為:

-XX:+PrintGCDetails -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:-ResizePLAB

注意:這里禁止 ResizePLAB 是業務根據 HBase 優化資料設置。

測試結果:JDK 11 性能下降

通過 PE 進行測試,運行結束有 TPS 數據,表示性能。

在相同的硬件環境、相同的 HBase,僅僅使用不同的 JDK 來運行。同時為了保證結果的準確性,多次運行,取平均值。測試結果如下:

1ff4a23c-fb6f-11eb-9bcf-12bb97331649.png

從表中可以快速地計算得到吞吐量下降,運行時間增加。

2020c970-fb6f-11eb-9bcf-12bb97331649.png

結論:使用 G1 GC,JDK 11 相對于 JDK 8 來說性能明顯下降。

原因分析

從 JDK 8 到 JDK 11, G1 GC 做了非常多的優化用于提高性能。為什么 JDK 11 對于應用者來說更不友好?簡單的總結一下從 JDK 8 到 JDK 11 做的一些比較大的設計變化,如下表所示:

優化點描述

IHOP 啟發式設置IHOP 用于控制并發標記的啟動時機,在 JDK 9 中引入該優化,根據應用運行的情況,計算 IHOP 的值,確保在內存耗盡之前啟動并發標記。對于性能和運行時間理論上都是正優化,特殊情況下可能會導致性能下降

Full GC 的并行話在 JDK10 中將 Full GC 從串行實現優化為并行實現,該優化不會產生負面影響

動態線程調整根據 GC 工作線程的負載情況,引入動態的線程數來處理任務。該優化會帶來正效果,注意不是 GC 工作線程數目越多 GC 的效果越好(GC 會涉及到多線程的任務竊取和同步機制,過多的線程會導致性能下降)

引用集的重構引用集處理優化,設置處理大小、將并行修改為并發等

統一 JDK 8 和 JDK 11 的參數,驗證效果

由于 JDK 11 和 JDK 8 實現變化很多,部分功能完全不同,但是這些變化的功能一般都有參數控制,一種有效的嘗試:梳理 JDK 8 和 JDK 11 關于 G1 的參數,將它們設置為相同的值,比如關閉 IHOP 的自適應,關閉線程調整等。這里簡單的給出 JDK 8 和 JDK 11 不同參數的比較,如下圖所示:

將兩者參數都設置為和 JDK 8 一樣的值,重新驗證測試,結果不變,JDK 11 性能仍然下降。

GC 日志分析,確定 JDK 11 性能下降點

對于 JDK 8 和 JDK 11 同時配置日志收集功能,重新測試,獲得 GC 日志。通過 GC 日志分析,我們發現差異主要在 G1 young gc 的 object copy 階段(耗時基本在這),JDK 11 的 Young GC 耗時大概 200ms,JDK 8 的 Young GC 耗時大概 100ms,兩者設置的目標停頓時間都是 100ms。

JDK 11 中 GC 日志片段:

JDK 8 中 GC 日志片段:

我們對整個日志做了統計,有以下發現:

并發標記時機不同,混合回收的時機也不同;

單次 GC 中對象復制的耗時不同,JDK 11 明顯更長;

總體 GC 次數 JDK 11 的更多,包括了并發標記的停頓次數;

總體 GC 的耗時 JDK 11 更多。

21821a4e-fb6f-11eb-9bcf-12bb97331649.png

針對 Young GC 的性能劣化,我們重點關注測試了和 Young GC 相關的參數,例如:調整 UseDynamicNumberOfGCThreads、G1UseAdaptiveIHOP 、GCTimeRatio 均沒有效果。

下面我們嘗試使用不同的工具來進一步定位到底哪里出了問題。

JFR 分析-確認日志分析結果

畢昇 JDK 11 和畢昇 JDK 8 都引入了 JFR,JFR 作為 JVM 中問題定位的新貴,我們也在該案例進行了嘗試,關于 JFR 的原理和使用,參考本系列的技術文章:Java Flight Recorder - 事件機制詳解

JDK 11 總體信息

JDK 8 中通過 JFR 收集信息。

JDK 8 總體信息

JFR 的結論和我們前面分析的結論一致,JDK 11 中中斷比例明顯高于 JDK 8。

JDK 11 中垃圾回收發生的情況

JDK 8 中垃圾回收發生的情況

從圖中可以看到在 JDK 11 中應用消耗內存的速度更快(曲線速率更為陡峭),根據垃圾回收的原理,內存的消耗和分配相關。

JDK 11 中 VM 操作

JDK 8 中 VM 操作

通過 JFR 整體的分析,得到的結論和我們前面的一致,確定了 Young GC 可能存在問題,但是沒有更多的信息。

火焰圖-發現熱點

為了進一步的追蹤 Young GC 里面到底發生了什么導致對象賦值更為耗時,我們使用 Async-perf 進行了熱點采集。關于火焰圖的使用參考本系列的技術文章:使用 perf 解決 JDK8 小版本升級后性能下降的問題[1]

JDK 11 的火焰圖

JDK 11 GC 部分火焰圖

圖片 JDK 8 的火焰圖

JDK 8 GC 部分火焰圖

通過分析火焰圖,并比較 JDK 8 和 JDK 11 的差異,可以得到:

在 JDK 11 中,耗時主要在:

G1ParEvacuateFollowersClosure::do_void()

G1RemSet::scan_rem_set

在 JDK 8 中,耗時主要在:

G1ParEvacuateFollowersClosure::do_void()

更一步,我們對 JDK 11 里面新出現的 scan_rem_set() 進行更進一步分析,發現該函數僅僅和引用集相關,通過修改 RSet 相關參數(修改 G1ConcRefinementGreenZone ),將 RSet的處理盡可能地從Young GC的操作中移除?;鹧鎴D中參數不再成為熱點,但是 JDK 11 仍然性能下降。

比較 JDK 8 和 JDK 11 中 G1ParEvacuateFollowersClosure::do_void() 中的不同,除了數組處理外其他的基本沒有變化,我們將 JDK 11 此處的代碼修改和 JDK 8 完全一樣,但是性能仍然下降。

結論:雖然 G1ParEvacuateFollowersClosure::do_void() 是性能下降的觸發點,但是此處并不是問題的根因,應該是其他的原因造成了該函數調用次數增加或者耗時增加。

逐個版本驗證-最終確定問題

我們分析了所有可能的情況,仍然無法快速找到問題的根源,只能使用最笨的辦法,逐個版本來驗證從哪個版本開始性能下降。

在大量的驗證中,對于 JDK 9、JDK 10,以及小版本等都重新做了構建(關于 JDK 的構建可以參考官網),我們發現 JDK 9-B74 和 JDK 9-B73 有一個明顯的區別。為此我們分析了 JDK 9-B73 合入的代碼。發現該代碼和 PLAB 的設置相關,為此梳理了所有 PLAB 相關的變動:

B66 版本為了解決 PLAB size 獲取不對的問題(根據 GC 線程數量動態調整,但是開啟 UseDynamicNumberOfGCThreads 后該值有問題,默認是關閉)修復了 bug。具體見 jira:Determining the desired PLAB size adjusts to the the number of threads at the wrong place[2]

B74 發現有問題(desired_plab_sz 可能會有相除截斷問題和沒有對齊的問題),重新修改,具體見 8079555: REDO - Determining the desired PLAB size adjusts to the the number of threads at the wrong place[3]

B115 中發現 B74 的修改,動態調整 PLAB大小后,會導致很多情況 PLAB過?。ù蟾啪褪遣蛔?PLAB,走了直接分配),頻繁的話會導致性能大幅下降,又做了修復 Net PLAB size is clipped to max PLAB size as a whole, not on a per thread basis[4]

重新修改了代碼,打印 PLAB 的大小。對比后發現 desired_plab_sz 大小,在性能正常的版本中該值為 1024 或者 4096(分別是 YoungPLAB 和 OLDPLAB),在性能下降的版本中該值為 258。由此確認 desired_plab_sz 不正確的計算導致了性能下降。

PALB 為什么會引起性能下降?

PLAB 是 GC 工作線程在并行復制內存時使用的緩存,用于減少多個并行線程在內存分配時的鎖競爭。PLAB 的大小直接影響 GC 工作線程的效率。

在 GC 引入動態線程調整的功能時,將原來 PLABSize 的大小作為多個線程的總體 PLAB 的大小,將 PLAB 重新計算,如下面代碼片段:

23734238-fb6f-11eb-9bcf-12bb97331649.png

其中 desired_plab_sz 主要來自 YoungPLABSize 和 OldPLABSIze 的設置。所以這樣的代碼修改改變了 YoungPLABSize、OldPLABSize 參數的語義。

另外,在本例中,通過參數顯式地禁止了 ResizePLAB 是觸發該問題的必要條件,當打開 ResizePLAB 后,PLAB 會根據 GC 工作線程晉升對象的大小和速率來逐步調整 PLAB 的大小。

注意,眾多資料說明:禁止 ResziePLAB 是為了防止 GC 工作線程的同步,這個說法是不正確的,PLAB 的調整耗時非常的小。PLAB 是 JVM 根據 GC 工作線程使用內存的情況,根據數學模型來調整大小,由于模型的誤差,可能導致 PLAB 的大小調整不一定有人工調參效果好。如果你沒有對 YoungPLABSize、OldPLABSize 進行調優,并不建議禁止 ResizePLAB。在 HBase 測試中,當打開 ResizePLAB 后 JDK 8 和 JDK 11 性能基本相同,也從側面說明了該參數的使用情況。

解決方法&修復方法

由于該問題是 JDK 9 引入,在 JDK 9, JDK 10, JDK 11, JDK 12, JDK 13, JDK 14, JDK 15, JDK 16 都會存在性能下降的問題。

我們對該問題進行了修正,并提交到社區,具體見 Jira:https://bugs.openjdk.java.net/browse/JDK-8257145[5];代碼見:https://github.com/openjdk/jdk/pull/1474[6];該問題在 JDK 17 中被修復。

同時該問題在畢昇 JDK 所有版本中第一時間得到解決。

當然對于短時間內無法切換 JDK 的同學,遇到這個問題,該如何解決?難道要等到 JDK 17?一個臨時的方法是顯式地設置 YoungPLABSize 和 OldPLABSize 的值。YoungPLABSize 設置為 YoungPLABSize* ParallelGCThreads,其中 ParallelGCThreads 為 GC 并行線程數。例如 YoungPLABSize 原來為 1024,ParallelGCThreads 為 8,在 JDK 9~16,將 YoungPLABSize 設置為 8192 即可。

其中參數 ParallelGCThreads 的計算方法為:沒有設置該參數時,當 CPU 個數小于等于 8, ParallelGCThreads 等于 CPU 個數,當 CPU 個數大于 8,ParallelGCThreads 等于 CPU 個數的 5/8)。

小結

本文分享了針對 JDK 升級后性能下降的解決方法。Java 開發人員如果遇到此類問題,可以按照下面的步驟嘗試自行解決:

對齊不同 JDK 版本的參數,確保參數相同,看是否可以快速重現;

分析 GC 日志,確定是否由 GC 引起。如果是,建議將所有的參數重新驗證,包括移除原來的參數。本例中一個最大的失誤是,在分析過程中沒有將原來業務提供的參數 ResizePLAB 移除重新測試,浪費了很多時間。如果執行該步驟后,定位問題可能可以節約很多時間;

使用一些工具,比如 JFR、NMT、火焰圖等。本例中嘗試使用這些工具,雖然無果,但基本上確認了問題點;

最后的最后,如果還是沒有解決,請聯系畢昇 JDK 社區(點擊原文進入社區)。畢昇 JDK 社區每雙周周二舉行技術例會,同時有一個技術交流群討論 GCC、LLVM 和 JDK 等相關編譯技術,感興趣的同學可以添加如下微信小助手入群。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JDK
    JDK
    +關注

    關注

    0

    文章

    81

    瀏覽量

    16596
  • Hbase
    +關注

    關注

    0

    文章

    27

    瀏覽量

    11182

原文標題:JDK 從8升級到11,使用 G1 GC,HBase 性能下降近20%。JDK 到底干了什么?

文章出處:【微信號:wireless-tag,微信公眾號:啟明云端科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    9.9萬元行業最低售價!宇樹智能人形機器人G1發布:“每天都在升級進化”

    電子發燒友網報道(文/李寧遠)幾日前,宇樹科技正式發布了Unitree G1基礎版以及EDU版的智能人形機器人,在市場上引起了關注。相比于它的綜合性能,其9.9萬元的基礎版本定價著實讓人吃驚
    的頭像 發表于 05-19 01:39 ?4600次閱讀
    9.9萬元行業最低售價!宇樹智能人形機器人<b class='flag-5'>G1</b>發布:“每天都在升級進化”

    用萬用表測試的過程中,ADS4246參考電壓為什么會逐漸下降了?

    萬用表測試的過程中,VCM為什么會逐漸下降了?使用示波器測試也出現同樣的現象。不知道哪位高手幫忙解答下,謝謝
    發表于 12-27 07:23

    ADS1220 PT100采樣電路測固定電阻時數據隨時間緩慢下降是什么原因?

    ADS1220 三線制PT100采樣電路,PT100用精密電阻箱代替,進行了3天測試,得到的結果是在緩慢下降的。 1.曲線上的數據是20SPS,20包數據去最大最小并平均濾波的
    發表于 12-11 08:14

    在ADS8584S手冊上(如下),當開啟OS功能時,為什么這里的吞量反而下降了?

    你好,請教在ADS8584S手冊上(如下),當開啟OS功能時,為什么這里的吞量反而下降了? 使用OS功能,不應該是同樣的輸入信號帶寬,采樣點需要4倍關系(較不使用OS)的增加嗎? 謝謝
    發表于 11-21 07:18

    使用TLV320ADC3101設置coefficient,信號和噪聲都整體下降了是怎么回事?

    我正在使用TLV320ADC3101這顆芯片,通過設置coefficient,設置高通和低通濾波。然后分析錄音文件,發現信號和噪聲都整體下降了,并沒有達到預期的 濾去高頻率和低頻率的噪聲,請問這是什么原因,還是要設置其他的地方?
    發表于 11-05 08:17

    用opa690與vca810搭了一個增益可控的前置運放模塊,頻率一高它的增益卻下降了,為什么?

    你好,我用opa690與vca810搭了一個增益可控的前置運放模塊,但是低頻時增益穩定,但頻率一高(從1M起,到10M,逐漸增加),它的增益卻下降了(沒有調vca810),我想問一下是寄生電感還是其它什么因素在影響。
    發表于 09-26 07:27

    格科微推出高性能GC32E2圖像傳感器

    近日,國內領先的半導體企業格科微宣布成功量產了高性能的第二代單芯片3200萬像素圖像傳感器——GC32E2。這款新品的推出,無疑將為用戶帶來更為出色的影像體驗。
    的頭像 發表于 06-19 15:05 ?1114次閱讀

    HBase集群數據在線遷移方案探索

    一、背景 訂單本地化系統目前一個月的訂單的讀寫已經切至jimkv存儲,對應的HBase集群已下線。但存儲全量數據的HBase集群仍在使用,計劃將這個HBase集群中的數據全部遷到jimkv,徹底
    的頭像 發表于 06-12 11:54 ?1172次閱讀
    <b class='flag-5'>HBase</b>集群數據在線遷移方案探索

    12v隔離后帶負載電壓下降

    12v隔離后帶200mA的負載,電壓下降,降了1v。但隔離前的電壓沒變,是哪個元器件限流了嗎
    發表于 06-12 09:24

    英飛凌CoolSiC? MOSFET G2,助力下一代高性能電源系統

    靠性。在碳化硅材料中,垂直界面的缺陷密度明顯低于橫向界面。這就為性能和魯棒性特征與可靠性的匹配提供了新的優化潛力。 安富利合作伙伴英飛凌推出的CoolSiC MOSFET G2溝槽技術繼承了G1的高可靠性。 基于所有已售出的Co
    發表于 05-16 09:54 ?629次閱讀
    英飛凌CoolSiC? MOSFET <b class='flag-5'>G</b>2,助力下一代高<b class='flag-5'>性能</b>電源系統

    宇樹科技發布Unitree G1新型人形機器人

    近日,宇樹科技發布了一款名為Unitree G1的新型人形機器人,再度展示了其在機器人領域的創新實力。這款機器人以其超大關節運動角度和多達34個關節的設計而備受矚目。
    的頭像 發表于 05-16 09:50 ?678次閱讀

    廣泛用于4G/5G小基站、4G/5G直放站的GC080X收發機芯片

    廣泛用于4G/5G小基站、4G/5G直放站的GC080X收發機芯片
    的頭像 發表于 05-14 09:51 ?523次閱讀
    廣泛用于4<b class='flag-5'>G</b>/5<b class='flag-5'>G</b>小基站、4<b class='flag-5'>G</b>/5<b class='flag-5'>G</b>直放站的<b class='flag-5'>GC</b>080X收發機芯片

    請問無感BLDC的FOC控制中觀測器G1G2參數如何確定?

    無感 BLDC 的FOC控制中觀測器G1G2參數如何確定?
    發表于 04-19 06:48

    全面提升!英飛凌推出新一代碳化硅技術CoolSiC MOSFET G2

    了全面的提升。 ? 性能全方面提升 ? 英飛凌在2017年正式推出了第一代溝槽柵SiC MOSFET,即CoolSiC MOSFET G1。在CoolSiC MOSFET G1中,英飛凌采用溝槽柵
    的頭像 發表于 03-19 18:13 ?3009次閱讀
    全面提升!英飛凌推出新一代碳化硅技術CoolSiC MOSFET <b class='flag-5'>G</b>2

    戴爾全年PC銷量暴跌20%

    該機構表示,在2023年,全球PC市場的出貨量同比下降了14%,主要原因是商用和消費領域的增長均有所放緩。
    的頭像 發表于 01-22 14:07 ?1037次閱讀
    戴爾全年PC銷量暴跌<b class='flag-5'>20</b>%
    主站蜘蛛池模板: 免费在线播放黄色| 俺去操| 上一篇26p国模| 四虎影院成人| 欧美日韩亚洲国内综合网俺| 免费毛片网| 天天在线天天综合网色| 日本内谢69xxxx免费| 性欧美暴力猛交69hd| 国产免费成人在线视频| 午夜视频你懂的| 久草资源在线播放| 黄视频在线观看网站| 五月情网| 免费一级欧美片在线观看| 午夜免费福利在线| 亚洲综合区图片小说区| 日韩在线天堂免费观看| 亚洲加勒比在线| 中文字幕在线一区| 五月婷婷综合激情网| 可以直接看的黄址 | 在线毛片免费| 日本最新免费网站 | 奇米影视一区| 最黄毛片| 欧美啪啪精品| 奇米福利视频| 亚洲美女激情视频| www.黄色一片| 亚洲欧美一区二区三区图片 | 四虎黄色| 悠悠影院欧美日韩国产| 爽好舒服快小柔小说| 色清片| 99色在线| 456成人免费高清视频| 一级特黄毛片| 国产综合久久久久影院| 激情福利视频| 中文字幕第15页|