[
https://issues.apache.org/jira/browse/HBASE-14479?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15359168#comment-15359168
]
stack commented on HBASE-14479:
-------------------------------
I tried this again with total random read workload (all from cache). Readers
are here at safe point:
{code}
2449 "RpcServer.reader=0,bindAddress=ve0528.halxg.cloudera.com,port=16020" #34
daemon prio=5 os_prio=0 tid=0x00007fb669c7f1e0 nid=0x1c7e8 waiting on condition
[0x00007fae4d244000]
2450 java.lang.Thread.State: WAITING (parking)
2451 at sun.misc.Unsafe.park(Native Method)
2452 - parking to wait for <0x00007faf661d4c00> (a
java.util.concurrent.Semaphore$NonfairSync)
2453 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
2454 at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
2455 at
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
2456 at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
2457 at java.util.concurrent.Semaphore.acquire(Semaphore.java:312)
2458 at
org.apache.hadoop.hbase.ipc.RpcServer$Listener$Reader.doRunLoop(RpcServer.java:688)
2459 at
org.apache.hadoop.hbase.ipc.RpcServer$Listener$Reader.run(RpcServer.java:669)
2460 at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
2461 at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
2462 at java.lang.Thread.run(Thread.java:745)
{code}
...i.e. at the new semaphore. Throughput is way down... 150k ops/s vs 380k
ops/s.
Looking w/ honest profiler, the call stack is way different w/ current branch-1
spending most of its time responding:
Current branch-1
{code}
6 Tree Profile:
7 (t 100.0,s 5.2) org.apache.hadoop.hbase.ipc.RpcServer$Responder::run
8 (t 94.8,s 0.0)
org.apache.hadoop.hbase.ipc.RpcServer$Responder::doRunLoop
9 (t 81.0,s 0.6)
org.apache.hadoop.hbase.ipc.RpcServer$Responder::doAsyncWrite
10 (t 79.9,s 1.1)
org.apache.hadoop.hbase.ipc.RpcServer$Responder::processAllResponses
11 (t 76.4,s 0.6)
org.apache.hadoop.hbase.ipc.RpcServer$Responder::processResponse
12 (t 75.9,s 0.0) org.apache.hadoop.hbase.ipc.RpcServer::channelWrite
13 (t 73.6,s 0.0) org.apache.hadoop.hbase.ipc.BufferChain::write
14 (t 72.4,s 2.3) sun.nio.ch.SocketChannelImpl::write
15 (t 67.8,s 0.6) sun.nio.ch.IOUtil::write
16 (t 62.1,s 0.0) sun.nio.ch.SocketDispatcher::writev
17 (t 62.1,s 62.1) sun.nio.ch.FileDispatcherImpl::writev0
18 (t 2.3,s 0.6) sun.nio.ch.Util::getTemporaryDirectBuffer
19 (t 1.7,s 0.0) java.lang.ThreadLocal::get
20 (t 1.7,s 0.0)
java.lang.ThreadLocal$ThreadLocalMap::access$000
21 (t 1.7,s 1.7)
java.lang.ThreadLocal$ThreadLocalMap::getEntry
22 (t 0.6,s 0.0) sun.nio.ch.IOVecWrapper::get
23 (t 0.6,s 0.0) java.lang.ThreadLocal::get
24 (t 0.6,s 0.0)
java.lang.ThreadLocal$ThreadLocalMap::access$000
25 (t 0.6,s 0.6)
java.lang.ThreadLocal$ThreadLocalMap::getEntry
26 (t 0.6,s 0.6) sun.nio.ch.Util::offerLastTemporaryDirectBuffer
27 (t 0.6,s 0.0) java.nio.DirectByteBuffer::put
28 (t 0.6,s 0.6) java.nio.Buffer::limit
29 (t 0.6,s 0.6) java.nio.Buffer::position
30 (t 0.6,s 0.0) sun.nio.ch.IOVecWrapper::putLen
31 (t 0.6,s 0.6) sun.nio.ch.NativeObject::putLong
32 (t 1.1,s 0.0)
java.nio.channels.spi.AbstractInterruptibleChannel::begin
33 (t 1.1,s 0.0)
java.nio.channels.spi.AbstractInterruptibleChannel::blockedOn
34 (t 1.1,s 0.0) java.lang.System$2::blockedOn
35 (t 1.1,s 1.1) java.lang.Thread::blockedOn
36 (t 1.1,s 1.1) sun.nio.ch.SocketChannelImpl::writerCleanup
37 (t 1.1,s 1.1) java.nio.Buffer::hasRemaining
...
{code}
With patch:
{code}
Tree Profile:
(t 100.0,s 2.2) java.lang.Thread::run
(t 97.8,s 0.0) java.util.concurrent.ThreadPoolExecutor$Worker::run
(t 97.8,s 0.0) java.util.concurrent.ThreadPoolExecutor::runWorker
(t 97.8,s 0.1) org.apache.hadoop.hbase.ipc.RpcServer$Listener$Reader::run
(t 97.7,s 0.2)
org.apache.hadoop.hbase.ipc.RpcServer$Listener$Reader::doRunLoop
(t 63.9,s 0.9)
org.apache.hadoop.hbase.ipc.RpcServer$Listener$Reader::leading
(t 59.1,s 0.0) sun.nio.ch.SelectorImpl::select
(t 59.1,s 0.0) sun.nio.ch.SelectorImpl::select
(t 59.1,s 0.0) sun.nio.ch.SelectorImpl::lockAndDoSelect
(t 59.1,s 0.1) sun.nio.ch.EPollSelectorImpl::doSelect
(t 49.2,s 0.0) sun.nio.ch.EPollArrayWrapper::poll
(t 43.2,s 0.9) sun.nio.ch.EPollArrayWrapper::updateRegistrations
(t 42.0,s 42.0) sun.nio.ch.EPollArrayWrapper::epollCtl
(t 0.4,s 0.2) java.util.BitSet::get
(t 0.1,s 0.1) java.util.BitSet::wordIndex
(t 6.0,s 6.0) sun.nio.ch.EPollArrayWrapper::epollWait
(t 9.1,s 1.2) sun.nio.ch.EPollSelectorImpl::updateSelectedKeys
(t 5.3,s 0.0) java.util.HashMap::get
(t 5.3,s 3.9) java.util.HashMap::getNode
(t 1.3,s 1.3) java.lang.Integer::equals
(t 1.0,s 0.0)
sun.nio.ch.SocketChannelImpl::translateAndSetReadyOps
(t 1.0,s 1.0) sun.nio.ch.SocketChannelImpl::translateReadyOps
(t 0.9,s 0.0) java.util.HashSet::add
(t 0.9,s 0.0) java.util.HashMap::put
(t 0.9,s 0.5) java.util.HashMap::putVal
(t 0.4,s 0.4) java.util.HashMap::newNode
(t 0.6,s 0.0) java.util.HashSet::contains
(t 0.6,s 0.0) java.util.HashMap::containsKey
(t 0.5,s 0.5) java.util.HashMap::getNode
(t 0.1,s 0.1) java.util.HashMap::hash
(t 0.1,s 0.1) sun.nio.ch.EPollArrayWrapper::getDescriptor
(t 0.6,s 0.6) sun.nio.ch.IOUtil::drain
(t 0.1,s 0.0) java.nio.channels.spi.AbstractSelector::end
(t 0.1,s 0.1)
java.nio.channels.spi.AbstractInterruptibleChannel::blockedOn
(t 1.5,s 0.0) sun.nio.ch.SelectionKeyImpl::interestOps
(t 1.5,s 0.6) sun.nio.ch.SelectionKeyImpl::nioInterestOps
(t 0.9,s 0.0)
sun.nio.ch.SocketChannelImpl::translateAndSetInterestOps
(t 0.9,s 0.0) sun.nio.ch.EPollSelectorImpl::putEventOps
(t 0.9,s 0.9) sun.nio.ch.EPollArrayWrapper::setInterest
(t 1.2,s 0.0) java.util.concurrent.ConcurrentLinkedQueue::add
(t 1.2,s 0.9) java.util.concurrent.ConcurrentLinkedQueue::offer
(t 0.2,s 0.2)
java.util.concurrent.ConcurrentLinkedQueue$Node::casNext
(t 0.1,s 0.1) java.util.concurrent.ConcurrentLinkedQueue$Node::<init>
(t 0.7,s 0.1) java.util.HashMap$KeyIterator::next
...
{code}
> Apply the Leader/Followers pattern to RpcServer's Reader
> --------------------------------------------------------
>
> Key: HBASE-14479
> URL: https://issues.apache.org/jira/browse/HBASE-14479
> Project: HBase
> Issue Type: Improvement
> Components: IPC/RPC, Performance
> Reporter: Hiroshi Ikeda
> Assignee: Hiroshi Ikeda
> Priority: Minor
> Attachments: HBASE-14479-V2 (1).patch, HBASE-14479-V2.patch,
> HBASE-14479-V2.patch, HBASE-14479.patch, flamegraph-19152.svg,
> flamegraph-32667.svg, gc.png, gets.png, io.png, median.png
>
>
> {{RpcServer}} uses multiple selectors to read data for load distribution, but
> the distribution is just done by round-robin. It is uncertain, especially for
> long run, whether load is equally divided and resources are used without
> being wasted.
> Moreover, multiple selectors may cause excessive context switches which give
> priority to low latency (while we just add the requests to queues), and it is
> possible to reduce throughput of the whole server.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)