翻譯自https://medium.com/graalvm/graalvm-at-facebook-af09338ac519
Facebook正在使用GraalVM來加速其Spark的作業負載,并減少記憶體和CPU的使用,請繼續閱讀,了解它們的遷移故事、性能改進結果和未來計劃,

Facebook背后的技術
擁有28億月活躍用戶的Facebook是世界上訪問量最大的平臺之一,為了保證在這種負載下的可靠性和高性能,工程團隊采用了多種技術,包括Java、JavaScript、Flow Hack、PHP、Python、c++等,
Facebook在一些關鍵領域使用了Java,如大資料(Spark、Presto等)、后端服務和移動設備,在遷移到GraalVM之前,該團隊在Java 8和Java 11上使用了Oracle JDK和OpenJDK,
在這種規模下,任何性能改進都會帶來顯著的價值——它們改善了用戶體驗并降低了基礎設施成本,這就是為什么工程團隊一直在尋找改進應用程式性能的方法,并決定評估GraalVM,以確定它是否是一個更快的Java運行時,
為什么是GraalVM
- 由于性能是一個主要考慮因素,Facebook團隊決定評估GraalVM作為他們的Java運行環境,看看它是否會提高他們的Java應用程式的性能,GraalVM提供了高級優化,比如部分轉義分析和行內啟發式,多虧了這一點,許多Java/JVM應用程式只要切換到GraalVM,就能立即獲得性能提升,Facebook團隊還觀察到,與C2相比,GraalVM在SpecJVM2008和DaCapo等基準測驗中顯示出了顯著的年進步,
- 此外,GraalVM編譯器是以模塊化和可擴展的方式使用Java從頭開始撰寫的,這使得維護變得很容易,同時還增加了增量改進,這對Facebook來說很重要,因為該團隊正在考慮對GraalVM進行長期投資,
- 社區,GraalVM專案擁有一個充滿活力的開源社區,許多組織和個人都為該專案做出了貢獻,并形成了它的路線圖,在社區中也很容易找到幫助和支持,
在GraalVM上運行Java和Spark
Facebook團隊使用了GraalVM社區作為OpenJDK的替代品,在這個場景中,遷移到GraalVM非常簡單——只需要切換運行環境,不需要更改應用程式代碼,這種轉換使得應用程式運行得更快,這得益于GraalVM的高級性能優化,無需任何手動調優,
Apache Spark是一個統一的大資料處理分析引擎,內置流、SQL、機器學習和圖形處理模塊,它處理資料的速度非常快,但許多團隊正在尋找進一步優化其性能的方法,最簡單的方法之一是在GraalVM上運行Spark作業負載,多虧了一組特定的編譯器優化(我們稍后將詳細討論),GraalVM可以顯著加快Spark的作業負載,Renaissance基準測驗套件的Apache Spark基準測驗顯示,社區的平均加速速度為1.1倍,企業的平均加速速度為1.42倍,有些基準測驗的速度高達4.84倍,

對于Facebook來說,Spark是其資料倉庫中最大的SQL查詢引擎,運行在聚合計算存盤集群上,由于資料量巨大,效率和成本的降低是當務之急,
他們從2020年初開始進行評估,由于最初的基準測驗顯示了良好的結果,團隊將gralvm推向了生產,并一直監控其性能和可靠性,

在性能方面,他們觀察到CPU使用減少了約10%,而且自推出以來,CPU的減少一直保持一致,
GraalVM如何加速Spark作業負載
對Spark性能提升貢獻最大的一些優化是:
- 多型行內,只有當編譯器能夠確定方法呼叫的目標方法時,傳統行內才能作業,GraalVM通過收集額外的分析資訊(允許也行內抽象方法),使行內超越了這一點,
- 部分逸出分析,部分轉義分析的思想是通過在物件沒有轉義的分支中執行標量替換來洗掉不必要的物件分配,并確保物件存在于必須轉義的分支中的堆中,這既減少了應用程式的記憶體占用,又減少了GC引起的CPU負載,這種優化在Spark這樣的資料密集型應用程式中更加重要,特別是,根據Facebook的觀察,GraalVM在java/lang/Double.valueOf等方法中減少了5倍的CPU消耗,
- GraalVM中的高級推測性優化通過利用動態運行時反饋產生更快的機器碼,通過推測程式的某些部分不會在程式執行期間運行,GraalVM編譯器能夠專門化代碼并使其更高效,對于Spark,通過消除分支(如長if-then-else鏈)、簡化控制流、減少回圈體中的動態檢查數量以及建立別名約束,這種優化作業得特別好,從而實作進一步的優化,
根據評估結果,Facebook團隊將大部分cpu密集型的大資料服務遷移到了GraalVM,他們還觀察到,在切換到GraalVM后,Presto的>5%的CPU和GC暫停時間提高了,接下來,該團隊計劃將GraalVM推到其他記憶體系結服務,以從escape分析優化中獲益,該團隊還計劃為專案和社區做出貢獻,
他們還在探索使用其他gralvm特性的機會,如Native Image和Truffle Framework,
結論
多虧了高級編譯器優化,GraalVM可以顯著加快許多Java和Scala作業負載,特別是,通過將GraalVM轉換為JDK發行版,Spark的作業負載有望提高10%-42%,
有趣的是,另一個流行的社交媒體平臺Twitter的工程師也分享了類似的旅程和觀察結果,在將Scala的作業負載轉移到GraalVM之后,他們觀察到顯著的性能改進,例如,多虧了GraalVM編譯器,P99延遲降低了19.9%,對于像Twitter或Facebook這樣的平臺,這種性能改進會隨著平臺規模的擴大而進一步擴大,
要開始在您的應用程式中使用GraalVM,請訪問graalvm.org/docs/getting-started/,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291816.html
標籤:其他
上一篇:Google大資料論文GFS(Google File System)介紹
下一篇:優化了破網站的搜索功能
