導語:開源操做系統年度技術會議(Open Source Operating System Annual Technical Conference,簡稱 OS2ATC)已經連續成功舉辦了八屆。該會議旨在促進我國操做系統及其相關領域的教學、研究與產業發展,增強學術交流,展現產業界成果,是中國地區頗具規模的技術盛會。html
第八屆OS2ATC大會於2020年12月27日,在北京中科院計算技術研究所舉行。在」編程技術」分會上,騰訊高級工程師傅傑博士發表了《Kona JDK數據科學實踐》的演講。如下爲演講實錄:java
你們下午好!首先,要特別感謝組委會精心準備了此次線下和線上相結合的學習和交流的機會。很高興能跟你們分享Kona JDK在數據科學領域實踐的相關內容。我是來自騰訊JVM團隊的jiefu(傅傑),OpenJDK社區的Committer,目前主要從事Kona JDK在大數據和機器學習等領域的探索和實踐。我畢業於中科院計算所,在此也謹表明計算所對你們的到來表示歡迎和感謝!git
今天,我首先向你們簡單介紹一下Kona JDK;隨後,經過幾組真實的數據,向你們展現編程語言在數據科學領域面臨的巨大挑戰;最後,分享爲了應對上述挑戰所進行的實踐和嘗試,但願對你們能有所啓發。github
Kona:JDK15中國企業貢獻第一編程
Tencent Kona是騰訊基於OpenJDK研發的一款JDK產品,於2019年免費對外開源(https://github.com/Tencent/TencentKona-8),並提供長期支持(LTS)。Kona發佈的版本都通過了騰訊雲和內部超大規模生產環境的驗證,歡迎你們下載使用。小程序
2020年9月JDK15正式對外發布,Kona貢獻度在中國企業排名第一,而且在國內歷史首次做爲全球Notable貢獻者被OpenJDK社區主導者Oracle公司點名致謝(https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15)。騰訊成立了專門的JVM研發團隊(含多位OpenJDK社區的 author/committer),負責Kona的研發和維護。在解決公司內部迫切需求的同時,團隊高度重視對外開源工做,參與了包括jdk(jdk17/16/15/14/11u/8u), Panama和Loom等OpenJDK社區重要項目。僅2020年,Kona向OpenJDK社區貢獻了70多個commit,主要涉及HotSpot(JIT、Runtime和GC)、SVC、Core Libraries和Infrastructure等領域。其中比較重要的包括:HotSpot核心模塊9個patch、Vector API AVX512向量支持 6個patch、map大堆Heap Inspection並行加速優化4個patch。將來,Kona將以更加開放的姿態,積極擁抱開源,並持續貢獻開源。數組
數據科學場景的挑戰微信
接下來,經過幾組業務系統的數據,向你們量化地展現編程語言在數據科學領域所面臨的巨大挑戰。上圖左邊的數據來源於騰訊雲大數據平臺。目前,該平臺每日須要處理的實時計算量達到了萬億次,足以支撐起萬億級維度的模型訓練,對現代編程語言的算力提出了很是嚴苛的要求。右邊的數據來源於你們天天都會用到的微信的支付日誌系統。該系統每日新增的數據高達萬億條記錄,底層存儲的規模早已突破PB級別。海量的數據要求編程語言對大內存系統提供有力的支持,以高效實現增刪改查等業務邏輯。架構
因而可知,在現代數據科學場景中,編程語言在算力加速和大內存支持等方面正面臨十分嚴峻的考驗。下面,咱們以Java爲例,向你們展現爲了應對上述挑戰Kona所進行的相關實踐。oracle
JVM CPU算力加速
因爲涉及大量向量和矩陣運算,SIMD(Single Instruction Multiple Data)指令是數據科學領域進行CPU算力加速的首選。SIMD加速,一般又被稱爲「向量加速」,具備效果顯著、成本低廉的特色,愈來愈受到現代編程語言的青睞。其原理是將多個標量運算優化爲更高效的向量運算,以充分發掘處理器向量部件的功能。例如,考慮下圖中的for循環代碼片斷。若是使用常規的標量指令實現,須要16次數組讀操做、8次數組寫操做和8次數組元素加法操做;若使用向量指令,僅須要2次數組向量讀操做、1次數組向量寫操做和1次數組元素向量加法操做。所需操做總次數由32次降爲4次,故理論分析出向量加速的效果十分顯著。
那麼,實際狀況果然如此嗎?下面以HotSpot Java虛擬機的C2編譯器爲例,展現SIMD編譯優化先後的對比。左圖使用普通的標量指令,需生成24條指令。而右圖使用SIMD優化,僅需1條向量指令。故實際狀況與理論分析高度吻合。
長期以來,Java的SIMD加速主要依賴JNI、Intrinsic和自動向量化等方案。但它們的缺點十分明顯。例如,JNI編碼維護難,且可移植性差;Intrinsic缺少通用性和可擴展性;自動向量化條件苛刻,很是脆弱。爲了解決Java的SIMD短板,OpenJDK提出了Vector API的編程接口,目前主體代碼已經合併到了JDK16的開發分支,但至今仍處於孵化階段。Vector API旨在提供一個簡明易用且平臺無關的SIMD加速接口。「編程可信」是Vector API最引人注目的設計目標。該目標保證使用Vector API編寫的代碼生成預期的SIMD指令。固然,這裏的隱含的前提是處理器硬性必須支持相應的向量指令。「優雅回退」指在缺乏向量支持的機器上,Vector API代碼會自動回退到標量形式執行等價語義,而且性能不發生顯著回退。
Vector API對數據科學領域許多場景具備顯著加速效果。例如,根據OpenJDK社區公佈的數據,浮點向量點積運算爲14~16倍加速;浮點矩陣乘法運算爲2~5倍加速。而在騰訊機器學習模型訓練系統中,也可得到高達50%以上的優化效果。Vector API現已集成到Kona JDK11向量版本中,而且在實際業務系統中經過了長時間的生產驗證。在實際業務的聯合測試中,咱們發現並修復了多個Vector API AVX512向量支持的Bug,並所有貢獻到了OpenJDK社區,部分Bug列表以下圖紅框所示。
實踐中,咱們還發現了一個很是有意思的現象。以下圖左側所示,在對Vector API的一段小程序進行性能分析時,咱們發現性能呈現大幅抖動的現象:要麼2000+毫秒,要麼5000+毫秒,而且呈明顯的兩點分佈式統計規律。後來,通過仔細分析,確認性能的大幅波動由向量的非對齊訪存致使。從處理器微架構層面分析,測試機Cache行長度爲64字節,若使用256位的向量對cache進行訪問,容易出現非對齊的向量訪存。考慮讀取一個256位向量的情形:1)若對齊,則僅需訪問一個Cache行,共一次訪存操做;2)若非對齊,則須要訪問兩個Cache行,至少兩次訪存操做,而且還須要進行額外的數據拼接操做。所以,爲了儘量發揮SIMD指令的性能,應儘量減小非對齊的向量訪存操做。
JVM(超)大堆無暫停GC
下面跟你們展現Java如何強化對大內存的支持。長期以來,Java在大堆上一直存在GC停頓過大的痛點。傳統的垃圾收集器可支持的堆空間一般只有幾十個G。然而,部分業務所需的堆大小早已突破了百G的規模,而且呈逐年增加的趨勢。爲了解決(超)大堆的GC停頓問題,Java引入了一款名爲ZGC的新型垃圾收集器。ZGC被設計爲最大可支持TB級別的堆,最大GC暫停保證不超過10ms,而且對業務吞吐量的影響小於15%。
下圖展現了ZGC在騰訊某延遲敏感型業務場景的實踐效果。優化前,系統只能達到3個9的實時性要求;優化後,實現了5個9的強實時性突破,而且吞吐量也得到了約15%的提高。Kona的實踐代表:ZGC是超大堆或者延遲敏感型業務的首選。
小結
Vector API和ZGC有效解決了現代數據科學場景對Java的挑戰。同時,現有大數據技術棧/生態主要基於JVM構建,而且存在海量的Java生產系統、工具和編程類庫,使得Java具有無可比擬的研發和維護效率。此外,Java生態還得到了世界頂級廠商的鼎力支持和背書。相信Java/JVM將來將持續在大數據和機器學習領域扮演重要角色!謝謝你們。
另外,歡迎你們關注和star Tencent Kona JDK 8:https://github.com/Tencent/TencentKona-8,同時也歡迎各位優秀的開發者加入騰訊JVM研發團隊,掃描下方二維碼,來加入咱們吧!
參考資料
[1]JDK15簡介:
https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15
[2]Kona JDK源代碼:
https://github.com/Tencent/TencentKona-8
[3]騰訊大數據平臺最新數據:
https://new.qq.com/omn/TEC20200/TEC2020091100744400.html
[4]微信支付萬億日誌在Hermes中的實踐:
https://www.infoq.cn/article/N9DsUee4tTrktXmVmVAP
[5]Vector API源代碼:
https://github.com/openjdk/panama-vector
[6]Kona11揭祕:
https://cloud.tencent.com/developer/article/1627658
[7]Vector API資料:
https://static.rainfocus.com/oracle/oow19/sess/1553206138311001UVQD/PF/OCO19-Vector_API_1569011845017001idU3.pdf
[8]ZGC:
http://cr.openjdk.java.net/~pliden/slides/ZGC-FOSDEM-2018.pdf
掃碼關注 | 即刻了解騰訊大數據技術動態