Ted,

Thank you for your response.

I uploaded the complete stack trace to Gist.

https://gist.github.com/brfrn169/cb4f2c157129330cd932


I think that increment operation works as follows:

1. get row lock
2. mvcc.waitForPreviousTransactionsComplete() // wait for all prior MVCC
transactions to finish
3. mvcc.beginMemstoreInsertWithSeqNum() // start a transaction
4. get previous values
5. create KVs
6. write to Memstore
7. write to WAL
8. release row lock
9. mvcc.completeMemstoreInsertWithSeqNum() // complete the transaction

A instance of MultiVersionConsistencyControl has a pending queue of writes
named writeQueue.
Step 2 puts a WriteEntry w to writeQueue and waits until writeQueue is
empty or writeQueue.getFirst() == w.
Step 3 puts a WriteEntry to writeQueue and step 9 removes the WriteEntry
from writeQueue.

I think that when a handler thread is processing between step 2 and step 9,
the other handler threads can wait until the thread completes step 9.

Thanks,

Toshihiro Suzuki


2015-09-09 0:05 GMT+09:00 Ted Yu <yuzhih...@gmail.com>:

> In HRegion#increment(), we lock the row (not region):
>
>     try {
>       rowLock = getRowLock(row);
>
> Can you pastebin the complete stack trace ?
>
> Thanks
>
> On Tue, Sep 8, 2015 at 2:01 AM, 鈴木俊裕 <brfrn...@gmail.com> wrote:
>
> > Hi,
> >
> > We upgraded our cluster from CDH5.3.1(HBase0.98.6) to
> CDH5.4.5(HBase1.0.0)
> > and we experience slowdown in increment operation.
> >
> > Here's an extract from thread dump of the RegionServer of our cluster:
> >
> > Thread 68 (RW.default.writeRpcServer.handler=15,queue=5,port=60020):
> >   State: BLOCKED
> >   Blocked count: 21689888
> >   Waited count: 39828360
> >   Blocked on java.util.LinkedList@3474e4b2
> >   Blocked by 63 (RW.default.writeRpcServer.handler=10,queue=0,port=60020)
> >   Stack:
> >     java.lang.Object.wait(Native Method)
> >
> >
> >
> org.apache.hadoop.hbase.regionserver.MultiVersionConsistencyControl.waitForPreviousTransactionsComplete(MultiVersionConsistencyControl.java:224)
> >
> >
> >
> org.apache.hadoop.hbase.regionserver.MultiVersionConsistencyControl.waitForPreviousTransactionsComplete(MultiVersionConsistencyControl.java:203)
> >
> > org.apache.hadoop.hbase.regionserver.HRegion.increment(HRegion.java:6712)
> >
> >
> >
> org.apache.hadoop.hbase.regionserver.RSRpcServices.increment(RSRpcServices.java:501)
> >
> >
> >
> org.apache.hadoop.hbase.regionserver.RSRpcServices.doNonAtomicRegionMutation(RSRpcServices.java:570)
> >
> >
> >
> org.apache.hadoop.hbase.regionserver.RSRpcServices.multi(RSRpcServices.java:1901)
> >
> >
> >
> org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:31451)
> >     org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2035)
> >     org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
> >
> >
> org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
> >     org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
> >     java.lang.Thread.run(Thread.java:745)
> >
> > There are many similar threads in the thread dump.
> >
> > I read the source code and I think this is caused by changes of
> > MultiVersionConsistencyControl.
> > A region lock (not a row lock) seems to occur in
> > waitForPreviousTransactionsComplete().
> >
> >
> > Also we wrote performance test code for increment operation that included
> > 100 threads and ran it in local mode.
> >
> > The result is shown below:
> >
> > CDH5.3.1(HBase0.98.6)
> > Throughput(op/s): 12757, Latency(ms): 7.975072509210629
> >
> > CDH5.4.5(HBase1.0.0)
> > Throughput(op/s): 2027, Latency(ms): 49.11840157868772
> >
> >
> > Thanks,
> >
> > Toshihiro Suzuki
> >
>

Reply via email to