[
https://issues.apache.org/jira/browse/HBASE-14331?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Hiroshi Ikeda updated HBASE-14331:
----------------------------------
Attachment: BlockingQueuesPerformanceTestApp-output.pdf
BlockingQueuesPerformanceTestApp-output.txt
Added a result of the performance test in my environment, which has 8 cpu cores.
It compares (1){{LinkedBlockingQueue}} in the standard Java library,
(2){{BoundedPriorityBlockingQueue}} in HBase, and the newly implemented
classes, (3){{SemaphoreBasedLinkedBlockingQueue}} and
(4){{SemaphoreBasedPriorityBlockingQueue}}. I just changed the code of the test
application to add (2){{BoundedPriorityBlockingQueue}}.
The tasks are just executing {{Thread.yield}} and there should be excessively
context switches, but the result says, the reading threads in the existing
queues, (1){{LinkedBlockingQueue}} and (2){{BoundPriorityBlockingQueue}}, are
rarely waken up. That means many reading threads are blocked in the queues.
> a single callQueue related improvements
> ---------------------------------------
>
> Key: HBASE-14331
> URL: https://issues.apache.org/jira/browse/HBASE-14331
> Project: HBase
> Issue Type: Improvement
> Components: IPC/RPC, Performance
> Reporter: Hiroshi Ikeda
> Priority: Minor
> Attachments: BlockingQueuesPerformanceTestApp-output.pdf,
> BlockingQueuesPerformanceTestApp-output.txt,
> BlockingQueuesPerformanceTestApp.java, CallQueuePerformanceTestApp.java,
> SemaphoreBasedBlockingQueue.java, SemaphoreBasedLinkedBlockingQueue.java,
> SemaphoreBasedPriorityBlockingQueue.java
>
>
> {{LinkedBlockingQueue}} well separates locks between the {{take}} method and
> the {{put}} method, but not between takers, and not between putters. These
> methods are implemented to take locks at the almost beginning of their logic.
> HBASE-11355 introduces multiple call-queues to reduce such possible
> congestion, but I doubt that it is required to stick to {{BlockingQueue}}.
> There are the other shortcomings of using {{BlockingQueue}}. When using
> multiple queues, since {{BlockingQueue}} blocks threads it is required to
> prepare enough threads for each queue. It is possible that there is a queue
> starving for threads while there is another queue where threads are idle.
> Even if you can tune parameters to avoid such situations, the tuning is not
> so trivial.
> I suggest using a single {{ConcurrentLinkedQueue}} with {{Semaphore}}.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)