我目前正在使用Apache HBase的库存配置,RegionServer堆为4G,BlockCache大小为40%,因此大约为1.6G。没有配置L2 / BucketCache。
以下是对RegionServer的~2K请求之后的BlockCache指标。正如你所看到的那样,已经有人被驱逐,可能会导致一些失误。
当我们甚至接近极限时,他们为什么被驱逐?
大小2.1 M正在使用的块缓存的当前大小(字节)
Free 1.5 G当前可用于存储更多缓存条目(字节)的总可用内存
计数18块缓存中的块数
被驱逐的14被驱逐的街区总数
驱逐1,645驱逐的总次数
平均10,984个驱逐时间(秒)的平均年龄
StdDev 5,853,922逐出时间的街区年龄标准偏差
点击1,861次缓存命中的号码请求
点击缓存1,854个缓存命中块请求,但只有在未命中时才设置为缓存块的请求
未命中58阻止缓存未命中但设置为缓存丢失块的请求
未命中缓存58阻止缓存未命中但仅设置为使用块缓存的请求
命中率96.98%命中数除以总请求数
答案 0 :(得分:6)
您所看到的是LRU处理具有三个优先级的块的影响:单访问,多访问和内存。对于默认的L1 LruBlockCache
类,可以使用(括号中的默认值)设置它们的缓存份额:
hbase.lru.blockcache.single.percentage
(25%)hbase.lru.blockcache.multi.percentage
(50%)hbase.lru.blockcache.memory.percentage
(25%)对于4 GB堆示例,以及为缓存预留的40%,您有1.6 GB堆,根据上述百分比,每个优先级进一步分为400 MB,800 MB和400 MB。
当从存储加载块时,它通常被标记为单一访问,除非它所属的列族已配置为IN_MEMORY = true
,将其优先级设置为内存中(显然)。对于单访问块,如果另一个读访问请求相同的块,则将其标记为多访问优先级。
LruBlockCache
有一个内部逐出线程,每10秒运行一次,并检查每个级别的块是否超过其允许的百分比。现在,如果您扫描一个较大的表,并假设缓存完全为空,则所有块都标记为单一访问。如果表的大小为1 GB,则已将1 GB加载到400 MB的缓存空间中,然后驱逐线程将在适当的时候减少。实际上,根据扫描的时间长短,驱逐线程的10秒在扫描期间会消失,并且一旦超过25%的阈值就会开始逐出块。
驱逐将首先驱逐来自单访问区域的块,然后是多访问区域,最后,如果堆上仍然存在来自内存区域的压力。这也是为什么要确保内存标记列系列的工作集不超过配置的缓存区域的原因。
你能做什么?如果您主要拥有单一访问块,则可以调整上述百分比,以便为LRU的单一访问区域提供更多内容。