国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

由JVM的鎖機制導致的CPU占用率高問題

openEuler ? 來源:畢昇JDK社區 ? 作者:畢昇JDK社區 ? 2021-08-25 14:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編者按:筆者在 AArch64 中遇到一個 G1 GC 掛起,CPU 利用率高達 300%的案例。經過分析發現問題是由 JVM 的鎖機制導致,該問題根因是并發編程中沒有正確理解內存序導致。本文著重介紹 JVM 中 Monitor 的基本原理,同時演示了在什么情況下會觸發該問題。希望通過本文的分析,讀者能夠了解到內存序對性能、正確性的影響,在并發編程時更加仔細。

現象

本案例是一個典型的弱內存模型案例,大致的現象就是 AArch64 平臺上,業務掛死,而進程占用 CPU 持續維持在 300%。配合 top 和 gdb,可以看到是 3 個 GC 線程在 offer_termination 處陷入了死循環:

3e01a36e-e3d3-11eb-a97a-12bb97331649.png

多個并行 GC 線程在 Minor GC 結束時調用 offer_termination,在 offer_termination 中自旋等待其他并行 GC 線程到達該位置,才說明 GC 任務完成,可以終止。(關于并行任務的中止協議問題,可以參考相關論文,這里不做著重介紹。

簡單地說,在并行任務執行時,多個任務之間可能存在任務不均衡,所以 JVM 內部設計了任務均衡機制,同時必須設計任務終止的機制來保證多個任務都能完成,這里的 offer_termination 就是嘗試終止任務)。

在該案例中,部分 GC 線程完成自己的任務,等待其他的 GC 線程。此時出現掛起,很有可能是因為發生了死鎖。所以問題很可能是由于那些尚未完成任務的 GC 線程上錯誤地使用鎖。所以使用 gdb 觀察了一下其他 GC 線程,發現其他 GC 線程全都阻塞在一把 JVM 的鎖上:

3e318f52-e3d3-11eb-a97a-12bb97331649.png

而這把 Monitor 中的情況如下:

cxq 上積累了大量 GC 線程

OnDeck 記錄的 GC 線程已經消失

_owner 記錄的鎖持有者為 NULL

分析

在進一步分析前,首先普及一下 JVM 鎖組件 Monitor 的基本原理,Monitor 類主要包含 4 個核心字段:

“Thread * volatile _owner” 字段指向這把鎖的持有線程

“SplitWord_LockWord” 字段被設計為 1 個機器字長,目的是為了確保操作時天然的原子性,它的最低位被設計為上鎖標記位,而高位區域用來存放 256 字節對齊的競爭隊列(cxq)地址

“ParkEvent * volatile_EntryList” 字段指向一個等待隊列,跟 cxq 差別不大,個人理解只是為了緩解 cxq 的競爭壓力而設計

“ParkEvent * volatile_OnDeck” 字段指向這把鎖的法定繼承人,同時最低位還充當了內部鎖的角色

接下來通過一組流程圖來介紹加解鎖的具體流程:

3e44108c-e3d3-11eb-a97a-12bb97331649.png

上圖是加鎖的一個整體流程,大致分為 3 步:

首先走快速上鎖流程,主要對應鎖本身無人持有的最理想情況

3e5ff8ce-e3d3-11eb-a97a-12bb97331649.png

接著是自旋上鎖流程,這是預期將在短時間內獲取鎖的情況

3e6c45c0-e3d3-11eb-a97a-12bb97331649.png

最后是慢速上鎖流程,申請者將會加入等待隊列(cxq),然后進入睡眠,直到被喚醒后發現自己變成了法定繼承者,于是進入自旋,直到完成上鎖。

3e99cd9c-e3d3-11eb-a97a-12bb97331649.png

而且,基于性能考慮,整個上鎖流程中的每一步幾乎都做了“插隊”的嘗試:

3ec671c6-e3d3-11eb-a97a-12bb97331649.png

如上圖代碼中所示,“插隊”的意思就是不經過排隊(cxq),直接嘗試置上鎖標志位。

上圖就是整個解鎖流程了,顯然真正的解鎖操作在第二步中就已經完成了(意味著接下來時刻有“插隊”現象發生),剩下的主要就是選出繼承者的過程,大致分為以下幾步:

解鎖線程首先需要將內部鎖(_OnDeck)標記上鎖

從競爭隊列(cxq)抽取所有等待者放入等待隊列(_EntryList)

_ EntryList 取出頭一個元素,寫入_OnDeck 的同時解除內部鎖標記,這代表選出了繼承者

喚醒繼承者

當然伴隨著整個解鎖流程每一步的,還有對“插隊”行為的處理。

至此,JVM 鎖組件 Monitor 的原理就介紹到這里,再回歸到問題本身,一個疑問就是_OnDeck 上記錄的繼承者為何消失?作為繼承者,既然已經消失在競爭隊列和等待隊列里,顯然意味著它大概率已經持有鎖、然后解鎖走人了,所以問題很可能跟繼承者選取過程有關。基于這種猜測,我們對相關代碼著重進行了梳理,就發現了下圖兩處紅框標記位置存在疑點,那就是在選繼承者過程第 3 步中:

3ee5a3b6-e3d3-11eb-a97a-12bb97331649.png

寫EntryList 和寫_OnDeck 之間沒有 barrier 來保證執行順序,這可能出現_OnDeck 先于EntryList 寫入的情況,一旦繼承人提前持有鎖,后果就可能非常糟糕…

這里貼了一張可能的問題場景:

線程 A 處于解鎖流程中,由于亂序,先寫入了繼承者同時解除內部鎖

線程 B 處于上鎖流程,發現自己就是法定繼承者后,立刻完成上鎖

線程 B 又迅速進入解鎖流程,并從_EntryList 中取出頭元素(也就是線程 B!)作為繼承者寫入_OnDeck,完成解鎖走人

線程 A 此時才更新_EntryList,然后喚醒繼承者(也就是線程 B!),完成解鎖走人

_OnDeck 上的繼承者線程 B,實際已經完成加解鎖離開,后續等待線程再也無法被喚醒。

正巧在社區的高版本上找到了一個相關的修復記錄(JDK- 8166197),這里貼出 2 個關鍵的代碼片段:

3f6542ec-e3d3-11eb-a97a-12bb97331649.png

上面這段代碼位于慢速上鎖流程,被喚醒后檢查繼承者是否是自己,修復后的代碼在讀_OnDeck 時加了 Load-Acquire 的 barrier。

上面這段代碼位于解鎖時選繼承者流程,從_ EntryList 取出頭一個元素,寫入_OnDeck 的同時解除內部鎖標記,修復后的代碼在寫_OnDeck 時加了 Store-Release 的 barrier。

顯然,圍繞_OnDeck 添加的這對 One-way barrier 可以確保:當繼承者線程被喚醒時,該線程可以“看”到_EntryList 已經被及時更新。

總結:

在 AArch64 這種弱內存模型的平臺上(關于內存序更多的知識在接下來的分享中會詳細介紹),一旦涉及多線程對公共內存的每一次訪問,必須反復確認是否需要通過 barrier 來嚴格保序,而且除非存在有效的依賴關系,否則 barrier 需要在讀寫端成對使用。

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

    關注

    68

    文章

    11277

    瀏覽量

    224954
  • JVM
    JVM
    +關注

    關注

    0

    文章

    161

    瀏覽量

    13036

原文標題:JVM 鎖 bug 導致 G1 GC 掛起問題分析和解決

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    面試必看!排隊自旋32位變量的域劃分與核心作用

    在操作系統面試中,并發同步機制一直是高頻考點,而排隊自旋作為解決傳統自旋“饑餓” 問題的關鍵技術,其 32 位變量的域劃分更是面試官青睞的 “細節題”。不少同學能說出排隊自旋的基
    的頭像 發表于 02-09 16:54 ?806次閱讀
    面試必看!排隊自旋<b class='flag-5'>鎖</b>32位變量的域劃分與核心作用

    Linux性能分析實戰:用trace揪出卡頓、CPU的“真兇”

    做 Linux 開發或運維的你,是否常被這些問題困擾:服務突然卡頓卻找不到根源,CPU 占用率飆升但查不到 “罪魁禍首”,系統響應變慢卻摸不清瓶頸?其實,Linux 內核早已為我們準備了 “透視鏡”——trace 跟蹤技術,今天就手把手教你從生成 trace 文件到可視化
    的頭像 發表于 02-03 15:24 ?300次閱讀
    Linux性能分析實戰:用trace揪出卡頓、<b class='flag-5'>高</b><b class='flag-5'>CPU</b>的“真兇”

    基于米爾RK3576的環視實時性方案解析

    其強大的并行計算能力,耗時相比CPU降低了數倍至一個數量級,且占用率較低,證明其處理此類像素級操作的高效性。拼接環節的性能波動: 圖像拼接的耗時在16ms到100ms之間劇烈波動,這是阻礙當前方案投入
    發表于 11-28 16:57

    RDMA設計2:開發必要性之性能簡介

    或RDMA 產品及項目需求,請看B站視頻后聯系。 基于本IP設計,經過優化后得出如下性能指標及資源占用率: 1 性能指標 2 不同包模式下性能 3占用資源
    發表于 11-20 10:57

    NVMe高速傳輸之擺脫XDMA設計45:上板資源占用率分析

    Block Design 設計后進行綜合與實現, NoP 邏輯加速引擎的在不同 FPGA 平臺中的資源占用率分別如表 1 和表 2 所示。 從表中可以看到, 本課題設計的 NoP邏輯加速引擎資源
    發表于 11-13 08:36

    構建可靠網絡:硬件BFD的關鍵作用

    BFD Acceleration(BFD加速)指的是一系列通過硬件卸載或內核優化技術,將BFD報文的處理從設備的中央處理器(CPU)轉移到專用硬件或高速處理平面的方法。目標在于:在維持毫秒級檢測精度的同時,極大地降低CPU占用率
    的頭像 發表于 11-06 11:09 ?1125次閱讀
    構建<b class='flag-5'>高</b>可靠網絡:硬件BFD的關鍵作用

    Arm Neoverse CPU上大代碼量Java應用的性能測試

    Java 是互聯網領域廣泛使用的編程語言。Java 應用的一些特性使其性能表現與提前編譯的原生應用(例如 C 程序)大相徑庭。由于 Java 字節碼無法直接在 CPU 上執行,因此通常運行時在
    的頭像 發表于 11-05 11:25 ?752次閱讀
    Arm Neoverse <b class='flag-5'>CPU</b>上大代碼量Java應用的性能測試

    RK3576機器人核心:三屏異顯+八路攝像頭,重塑機器人交互與感知

    負載溫度:65℃最令人印象深刻的是其性能表現:在同時運行以上所有繁重應用時,RK3576的CPU占用率僅為34%,DDR占用率為50%。這意味著芯片仍有充足的算力余量來處理更高
    發表于 10-29 16:41

    蜂鳥E203內核優化方法

    。 修改內核參數:對蜂鳥E203的內核參數進行相應修改,可以優化內核運行效率,提高系統性能,比如調整緩存大小、內存分配策略等。 資源管理:進行有針對的資源管理,例如調度算法的修改,調整好CPU占用率等,以
    發表于 10-21 07:55

    rt-thread studio 如何進行多線程編譯?

    使用 rt-thread studio在工程配置 C/C++構建->Behavior->parallel build數量修改,CPU占用率沒有明顯的改變
    發表于 10-11 09:16

    深入剖析RabbitMQ可用架構設計

    在微服務架構中,消息隊列故障導致的系統不可用率高達27%!如何構建一個真正可靠的消息中間件架構?本文將深入剖析RabbitMQ可用設計的核心要點。
    的頭像 發表于 08-18 11:19 ?955次閱讀

    當IM設備顯示“過載導致界面無法加載”時,該如何處理?

    當 IM 設備屏幕顯示 “過載導致界面無法加載” 時,通常伴隨設備運行異響、指示燈異常閃爍等現象。IM 設備的過載保護機制通過傳感器實時監測設備運行狀態,一旦檢測到電流過載、溫度超標或系統資源占用率
    的頭像 發表于 06-28 11:34 ?904次閱讀

    IM 系列設備過載保護機制下界面初始化中斷的底層邏輯與解決方案

    一、過載保護機制與界面初始化的關聯基礎 IM 系列設備的過載保護機制是保障設備安全運行的核心功能,其通過傳感器實時采集設備運行參數,如電流、電壓、溫度、系統資源占用率等。一旦這些參數超出預設閾值
    的頭像 發表于 06-27 09:58 ?541次閱讀

    HarmonyOS優化應用內存占用問題性能優化一

    一、 概述 用戶功能的不斷增強,應用越來越復雜,占用的內存也在不斷膨脹,而內存作為系統的稀缺資源比較有限,當應用程序占用過多內存時,系統可能會頻繁進行內存回收和重新分配,導致應用程序的性能下降,甚至
    發表于 05-21 11:27

    PCIe-8624千兆網卡:工業級多設備協同場景設計的PoE網卡

    采用4顆獨立Inteli211-AT控制器芯片,支持-10℃~70℃寬溫工作智能中斷節流機制(InterruptThrottling)可將CPU占用率降低60%以
    的頭像 發表于 05-07 16:13 ?1088次閱讀
    PCIe-8624千兆網卡:工業級多設備協同場景設計的PoE網卡