Hbase offHeap(堆外內存)測試
blockcache是hbase中的讀緩存,其主要組成包括LruCache和bucketCache,LruCache使用堆內內存,BucketCache使用堆外內存。本文是想對比hbase只用堆內內存作爲讀緩存(即只用LruCache)以及嘗試配置BucketCache。以觀察是否可以來減少GC,提高集羣性能。
一、配置
使用兩臺同等規格的服務器,簡稱爲主機A和主機B.
hbase使用堆內存總量均爲8000M。
主機A爲不配置堆外內存的主機,只使用0.39*8000=3120M堆內內存。相關參數爲
<property>
<name>hfile.block.cache.size</name>
<value>0.39</value>
</property>
主機B配置了堆外內存和堆內內存,堆內內存爲0.1*8000=800M,堆外內存爲3172M,由於使用雙重緩存後只有indexblock和bloomblock會存在堆內,datablock都會存在堆外,這一配置基本合理且總讀緩存大小和主機A相差不大。由於設置相關參數爲
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.1</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>3172</value>
</property>
HBASE_OFFHEAPSIZE = 4G
二、測試方式。
主要觀察點是讀時間和GC情況。
使用hbase自帶的性能評估工具HBase performanceEvaluation來做讀寫測試。
具體腳本如下
#首先寫入一億數據。
hbase pe --rows=100000000 --nomapred sequentialWrite 1 >> newTest.log 2>&1
#flush成hfile
echo "flush '"TestTable"'" | hbase shell
#重啓hbase將gc數量歸零
dbserver.sh restart_server_all hbase >> newTest.log 2>&1
sleep 60s
#讀取數據1000W數據10次
for((i=0;i<=10;i++)); do
hbase pe --rows=10000000 --nomapred randomRead 1 >>newTest.log 2>&1
done
sleep 600s
#讀取100W數據重複100次
for((i=0;i<=100;i++)); do
hbase pe --rows=1000000 --nomapred sequentialWrite 1 >> newTest.log 2>&1
hbase pe --rows=1000000 --nomapred randomRead 1 >> newTest.log 2>&1
done
#最後打印gc情況
jstat -gcutil `jps |grep HRegion|awk '{print $1}'` >> newTest.log 2>&1
三.測試結果比較
1、 所有讀取總時間比較
採集了讀取時間的信息,發現總體來講A、B不存在明顯的讀性能差異。
2、gc情況比較
測試完成後觀察兩個機器的GC情況,發現使用堆外內存的相比未使用的,YGC還是FGC次數都相當,總的GC時間
縮短,主要體現在YGC時間縮短約20s。YGC時間減少是由於存放在堆內內存的block減少.
3、BlockCache使用情況
hbase-root-regionserver-node1.log日誌會每五分鐘打印一次目前BlockCache使用情況,觀察A、B在讀取數據階
段(09/07 18:30- -09/08 8:50)的BlockCache。
主機A只使用堆內內存(LruCache),初始化blockcache如下:
在讀取過程中基本保持着固定的緩存(1020.01MB)
主機B使用堆外內存和堆內內存組合的CombinedCache,初始化BlockCache如下:
在讀取過程中基本保持着固定的緩存,其中堆內內存使用量極少,因爲DataBlock大部分在堆外存儲
(1008.39MB)
4、其他的情況說明
之前通過調用thrift讀接口的方式進行測試,但發現BlockCache佔用不明顯,因此改用HBase PE來測試。自寫的程
序效果不明顯的主要原因是DBE中HBase有10W的最大讀取量,且offset總是從0開始,除非是非常長時間的讀取,
否則10W讀取量只佔很少的BlockCahce。HBase PE雖然也是offset從0開始,但是沒有對於讀取量的限制,一次性
讀取儘量多的數據,BlockCache的佔用就可以明顯的看出。
四. 總結
配置了堆外內存的機器和未配置的相比:
1、讀性能接近,沒有明顯區別。
2、使用上述測試用例,YGC次數和FGC次數差別不大,但是YGC的時間從29s降爲9s,有20s的縮短
作者:蛋撻
日期:2018.12.12