HBase性能調(diào)整:Java GC

2018-09-19 16:06 更新

Java

GC和Apache HBase

垃圾回收(GC)機制長時間暫停

在Todd Lipcon的演示中,使用MemStore-Local Allocation Buffers避免使用完整的GC(http://www.slideshare.net/cloudera/hbase-hug-presentation),描述了HBase中常見的兩種停止垃圾收集的情況,特別是在加載過程中;CMS故障模式和和老一代堆碎片帶來的。

要解決第一個問題,請通過添加-XX:CMSInitiatingOccupancyFraction默認值并將其設置為默認值來啟動早于默認值的CMS 。從60%或70%開始(降低閾值,完成的GCing越多,使用的CPU越多)。

為了解決第二個碎片問題,Todd補充實驗設施(MSLAB,全稱是 MemStore-Local Allocation Buffer),必須在Apache HBase 0.90.x明確啟用(它默認是在Apache HBase 0.92.x的)。在你的Configuration中設置hbase.hregion.memstore.mslab.enabled為true。最新的JVM更好地考慮碎片,因此請確保您運行的是最新版本。在消息中讀出,識別由碎片引起的并發(fā)模式故障。請注意,啟用后,每個MemStore實例將至少占用一個MSLAB內(nèi)存實例。如果您有數(shù)千個區(qū)域或許多區(qū)域,每個區(qū)域都有許多列族,那么MSLAB的這種分配可能會負責堆分配的很大一部分,并且在極端情況下會導致OOME。在這種情況下禁用MSLAB,或者降低它使用的內(nèi)存量,或者減少每個服務器的區(qū)域。

如果您的工作負載很大,請查看HBASE-8163 MemStoreChunkPool:使用MSLAB時對JAVA GC的改進(https://issues.apache.org/jira/browse/HBASE-8163)。它描述了在寫入負載期間降低Young代GC數(shù)量的配置。

如果你沒有安裝HBASE-8163,和你想提高你的Young代GC時間,那么需要考慮的一個技巧是在hbase-env.sh中設置GC配置-XX:PretenureSizeThreshold,讓它的大小比hbase.hregion.memstore.mslab.chunksize的大小要小一些,所以MSLAB分配直接發(fā)生在tenured空間而不是Young代。你這樣做是因為這些MSLAB分配無論如何都可能使它成為Old代,而不是在eden空間中承受來自s0和s1之間的復制的代價,然后在MSLAB取得了足夠的tenure后,從Young代復制到Old代,這節(jié)省了一點YGC流失并直接分配到Old代。

還要考慮啟用堆外塊緩存。這已被證明可以緩解GC暫停時間。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號