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 页请下载阅读 -
文档评分