Implementation of IO with Panama

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Fri Apr 16 11:07:39 UTC 2021


On 16/04/2021 00:37, Radosław Smogura wrote:
> Hi all,
>
> I hope you have a good day.
>
> I started implementing I/O for JDK using Panama (I could not find such project). I think this is natural consequence of Panama project.

Hey,
this looks like awesome work - it is true that memory segments, Panama 
and IO are all connected. We had to start somewhere, which is why 
currently, for IO, the path is to map a segment into a byte buffer and 
take it from there. While this is generally viable, there are also some 
complications, so I wouldn't be surprised to see a low-level IO layer 
popping up :-)



>
> Right now, it's done as separate Maven project, which can be found here https://github.com/rsmogura/panama-io
>
> Generally, I'm happy it went so smooth.
>
> Well done!
>
> I created CachedAllocator (first version) which will keep memory segments cached to avoid calling alloc / free (I did not make performance tests between both versions).
Would be interesting to play with the latest API and the allocators in 
there, to see if there's something that could help.
>
> I created as well simple benchmarks
> Benchmark                          Mode  Cnt        Score        Error  Units
> SocketReadJdk.teatRead4k          thrpt   15  1202109.549 ± 127132.855  ops/s
> SocketReadJdk.testRead16b         thrpt   15  2818334.225 ±  82209.971  ops/s
> SocketReadJdk.testRead8bOffset    thrpt   15  2851310.595 ±  20675.631  ops/s
> SocketReadPosix.teatRead4k        thrpt   15  1187974.868 ± 101285.497  ops/s
> SocketReadPosix.testRead16b       thrpt   15  2963827.190 ±  62004.165  ops/s
> SocketReadPosix.testRead8bOffset  thrpt   15  2999631.814 ±  23925.859  ops/s
Wow - those look good numbers - the fact that your solution can be 
competitive with highly optimized JDK code speaks for itself. I'll have 
a look at your allocator.
>
>  From minor things and ideas:
>
>    *   I could not capture errno using jextract, my script uses --include-var errno, but I had ask for this symbol manually
Odd - which platform?
>    *   Privately I wonder about safety of errno, as between call to Posix function and reading value we have JVM, which can meantime invoke Posix methods too and make errno dirty (low probability I think)
True - JDK uses errno for its own nio business - but as long as you 
don't mix and match you should be fine (not an expert on nio, so take 
what I say with a pinch of salt)
>    *   I wonder if we could add class LocalSegmentAllocator which will allocate memory segment on stack (I know there are some risks)

I mean - now that we have a SegmentAllocator, we could put many 
allocators underneath that interface. Is arena bounded not working for 
you? I know that stack allocation way faster than heap allocation, but 
with a fixed arena at least you pay for heap allocation only once.

That said, it should be possible to combine the linker API with the 
segment allocator API and create a "custom" stack allocator (or, at 
least, that would be a good limit experiment for the API).

>
> If you have any questions, or ideas I'm happy to answer.
>
> and I think with moving forward I can provide quite interesting feedback.
>
> The goal is to make complete rewrite, together with mmap, and async I/O.

I *love* to see stuff like this happening. IMHO, this is the main point 
as to why the JDK is offering relatively blunt, low-level tools to 
manage off-heap memory/native code. But, by building on these, it should 
be possible to create completely new layers, like you have done (and 
with good results, it seems). It's all very exciting!

Maurizio

>
> Best regards,
> Rado


More information about the panama-dev mailing list