日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell

發布時間:2024/8/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介:?你要知道的關于Alibaba Dragonwell一些重要優化措施。

今年四月五日,阿里云開放了新一代ECS實例的邀測[1],Alibaba Dragonwell也在新ECS上進行了極致的優化。相比于之前的dragonwell_11.0.8.3版本,即將發布的dragonwell_11.0.11.6在SPECjbb2015[2] composite模式測試中,系統吞吐量max-jOPS提升55%,響應時間約束下的系統吞吐量critical-jOPS提升602%

如下圖所示,圖中數據做了歸一化處理,以11.0.8.3_GA的critical-jOPS為1個基準單位。測試環境:阿里云80核,256g內存ECS實例,操作系統為Alinux3 [3]。

Alibaba Dragonwell

過去的十幾年中,Java在阿里巴巴內部迅猛發展。阿里內使用Java語言編寫的應用越來越多,數萬的Java開發者每年產出超過十億行Java代碼,這些代碼都運行在阿里巴巴內部的OpenJDK定制版AJDK上。

Alibaba Dragonwell是AJDK的開源版[4](github鏈接見文章末尾),使用和OpenJDK一樣的License,并永久免費。Alibaba Dragonwell有8和11兩個版本,于2019年開源,當時僅支持x86-64架構,在2020年擴展到AArch64平臺。

Alibaba Dragonwell結合阿里在線電商、金融、物流等各個業務場景做了大量細致優化,添加了協程/多租戶/Jwarmup等諸多自研特性,并且在阿里云超大規模的服務器集群上經受了長時間大規模的驗證。

調優方案與工具

由于SPECjbb2015動輒就需要兩個小時才能得到一次完整的跑分分數,為了壓榨性能調優單位時間內我們所能獲得的信息量和性能試驗的效率,我們開發了自動測試平臺和性能分析工具來輔助SPECjbb2015性能調優,并且這套方法可以用在未來更多類似的性能調優案例中。

自動測試平臺可以自動發起測試,并且在測試過程中調用基于perf的性能分析工具來采集CPU微架構數據以及系統熱點數據,從而收集到每次實驗過程中的關鍵性能數據,并將數據存檔以可視化界面的形式展現,方便未來回顧和分析。

同時為了避免SPECjbb2015單次實驗耗時長影響效率,跑性能實驗時我們采用了SPECjbb2015特殊的PRESET模式。該模式下可以指定壓力指定時間來啟動性能測試,不僅方便調優系統進行性能采集,還可以觀察在一定壓力下SPECjbb2015的系統熱點和微架構數據情況。

我們通過該套調優系統獲取到了Alibaba Dragonwell和其他JDK在跑SPECjbb2015時的熱點和微架構數據,并且發現了諸多優化機會,如在GC熱點和暫停時間上有較為明顯的問題,從而深入到相關代碼,并以性能數據為線索解決了相關的性能問題,具體的技術細節將在下文中向大家一一道來。

GC暫停時間優化

這項優化源于一個出人意料的發現,在SPECjbb2015中GC暫停時間竟然超過了總運行時間的20%,并且穩定復現。

通過上一小節中提到的調優系統,定位到出問題的是一個GC任務隊列相關函數,并且明確的指向了原子Compare and Swap(CAS)相關代碼。

新ECS采用的CPU架構中CAS主要有如下的兩種實現方式:

  • 使用帶load-aquire和store-release語義的指令對的實現方式
  • LSE指令集中的CAS專項指令

多數JVM在GC中使用第一種方法,然而第二種在高沖突的情況下性能更加出色,因此Dragonwell改變了編譯方式,使用LSE指令集實現CAS,有效的減少了暫停時間。下圖展示了優化效果,我們采集了SPECjbb2015運行在不同核數上的GC數據,并采用吞吐量作為衡量GC性能的指標。 ? ?

吞吐量 = (運行時間 – Stop-The-World時間)/運行時間 * 100%

我們可以看到優化前的CAS方式會造成吞吐量隨使用的核數增加而劇烈下降,在80核的情況下甚至不足80%,而使用LSE CAS后吞吐量穩定在99%以上

對這個優化的另外兩點補充說明:

1. 此改動只針對JVM內部的CAS實現,不包括JIT(Just-In-Time)生成的代碼。JIT會動態檢查硬件特性,在支持LSE指令集的系統上會優先使用LSE指令集。

2. 除了使用LSE CAS外,改變GC隊列算法減少CAS也可以達到減少暫停時間的效果,OpenJDK社區在新版本中采用了這種方法。不過兩種辦法并不沖突,Alibaba Dragonwell同時采用了兩種優化,達到了最優效果。

快速序列化

Alibaba Dragonwell在保證兼容性基礎上對java原生序列化進行了優化通過緩存大幅提高了性能。通過分析發現, 原生序列化瓶頸大多在于大量的class 查找,如在反序列化時需要獲取對端類定義的元信息等。引入了一層通過類全限定名和類加載器映射到java類對象的緩存,減少了大量Class.forName的調用。

具體做法:在反序列化時獲取到類描述符,再根據類描述符查找信息時將會受限從classCache中查找,命中則立即返回,如果沒有找到當前classloader和類全限定名唯一指定的類對象,將會走默認的類查找流程并且將結果緩存。同時, 在反序列化時會大量調用latestUserDefinedLoader 來查找首個用戶定義的類加載器,因為此過程較重(涉及一次JNI調用和爬棧)也進行了緩存。

指令融合

指令融合是指將多個指令使用效率更高的一條或者幾條指令進行替換從而提高性能。

Dragonwell對內存屏障/內存讀寫/比較跳轉等多個場景做了優化,由于篇幅限制而且此類優化原理較為類似,在此僅舉一例,三條指令融合成一條,如下圖所示。

上面介紹了Alibaba Dragonwell內部的一些優化,下面我們換一個角度,從參數調優方面介紹對SPECjbb2015的優化。

大內存系統開啟壓縮指針

SPECjbb2015是一個內存敏感型的測試,壓縮指針對SPECjbb2015分數的提升非常明顯。不過默認情況下使用壓縮指針最大只能用32g內存,這對80核的系統來說實在是太小了。其實通過適當的參數組合,我們完全可以在更大的內存中使用壓縮指針。

首先我們了解下壓縮指針的基本原理。如上圖所示,由于Java對象有明確的對齊要求,因此對象的地址必然由數個0結尾,0的個數由對齊位數決定。省略java對象地址結尾的數個0可解決內存而且不會丟失有效地址信息,需要訪問對象時可以通過補0獲得完整的地址。

由此可知,我們可以通過調整Java對象對齊位數控制壓縮指針生效的最大內存。默認情況下Java為8字節對齊(3bit),加上壓縮指針本身的的32bit,最多只能表示32g內存。但如果調整為32字節對齊,那么有37bit可以使用,也就是128g,這對于80核來說基本上夠用了。

分層編譯調優

分層編譯是JVM最基礎的機制之一,一般情況下對它改動比較少,不過在SPECjbb2015的場景下,在分層編譯上仍有調優空間。首先介紹下分層編譯。JVM在運行的時候動態的將字節碼編譯成機器碼執行,JVM(hotspot)內部編譯引擎主要有三個:

  • 解釋器:無編譯開銷,但解釋執行效率很低。
  • C1編譯器:編譯開銷較低,生成代碼質量一般。
  • C2編譯器:生成代碼質量很高,但編譯開銷很高。
  • 這三個編譯引擎相互配合,執行次數較少的代碼由解釋器和C1負責,C2只編譯熱點代碼,從而讓Java可以達到峰值性能與編譯開銷的平衡,使應用運行更加平滑。

    不過分層編譯也有自己的缺點,一個較為明顯的問題是它會增大生成代碼的總量。下圖展示SPECjbb2015運行時C1/C2編譯方法數目。

    圖中Level1-3均為C1編譯,根據收集運行信息的力度不同分為了三個等級,Level4為C2編譯。我們可以看到C1編譯了70%的方法,因此關閉分層編譯,僅保留C2編譯器可以減少生成代碼,從而一定程度上提高高速緩存和葉表命中率。

    對于SPECjbb2015來說,由于分數只取決于最后幾分鐘的峰值處理能力,前面大概兩個小時的請求爬升階段都可以視作預熱,因此啟動期的編譯開銷并不關鍵。我們可以關閉分層編譯來減少生成代碼,提高高速緩存和列表命中率。最終在測試中發現關閉分層編譯生成代碼總量由29M降低到9M,有明顯減少。

    本文總結了Alibaba Dragonwell的一些重要優化措施,請注意阿里承諾會持續的優化Dragonwell性能,同時更緊密地和OpenJDK等開源社區協作,貢獻更多的定制化特性,促進Java技術的持續發展。

    引用

    [1] https://www.aliyun.com/daily-act/ecs/ecs_arm
    [2] SPECjbb2015是一款模擬電商應用的權威基準測試程序,包含了購買下單、折扣優惠、庫存計算、客戶數據存儲與分析等典型電商應用行為:https://www.spec.org/jbb2015/
    [3]Alinux3:Alibaba Cloud Linux是阿里云推出的Linux發行版,它為云上應用程序環境提供Linux社區的最新增強功能,在提供云上最佳用戶體驗的同時,也針對阿里云基礎設施做了深度的優化https://help.aliyun.com/document_detail/212631.html
    [4] Alibaba Dragonwell是阿里巴巴開源JDK:https://github.com/alibaba/dragonwell8https://github.com/alibaba/dragonwell11

    云上年中鉅惠注冊抽好禮!
    8月31日前,用戶注冊登錄阿里云即可抽iPhone12 Pro、Cherry機械鍵盤、天貓精靈等好禮!馬上點此免費抽獎:http://click.aliyun.com/m/1000289891/

    原文鏈接
    本文為阿里云原創內容,未經允許不得轉載。

    總結

    以上是生活随笔為你收集整理的JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。