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

Branimir Lambov commented on CASSANDRA-8464:
--------------------------------------------

Very impressive performance gain. My comments:
- The patch is in effect introducing a new {{CompressedRandomAccessReader}} 
implementation that uses memory mapping, in addition to the existing one that 
uses on-heap buffers. Rather than separating the two using multiple if/else 
checks inside the code, wouldn't this be structurally clearer if we created 
separate subclasses for the two? The latter is also more efficient as it 
replaces ifs with virtual calls which the JIT is better equipped to handle; the 
JRE will never see the irrelevant code, and space will not be wasted for 
irrelevant fields.
- Will the CRAR be used with >=2G files very often? If the <2G case is 
predominant it would make sense to further separate the code in a <2G-optimized 
class with single mmap buffer in addition to the current {{TreeMap}}-based 
catch-all.
- I'd prefer not to refer to {{sub.nio.ch.DirectBuffer}} throughout code; its 
references should be confined to the {{FileUtils}} class, for example by 
changing {{FileUtils.clean()}} to take a {{ByteBuffer}} argument and do the 
conversion or skip cleaning for non-direct ones. Maybe we should also move the 
{{isCleanerAvailable()}} check into it (it should be easily optimized away by 
the JIT) and make cleaning a single call rather than the isDirect, 
isCleanerAvailable, cast sequence it is now.
- Nit on {{FileUtils.clean()}} uses: since {{isCleanerAvailable()}} does not 
change value, it should be the first thing tested in all ifs with more than one 
condition. This makes the JIT's job easier.
- {{CRAR.allocateBuffer}}: for Snappy {{uncompress(ByteBuffer)}} both buffers 
need to be direct. You could perhaps revive parts of CASSANDRA-6762 to deal 
with this (and support {{DeflateCompressor}}).
- CRAR static init: {{FBUtilities.supportsDirectChecksum()}} could return true 
initially, but revert to false at the first invoke attempt. The choice for 
useMmap is made before that happens. Perhaps we could do a test invoke in the 
static init instead of letting the value change later?
- {{FBUtilities.directCheckSum}}: Does the checksum-on-ByteBuffer trick work 
with non-Oracle JVMs? Have we tested what happens on one?
- {{FBUtilities.directCheckSum}}: In the fallback case, are we sure we never 
change buffers' byte order? ({{getInt()}} might return swapped bytes if not) A 
chunked loop as done in CASSANDRA-6762 is safer and could be faster. (If you 
worry about the allocation, we could probably provide a thread-local scratch 
array in {{FBUtilities}} or similar.)
- {{LZ4Compressor::uncompress}}: No need for {{hasArray()}} checks, 
decompressor will do this if it helps (it doesn't normally). You shouldn't need 
to duplicate any of the buffers or copy into byte array, just use buffer's 
{{get(position + ...)}}.
- The new compressor and checksum functionality should be unit-tested, as well 
as all fallbacks; CASSANDRA-6762 has some tests you could reuse.


> Support direct buffer decompression for reads
> ---------------------------------------------
>
>                 Key: CASSANDRA-8464
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8464
>             Project: Cassandra
>          Issue Type: Improvement
>            Reporter: T Jake Luciani
>            Assignee: T Jake Luciani
>              Labels: performance
>             Fix For: 3.0
>
>
> Currently when we read a compressed sstable we copy the data on heap then 
> send it to be de-compressed to another on heap buffer (albeit pooled).
> But now both snappy and lz4 (with CASSANDRA-7039) allow decompression of 
> direct byte buffers.   This lets us mmap the data and decompress completely 
> off heap (and avoids moving bytes over JNI).
> One issue is performing the checksum offheap but the Adler32 does support in 
> java 8 (it's also in java 7 but marked private?!)
> This change yields a > 10% boost in read performance on cstar.  Locally I see 
> upto 30% improvement.
> http://cstar.datastax.com/graph?stats=5ebcdd70-816b-11e4-aed6-42010af0688f&metric=op_rate&operation=2_read&smoothing=1&show_aggregates=true&xmin=0&xmax=200.09&ymin=0&ymax=135908.3



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to