[ 
https://issues.apache.org/jira/browse/HBASE-22504?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16852619#comment-16852619
 ] 

Anoop Sam John commented on HBASE-22504:
----------------------------------------

Good find..  +1
Could check for the perf after this fix?  
When the class was introduced, seems no one used it and so left with that impl. 
The comment says so too.  Could you see any other APIs (used now or even not 
used) in MBB with this way of non optimized impl? Better we correct all of 
those.

> Optimize the MultiByteBuff#get(ByteBuffer, offset, len)
> -------------------------------------------------------
>
>                 Key: HBASE-22504
>                 URL: https://issues.apache.org/jira/browse/HBASE-22504
>             Project: HBase
>          Issue Type: Sub-task
>            Reporter: Zheng Hu
>            Assignee: Zheng Hu
>            Priority: Major
>         Attachments: HBASE-22504.HBASE-21879.v01.patch
>
>
> In HBASE-22483,  we saw that the BucketCacheWriter thread was quite busy 
> [^BucketCacheWriter-is-busy.png],  the flame graph also indicated that the 
> ByteBufferArray#internalTransfer cost ~6% CPU (see 
> [async-prof-pid-25042-cpu-1.svg|https://issues.apache.org/jira/secure/attachment/12970294/async-prof-pid-25042-cpu-1.svg]).
>   because we used the hbase.ipc.server.allocator.buffer.size=64KB, each 
> HFileBlock will be backend  by a MultiByteBuff: one 64KB offheap ByteBuffer 
> and one small heap ByteBuffer.   
> The path is depending on the MultiByteBuff#get(ByteBuffer, offset, len) now: 
> {code:java}
> RAMQueueEntry#writeToCache
>     |--> ByteBufferIOEngine#write
>         |--> ByteBufferArray#internalTransfer
>             |--> ByteBufferArray$WRITER
>                 |--> MultiByteBuff#get(ByteBuffer, offset, len)
> {code}
> While the MultiByteBuff#get impl is simple and crude now, can optimze this 
> implementation:
> {code:java}
>   @Override
>   public void get(ByteBuffer out, int sourceOffset,
>       int length) {
>     checkRefCount();
>       // Not used from real read path actually. So not going with
>       // optimization
>     for (int i = 0; i < length; ++i) {
>       out.put(this.get(sourceOffset + i));
>     }
>   }
> {code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to