[
https://issues.apache.org/jira/browse/CASSANDRA-4681?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13458928#comment-13458928
]
Jonathan Ellis commented on CASSANDRA-4681:
-------------------------------------------
Suppose current region A is exhausted. A.next = B. All threads race to CAS B
into A, then continue. Now you have current = B and B.next = null. Nobody
will try to allocate B.next until B is exhausted, in which case they will all
create the new Region and CAS again.
> SlabAllocator spends a lot of time in Thread.yield
> --------------------------------------------------
>
> Key: CASSANDRA-4681
> URL: https://issues.apache.org/jira/browse/CASSANDRA-4681
> Project: Cassandra
> Issue Type: Bug
> Components: Core
> Affects Versions: 1.1.5
> Environment: OEL Linux
> Reporter: Oleg Kibirev
> Attachments: 4681-v3.txt, SlabAllocator.java,
> SlabAllocator.java.list, slab-list.patch
>
>
> When profiling high volume inserts into Cassandra running on a host with fast
> SSD and CPU, Thread.yield() invoked by SlabAllocator appeared as the top item
> in CPU samples. The fix is to return a regular byte buffer if current slab is
> being initialized by another thread. So instead of:
> if (oldOffset == UNINITIALIZED)
> {
> // The region doesn't have its data allocated yet.
> // Since we found this in currentRegion, we know that
> whoever
> // CAS-ed it there is allocating it right now. So
> spin-loop
> // shouldn't spin long!
> Thread.yield();
> continue;
> }
> do:
> if (oldOffset == UNINITIALIZED)
> return ByteBuffer.allocate(size);
> I achieved 4x speed up in my (admittedly specialized) benchmark by using an
> optimized version of SlabAllocator attached. Since this code is in the
> critical path, even doing excessive atomic instructions or allocating
> unneeded extra ByteBuffer instances has a measurable effect on performance
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira