調(diào)優(yōu)region server還是master
需要為region server增加參數(shù)娇跟,而master并不會是個問題岩齿,因為它并不處理大負(fù)載,數(shù)據(jù)并不通過它苞俘。調(diào)優(yōu)參數(shù)只需要加到region server盹沈。
region server壓力
大量的workloads導(dǎo)致jre支持region server并不是很好,特別是寫特別重的情況吃谣。需要指定jre參數(shù)使得gc策略更適合大量的workloads乞封。
對于寫很重的情況做裙,內(nèi)存中頻繁的創(chuàng)建和丟棄不同大小的對象。當(dāng)數(shù)據(jù)收到內(nèi)存buffer中肃晚,需要保持到flush達到size自后寫到硬盤锚贱,new一個store file。(hbase.hregion.memstore.flush.size关串,或表級別的flush size惋鸥,表屬性或代碼)
所以在寫入到硬盤之前,這些數(shù)據(jù)會大量的占用Java heap悍缠。需要看是否被快速flush,則影響到數(shù)據(jù)在heap的新生代就被處理耐量,還是會被移到老年代飞蚓。
調(diào)優(yōu)新生代heap
可以設(shè)置gc options在 hbase-env.sh中, HBASE_OPTS或HBASE_REGIONSERVER_OPTS廊蜒。后面的只影響到region server趴拧,不會作用于master。
(-XX:MaxNewSize=128m -XX:NewSize=128m 等于 -Xmn128m)
如果新生代heap較低山叮,可能會發(fā)現(xiàn)CPU load增長著榴,因為會花費大量cpu時間用于新生代的minor gc。
輸出gc log
建議輸出gc的log屁倔。觀察concurent mode failure或者promotion failed脑又,將導(dǎo)致程序長時間停頓
(-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log)
要注意這個log并不roll,需要定時手動處理锐借。
GC種類
建議的GC種類:
(-XX:+UseParNewGC and -XX:+UseConcMarkSweepGC)
這里要考慮minor gc和full gc的程序停頓時間问麸,如果超過了zk timeout,這個server會被認(rèn)為lost钞翔。當(dāng)gc結(jié)束了會被通知已經(jīng)從集群移除严卖,并把自己關(guān)機。
CMS會盡量避免full gc布轿,除非出現(xiàn)promotion error哮笆,會導(dǎo)致stop world執(zhí)行full gc。
CMS還有額外選項汰扭,是個百分比稠肘,控制CMS何時啟動,需要避免設(shè)置導(dǎo)致 concurrent mode failuer萝毛。
(-XX:CMSInitiatingOccupancyFraction=70)
這個比例設(shè)為70%启具,略微大于region server設(shè)置的60% heap usage(默認(rèn)20% block cache和40% memstore的限制)。這樣CMS啟動會盡量早又不會太頻繁珊泳。(所以當(dāng)調(diào)優(yōu)block cache和memstore size時鲁冯,要響應(yīng)調(diào)整CMS的啟動百分比拷沸。)
最佳實踐例子
export HBASE_REGIONSERVER_OPTS="-Xms8g -Xmx8g -Xmn128m -XX:UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PringtGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log"
關(guān)于buffer和memstore
從老年代取出buffer的數(shù)據(jù)flush到硬盤的時候,會導(dǎo)致老年代的內(nèi)存空間留下一個非壓縮的內(nèi)存空間薯演,所以規(guī)定固定大小的數(shù)據(jù)去flush撞芍,會有利于這個空間的連續(xù)利用,避免了需要壓縮時導(dǎo)致的full gc出現(xiàn)跨扮。但同時也會有heap使用上的浪費序无,不能完全利用好所有小空間。
(hbase.hregion.memstore.mslab.enabled)默認(rèn)true
(hbase.hregion.memstore.mslab.chunksize)默認(rèn)2mb
(hbase.hregion.memstore.mslab.max.allocation)默認(rèn)256KB衡创,上界帝嗡,超過則會直接處理,如果很多超過上界會導(dǎo)致更早的gc停頓璃氢。
如果仍然會有長時間的gc停頓哟玷,建議收集gc的規(guī)律,并針對性的做出server的幾天或者幾周的重啟計劃一也。
需要知道巢寡,buffer會比directly的KeyValue慢一些。