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

2018-09-19 16:06 更新

Java

GC和Apache HBase

垃圾回收(GC)機(jī)制長(zhǎng)時(shí)間暫停

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

要解決第一個(gè)問(wèn)題,請(qǐng)通過(guò)添加-XX:CMSInitiatingOccupancyFraction默認(rèn)值并將其設(shè)置為默認(rèn)值來(lái)啟動(dòng)早于默認(rèn)值的CMS 。從60%或70%開(kāi)始(降低閾值,完成的GCing越多,使用的CPU越多)。

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)