uschindler edited a comment on pull request #177:
URL: https://github.com/apache/lucene/pull/177#issuecomment-866087762


   Hi @mikemccand, 
   
   > > I have no idea why the facetting stuff at the beginning of the bench 
output is so badly behaving with MMapDirectory#v2 on top of project panama, 
I'll ignore this for now. Maybe @mikemccand has an idea! The rest looks 
perfectly fine to me from the performance (19 runs).
   > 
   > Yeah that is strange. The impact is sizable. These tasks effectively run a 
`MatchAllDocsQuery`, and for each hit (doc) decodes the packed delta-coded int 
ordinals from a `BinaryDocValues` field, incrementing counters in a big 
`int[]`. To the `MMapDirectory` it should look like it's doing a big sequential 
scan of that `BinaryDocValues` field for each segment. Surely this should be 
easy for `mmap` ;) Maybe we should run profiler ... maybe something silly is 
happening, like we are randomly seeking on every hit unnecessarily ...
   
   This is already understood. The problem is the combination of bad JVM 
defaults and a problem in bulk copy from off-heap to heap! What you see is 
garbage collector driving crazy (see my flight control heap dumps). The 
disabled tiered compilation made hotspot optimizations and escape analysis only 
kick in after 6 seconds benchmark runtime (of total 60s on my machine). In this 
time it produced 3 java objects per copy operation (`readBytes(), readLongs(), 
readFloats()`). With tiered compilation this went down, but still 1 second 
producing tons of garbage.
   
   With JDK 18 this will be solved in 
https://github.com/openjdk/panama-foreign/pull/555, where we get a new class 
`MemoryCopy` that allows to copy data off-heap to on-heap without allocating 
useless wrapper classes. In this pull request this line is producing 3 
temporary objects: 
https://github.com/apache/lucene/blob/bacfa11940ecf505299ec8a2d43a94d64a106182/lucene/core/src/java/org/apache/lucene/store/MemorySegmentIndexInput.java#L167
   
   ```java
   MemorySegment.ofArray(b).asSlice(offset, 
len).copyFrom(curSegment.asSlice(curPosition, len));
   ```
   
   From JDK 18 on, it will look like this:
   ```
   MemoryCopy.copyToArray(curSegment, curPosition, b, offset, len);
   ```
   
   This was negotiated today 👍 
   
   In general, we should avoid to copy bytes/longs/floats from mmap to on-heap. 
With the new vector API coming soon, there's no need for that. Just tell vector 
API to calculate something (e.g. PFOR or cosine) and give it a MemorySegment 
slice :-) So we should really really avoid all those stupid copy operations in 
bulks!!!
   
   To read the whole story check here: 
https://github.com/openjdk/panama-foreign/pull/555#issuecomment-865672909


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to