HBASE-21879 Read HFile ’s Block into ByteBuffer directly.
                
  
              1.14 MB
             
              18 页
               
              0 评论
              
| 语言 | 格式 | 评分 | 
|---|---|---|
英语  | .pdf  | 3  | 
| 摘要 | ||
文档讨论了HBASE-21879的改进措施,该措施通过将HFile的块直接读取到ByteBuffer中,以减少Java垃圾回收对RPC延迟的影响。在写入路径中,数据包从客户端接收后分配到offheap内存,直到成功写入WAL日志和Memstore。在读取路径中,优先从BucketCache读取,缓存未命中时读取HFile块。性能测试显示,HBASE-21879减少了GC压力,但在某些情况下可能对吞吐量产生更大影响。通过调整配置参数如hbase.bucketcache.size和hbase.server.allocator.buffer.size,可以优化offheap内存管理,减少堆分配,提升性能。  | ||
| AI总结 | ||
### 总结
#### 背景
为了减少Java垃圾回收(GC)对HBase 2.x中p99/p999 RPC延迟的影响,引入了off-heap读写路径。堆外内存(offheap)不会被JVM垃圾回收,因此需要显式释放内存。写路径中,客户端请求包被分配到堆外内存并保留,直到数据成功写入WAL日志和Memstore。读路径优先从BucketCache读取,若缓存未命中则从HFile读取。整个过程尽量避免堆内存分配,以降低GC压力。
#### 性能测试结果
1. **禁用BlockCache(hfile.block.cache.size=0)**:
   - **GC压力**:Young GC计数减少13.6%,Eden使用量减少81.7%。
   - **吞吐量**:Get QPS提升17.2%,平均延迟降低14.7%,P99延迟降低10.7%。
   - **堆分配**:通过堆分配火焰图发现,块的堆分配减少了95%,大部分堆分配来自DFSClient。
2. **启用BlockCache(缓存命中率~65%)**:
   - **GC压力**:Young GC计数减少20%,Eden使用量减少33%。
   - **吞吐量**:Get QPS略降3%,平均延迟增加3.4%,P99延迟增加2%。
   - 原因:缓存命中率提升导致堆外内存分配减少,GC压力差异缩小。
3. **启用BlockCache(缓存命中率~100%)**:
   - **GC压力**:Young GC计数变化不大,Eden使用量无变化。
   - **吞吐量**:Get QPS提升2.1%,P99延迟降低37.8%,P999延迟降低25%。
   - 发现:HBASE-21879对吞吐量和延迟影响不大,且在P99/P999延迟上有优势。
#### 结论
- HBASE-21879显著降低了GC压力,尤其在禁用缓存的情况下效果最明显,100% Get场景的吞吐量提升17%,Eden使用量减少81%。
- 在缓存命中率较高的情况下,GC压力差异缩小,但延迟表现仍优于未优化场景。
#### 最佳实践
1. **ByteBuffAllocator配置**:
   -buffer.size=130KB,适用于禁用BlockCache的情况。
   -globals配置:hbase.server.allocator.max.buffer.count=16131,hbase.server.allocator.buffer.size=133120。
2. **优化方向**:
   - 使用SingleByteBuff替代MultiByteBuff以简化数据结构和加快校验。
   - 优化DFSClient的堆分配。
   - 统一BucketEntry和HFileBlock的引用计数。
#### 相关工作
- HDFS优化问题:HDFS-3246, HDFS-14535, HDFS-14541, HDFS-14483。
总结来看,HBASE-21879通过优化读路径的内存分配策略,显著降低了GC压力并提升了系统性能,尤其是在堆内存分配和延迟表现上表现优异。  | ||
 P1 
 P2 
 P3 
 P4 
 P5 
 P6 
 P7 
下载文档到本地,方便使用
    
                - 可预览页数已用完,剩余
                11 页请下载阅读 -
              
文档评分 
  













          C++20's <Chrono>