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

Nicolas Liochon commented on HBASE-9535:
----------------------------------------

fwiw, it looked at the code called when you're doing a direct allocate, and I 
saw, in java.nio.Bits
{code}
    // These methods should be called whenever direct memory is allocated or
    // freed.  They allow the user to control the amount of direct memory
    // which a process may access.  All sizes are specified in bytes.
    static void reserveMemory(long size) {

        synchronized (Bits.class) { <================================ hum
            if (!memoryLimitSet && VM.isBooted()) {
                maxMemory = VM.maxDirectMemory();
                memoryLimitSet = true;
            }
            if (size <= maxMemory - reservedMemory) {
                reservedMemory += size;
                return;
            }
        }

        System.gc();  <============================================= ok...
        try {
            Thread.sleep(100); <============================================= 
wow
        } catch (InterruptedException x) {
            // Restore interrupt status
            Thread.currentThread().interrupt();
        }
        synchronized (Bits.class) {
            if (reservedMemory + size > maxMemory)
                throw new OutOfMemoryError("Direct buffer memory");
            reservedMemory += size;
        }

    }
{code}

> Try a pool of direct byte buffers handling incoming ipc requests
> ----------------------------------------------------------------
>
>                 Key: HBASE-9535
>                 URL: https://issues.apache.org/jira/browse/HBASE-9535
>             Project: HBase
>          Issue Type: Brainstorming
>            Reporter: stack
>            Assignee: stack
>         Attachments: 9535.v1.patch
>
>
> ipc takes in a query by allocating a ByteBuffer of the size of the request 
> and then reading off the socket into this on-heap BB.
> Experiment with keeping a pool of BBs so we have some buffer reuse to cut on 
> garbage generated.  Could checkout from pool in RpcServer#Reader.  Could 
> check back into the pool when Handler is done just before it queues the 
> response on the Responder's queue.  We should be good since, at least for 
> now, kvs get copied up into MSLAB (not references) when data gets stuffed 
> into MemStore; this should make it so no references left over when we check 
> the BB back into the pool for use next time around.
> If on-heap BBs work, we could then try direct BBs (Allocation of DBBs takes 
> time so if already allocated, should be good.  GC of DBBs is a pain but if in 
> a pool, we shouldn't be wanting this to happen).  The copy from socket to the 
> DBB will be off-heap (should be fast).
> Could start w/ the HDFS DirectBufferPool.  It is unbounded and keeps items by 
> size (we might want to bypass the pool if an object is > size N).
> DBBs for this task would contend w/ offheap BBs used in BlockReadLocal when 
> short-circuit reading.  It'd be a bummer if we had to allocate big objects 
> on-heap.  Would still be an improvement.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to