netty community talk reactive summit - data...

39
Netty One Framework to rule them all….

Upload: others

Post on 11-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Netty One Framework to rule them all….

Page 2: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Leading the Netty Project

Apache Cassandra MVP 2016 - 2017

Author of Netty in Action

Apache Software Foundation

Eclipse Foundation

Norman Maurer

Page 3: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

A long journey🚶🚶🚶🚶🚶🚶🚶

Page 4: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Some backgroundNetty 3.0.0.GA released in 2008

Netty 4.0.0.Final released in 2013

Netty 4.1.0.Final released in 2016

one of the most used Network Framework for the JVM

founded by Trustin Lee <3

JBoss Project first, then independent

very vibrant community

Page 5: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

🙈

Netty 3.xtoo much garbage

too many memory copies

no good memory pool included

not optimized for Linux based OS

threading model not easy to reason about

Still it worked great! ….. Kind

of at least.

Page 6: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Netty 4.x now!create less garbage, less GC

optimized for Linux based OS + Linux only features

high performance buffer pool based on jemalloc paper

well defined, easy to use threading model

And there is more too come….

Optimize all the things!

Page 7: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

ChannelPipelineChannel

Channel Inbound Handler

Channel Inbound Handler

ChannelPipeline

Channel Inbound Handler

Channel Outbound

Handler

Channel Outbound

Handler

Inbound events -> ChannelInboundHandler

Outbound events -> ChannelOutboundHandler

OUT

IN

Page 8: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

😉

Combine handlers as UNIX

commands via pipes

• Interceptor pattern

• allows to add building-blocks (ChannelHandler) on the fly that transforms data or react on events.

ChannelPipeline

😉$ echo "Netty is slow...." | sed -e 's/slow/fast/' | cat Netty is fast....

Page 9: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Too much garbage

Run collector ….run!

Page 10: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Reduce Garbageeliminate GC by replace event objects with direct method invocations

light-weight object pool for heavily allocated objects (like ByteBuf instances)

Allocating an Object is often

not the problem, collecting it is

😭

Page 11: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

JNI to the rescue

optimized transport for Linux only

supports Linux specific features

directly operate on pointers for buffers

synchronization optimized for Netty’s threading model

JN I C/C++Java

Page 12: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Native Transport epoll based high-performance transport

less GC pressure due less Objects

advanced features

SO_REUSEPORT

TCP_CORK

TCP_NOTSENT_LOWAT

TCP_FASTOPEN

TCP_INFO

LT and ET

Unix Domain Sockets

Bootstrapbootstrap=newBootstrap().group(newNioEventLoopGroup());bootstrap.channel(NioSocketChannel.class);

Bootstrapbootstrap=newBootstrap().group(newEpollEventLoopGroup());bootstrap.channel(EpollSocketChannel.class);

NIO Transport

Native Transport

Page 13: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Buffers Performance vs Complexity

Page 14: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

ByteBuf

ByteBufs are reference counted (huh!?!?)

pooling is used by default

provide LeakDetector which helps detecting ByteBuf leaks

direct memory are used by default

provide special abstractions to iterate over bytes to reduce branching / range-checks

all buffers are dynamic and can grow

Writing Java as it is C ?!?

🤔

Page 15: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Buffer PoolingAllocations are expensive

Page 16: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Allocation times

Nan

oSec

onds

0

1500

3000

4500

6000

Bytes

0 256 1024 4096 16384 65536

Unpooled Heap Pooled Heap Unpooled Direct Pooled Direct

Page 17: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

PooledByteBufAllocator

based on jemalloc paper (3.x)

ThreadLocal caches for lock-free allocation

synchronize per Arena that holds the different chunks of memory

different size classes

reduce fragmentation

ThreadLocal Cache 2

Arena 1 Arena 2 Arena 3

Size-classes Size-classes Size-classes

Thread 2

ThreadLocal Cache 1

Thread 1

Page 18: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Threading Model Writing multi-threaded applications is hard….

Page 19: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

IO-Thread

Threading-Model

all events / operations are done by the IO-Thread!

eliminates the need of synchronization completly (as long as the handler is not shared!)

writing single-threaded code FTW

Channel

Thread 1 Thread 2

Channel Outbound

Handler

Channel Inbound Handler

ChannelPipeline

Page 20: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Write Semantics syscalls are expensive…

Page 21: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Channel OutboundBuffer

msg

Write Semantics

Channel.write(…) will only put messages in the ChannelOutboundBuffer once processed.

Channel.flush() will flush everything in the ChannelOutboundBuffer and so call writev(…).

Channel.write(…)

writev(…)

Java

JNI / C

Channel.flush()

msg

msgmsg

Page 22: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Read Semantics Fine grained control FTW

Page 23: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Read Semantics

ChannelConfig.setAutoRead(boolean) to the rescue.

ChannelConfig.setMaxMessagesPerRead(int) allows to limit max number of messages to read.

Channel.read() allows to explicit trigger a read.

RecvByteBufAllocator gives even more flexibility

while(i<messagesPerRead){read(…);}

Page 24: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

IO - Threads Never-ever block the IO-Thread!

Page 25: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

EventLoop(Group)

IO Thread abstracted as EventLoop

easily share the same EventLoop between Server and Client

be able to explicitly use same EventLoop for accepted connection and outbound connection (win for proxy applications!)

Bonus: EventLoop is also a ScheduledEventExecutor

for(;;){waitForEventsOrTasks();processEvents();processTasks();processScheduledTasks();}

Page 26: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Work outside the IO-Thread sometimes you need to block

Page 27: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

EventExecutor(Group)

part of the core itself

adding ChannelHandler with an EventExecutorGroup will get the job done

different EventExecutorGroup implementations for serial / non-serial executions.

supports moving work to other EventLoop

ChannelPipelinepipeline=…;pipeline.addLast(executorGroup,newExecutionHandler(…));

Page 28: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

JNI based SSLEngine… to the rescue

JN I C/C++Java

Page 29: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

SSLEngine implementations

Requests / Sec

OpenSslEngine

SSLEngineImpl

0 150000 300000 450000 600000

Transfer(MB) / Sec

OpenSslEngine

SSLEngineImpl

0 17,5 35 52,5 70

Page 30: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

SSLEngine implementations

OpenSslEngine SSLEngineImpl

VS

Page 31: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

OpenSslEngine

drop in replacement for JDK SSLEngine (SSLEngineImpl)

gives you up to 6 x performance

less memory usage

less GC

SslContextBuilder.forServer().sslProvider(

SslProvider.OpenSsl);

Page 32: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Netty and the JVMA Hate-Love-Relationship

😍😤😍😤😍😤

Page 33: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Direct memory management

the whole idea of managing direct memory with via the Garbage-Collector is fundamentally broken

static synchronized in allocation and deallocation methods of direct memory

there is also Thread.sleep(100) and System.gc() ?!?

Now you made me cry…

😭

Page 34: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Memory Layout - ENOCONTROL

no easy way to control over memory layout (all these hacks ….)

false-sharing is a real issue on own data-structures

@Contended does not help at all in practice

Gimme more control now!

Page 35: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

JNI

nasty “hacks” needed to be able to get good performance

includes things like writing structs directly via sun.misc.Unsafe (no joke!)

calling from JNI into Java methods is SUPER-expensive

JN I C/C++Java

Page 36: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

NIO / IO and others

NIO.2 no real improvement over NIO

too much garbage produced and so GC overhead

ByteBuffer API is not user-friendly (flip all the things!)

IOException / ConnectException are too generic and not useful

creating String from byte[] / char[] not possible without memory copy

java.util.concurrent.Future was (and still is) a disaster

Page 37: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Get my book…

Ka-ching!

🤑

Page 38: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Questions?🙄🤔🙄🤔🙄

Page 39: netty community talk reactive summit - Data Sciencedatascienceassn.org/sites/default/files/Netty...Some background Netty 3.0.0.GA released in 2008 Netty 4.0.0.Final released in 2013

Thanks!👏👏👏👏👏👏👏👏👏👏