hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Zephyr Guo (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-14490) [RpcServer] reuse request read buffer
Date Fri, 09 Oct 2015 13:44:26 GMT

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

Zephyr Guo commented on HBASE-14490:
------------------------------------

{quote}We keep on adding to the reqTotalSize. Possible overflow?{quote}
It can hold 8000TB.For more correct, we can calculate average by other way.

{quote}If we do to this extend and handle both smaller sized reqs and larger sized (write
req) we better use a BufferPool?We already have it and using it while sending back response.{quote}
I know {{BoundedByteBufferPool}} and I think it does not fit request.
Look at the {{getBuffer()}}.
{code}
  public ByteBuffer getBuffer() {
    ByteBuffer bb = null;
// It can cause blocking. We don't need lock because Reader is single-thread.
// If we use a BoundedByteBufferPool in all Reader, we will increase possible of blocking.
// If we maintain a buffer in Connection, we can get most suitable size for specific client.
    lock.lock();
    try {
      bb = this.buffers.poll();
      if (bb != null) {
        this.totalReservoirCapacity -= bb.capacity();
      }
    } finally {
      lock.unlock();
    }
    if (bb != null) {
      bb.clear();
    } else {
// It can not provide enough capacity.We will allocate again.
      bb = ByteBuffer.allocate(this.runningAverage);
      this.allocations.incrementAndGet();
    }
    if (LOG.isTraceEnabled()) {
      LOG.trace("runningAverage=" + this.runningAverage +
        ", totalCapacity=" + this.totalReservoirCapacity + ", count=" + this.buffers.size()
+
        ", alloctions=" + this.allocations.get());
    }
    return bb;
  }
{code}

How about other better BufferPool?I think is not necessary and that'd work too.So simple way
is better.

{quote}So the older version for reusing smaller sized BB is better? Any test result numbers?
{quote}
I'm trying to test.


> [RpcServer] reuse request read buffer
> -------------------------------------
>
>                 Key: HBASE-14490
>                 URL: https://issues.apache.org/jira/browse/HBASE-14490
>             Project: HBase
>          Issue Type: Improvement
>          Components: IPC/RPC
>    Affects Versions: 2.0.0, 1.0.2
>            Reporter: Zephyr Guo
>            Assignee: Zephyr Guo
>              Labels: performance
>             Fix For: 2.0.0, 1.0.2
>
>         Attachments: ByteBufferPool.java, HBASE-14490-v1.patch, HBASE-14490-v10.patch,
HBASE-14490-v11.patch, HBASE-14490-v2.patch, HBASE-14490-v3.patch, HBASE-14490-v4.patch, HBASE-14490-v5.patch,
HBASE-14490-v6.patch, HBASE-14490-v7.patch, HBASE-14490-v8.patch, HBASE-14490-v9.patch
>
>
> Reuse buffer to read request.It's not necessary to every request free buffer.The idea
of optimization is to reduce the times that allocate ByteBuffer.
> *Modification*
> 1. {{saslReadAndProcess}} ,{{processOneRpc}}, {{processUnwrappedData}}, {{processConnectionHeader}}
accept a ByteBuffer instead of byte[].They can move {{ByteBuffer.position}} correctly when
we have read the data.
> 2. {{processUnwrappedData}} no longer use any extra memory.
> 3. Maintaining a reused ByteBuffer in each {{Connection}}.
> a) Size is dynamic to fit specific client.
> b) If size deviate far from average size, we replace a new one.
> c) Using a SoftReference to reference the buffer.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message