You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Oleg Kibirev (JIRA)" <ji...@apache.org> on 2012/09/19 18:35:08 UTC

[jira] [Comment Edited] (CASSANDRA-4681) SlabAllocator spends a lot of time in Thread.yield

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

Oleg Kibirev edited comment on CASSANDRA-4681 at 9/20/12 3:33 AM:
------------------------------------------------------------------

So in this case the list version should be good? It triggered more full GCs than simple version in my benchmark, perhaps because the threads were delayed by more complex code/allocating a bigger block from completing activity that would have otherwise released some memory. But things could certainly be different in another benchmark
                
      was (Author: okibirev):
    So in this case the list version should be good? It triggered more full GCs than simple version in my benchmark, perhaps because the threads were delayed by more complex code/allocating a bigger block from completing activity that would have otherwise released some memory.
                  
> 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: SlabAllocator.java, SlabAllocator.java.list
>
>
> 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