色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

3天內不再提示

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

openEuler ? 來源:畢昇JDK社區(qū) ? 作者:畢昇JDK社區(qū) ? 2021-08-25 14:46 ? 次閱讀

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

現象

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

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

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

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

在該案例中,部分 GC 線程完成自己的任務,等待其他的 GC 線程。此時出現掛起,很有可能是因為發(fā)生了死鎖。所以問題很可能是由于那些尚未完成任務的 GC 線程上錯誤地使用鎖。所以使用 gdb 觀察了一下其他 GC 線程,發(fā)現其他 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 個機器字長,目的是為了確保操作時天然的原子性,它的最低位被設計為上鎖標記位,而高位區(qū)域用來存放 256 字節(jié)對齊的競爭隊列(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),然后進入睡眠,直到被喚醒后發(fā)現自己變成了法定繼承者,于是進入自旋,直到完成上鎖。

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

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

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

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

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

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

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

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

喚醒繼承者

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

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

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

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

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

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

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

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

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

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

正巧在社區(qū)的高版本上找到了一個相關的修復記錄(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 需要在讀寫端成對使用。

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

    關注

    68

    文章

    11031

    瀏覽量

    215938
  • JVM
    JVM
    +關注

    關注

    0

    文章

    160

    瀏覽量

    12516

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

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    HarmonyOS優(yōu)化應用內存占用問題性能優(yōu)化一

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

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

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

    eSATA靜電放電防護方案

    占用率,其理論傳輸速度可達到1.5Gbps或3Gbps,甚至更高版本SATA-IO可支持6Gbps,使得eSATA接口非常適合
    的頭像 發(fā)表于 02-25 16:22 ?365次閱讀
    eSATA靜電放電防護方案

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

    使用 rt-thread studio 在工程配置 C/C++構建->Behavior->parallel build 數量修改,CPU占用率沒有明顯的改變
    發(fā)表于 02-19 08:30

    主機常見問題

    一、查看cpu占用率 如果您的主機CPU占用率居高不下,那么主機很有可能已經被植入了挖礦木馬,會影響服務器上的其他應用的正常運行,需要立刻上機排查。 ? top -c ? 二、清理挖礦
    的頭像 發(fā)表于 12-17 14:50 ?501次閱讀
    主機常見問題

    CPU占用率過高的常見原因

    排查系統(tǒng)問題時,CPU 飆升是一個常見的問題。
    的頭像 發(fā)表于 10-23 09:33 ?1481次閱讀

    UCD31xx器件中的CPU鎖定機制

    電子發(fā)燒友網站提供《UCD31xx器件中的CPU鎖定機制.pdf》資料免費下載
    發(fā)表于 10-15 10:18 ?0次下載
    UCD31xx器件中的<b class='flag-5'>CPU</b>鎖定<b class='flag-5'>機制</b>

    服務器cpu占用率怎么解決

    服務器CPU占用率是一個常見的問題,它可能會導致服務器性能下降,甚至影響用戶體驗。 一、了解服務器CPU
    的頭像 發(fā)表于 10-10 15:14 ?1616次閱讀

    JVM xmx, xms等內存相關參數合理性設置

    的,提高內存占用(Memory Footprint)就有可能同時優(yōu)化這兩個標的,這篇文章就來聊聊內存相關內容。 內存占用一般指應用運行需要的所有內存,包括堆內內存(On-heap Memory)和堆外內存(Off-heap Memory) 1. 堆內內存 堆內內存是分配給
    的頭像 發(fā)表于 10-10 14:42 ?1153次閱讀

    RK3588J正式發(fā)布Ubuntu桌面系統(tǒng),絲滑又便捷!

    顯示屏顯示的分辨率為修改后的分辨率,如下圖所示。 圖 7 查看CPU占用率打開terminal窗口輸入命令查看CPU占用率,打開并拖動文件窗口,可以看見文件窗口拖動絲滑且
    發(fā)表于 08-22 13:53

    從原理聊JVM(一):染色標記和垃圾回收算法

    導讀 JAVA簡單易用的特性,能夠讓研發(fā)人員在不了解JVM的底層運行機制的情況下依舊能夠編寫出功能完善的代碼。 但是對JVM的理解,是一個程序員普通和優(yōu)秀的分水嶺。全面地了解JVM的工
    的頭像 發(fā)表于 08-20 15:25 ?462次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標記和垃圾回收算法

    聊聊JVM如何優(yōu)化

    首先應該明確的是JVM調優(yōu)不是常規(guī)手段,JVM的存在本身就是為了減輕開發(fā)對于內存管理的負擔,當出現性能問題的時候第一時間考慮的是代碼邏輯與設計方案,以及是否達到依賴中間件的瓶頸,最后才是針對JVM
    的頭像 發(fā)表于 08-05 17:49 ?703次閱讀
    聊聊<b class='flag-5'>JVM</b>如何優(yōu)化

    JAVA應用CPU跳點自動DUMP工具

    問題。如果CPU使用率過高,可能表示系統(tǒng)存在資源瓶頸,需要進行優(yōu)化或升級。 CPU監(jiān)控的難點 現有的監(jiān)控平臺提供了多種方式來獲取容器和JVMCPU
    的頭像 發(fā)表于 08-05 17:48 ?706次閱讀

    互斥和自旋的實現原理

    互斥和自旋是操作系統(tǒng)中常用的同步機制,用于控制對共享資源的訪問,以避免多個線程或進程同時訪問同一資源,從而引發(fā)數據不一致或競爭條件等問題。 互斥(Mutex) 互斥
    的頭像 發(fā)表于 07-10 10:07 ?927次閱讀

    自旋和互斥的使用場景是什么

    自旋和互斥是兩種常見的同步機制,它們在多線程編程中被廣泛使用。在本文中,我們將介紹自旋和互斥的使用場景,以及它們在不同場景下的優(yōu)勢和
    的頭像 發(fā)表于 07-10 10:05 ?1385次閱讀
    主站蜘蛛池模板: 色橹橹欧美在线观看视频高清 | 97国产精品久久精品国产 | 亚洲国产成人私人影院 | 久久久免费观成人影院 | 亚洲精品国产国语 | 精品国产美女AV久久久久 | 狠狠狠狠狠狠干 | 国产GV天堂亚洲国产GV刚刚碰 | 国产在线精品视频二区 | 久久免费看少妇级毛片蜜臀 | 国产精品午夜小视频观看 | 小小水蜜桃视频高清在线播放 | 芭乐视频网页版在线观看 | 久久99re66热这里只有精品 | 国产呦精品一区二区三区下载 | 久久久久久免费观看 | 伊人久久影院 | 龙岩综合频道 | 麻豆精品2021最新 | 污污又黄又爽免费的网站 | 女性酥酥影院 | 蜜桃视频无码区在线观看 | 乡村教师电影版 | 久久久久久久久女黄9999 | 美女坐脸vk | 无止侵犯高H1V3无止侵犯 | 国产精品一区二区亚瑟不卡 | 国产精品女主播主要上线 | 久久久97丨国产人妻熟女 | 十分钟视频影院免费 | 国产又色又爽又刺激在线播放 | 草草久久久无码国产专区全集观看 | 欧美成人中文字幕在线看 | 99re久久这里只有精品 | 国产欧美一区二区三区久久 | 无码AV动漫精品一区二区免费 | 黄色aa大片| 午夜福利试看120秒体验区 | 国产成人无码区免费内射一片色欲 | 美女扒开屁股让男人桶 | 国产高清免费视频免费观看 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品