18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1/18 Blazing fast native IO in Java Толстопятов Всеволод Segmento

Java библиотека для эффективной работы с IO. Презентация участников

Embed Size (px)

Citation preview

Page 1: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.1/18

Blazing fast native IO in Java

Толстопятов ВсеволодSegmento

Page 2: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.2/18

Что происходит?

▶ RTB engine, up to 100k RPS▶ Soft real-time, latency sensitive▶ Server-server, client-server streams▶ I/O bound1

1Кроме тех случаев, когда нет

Page 3: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.3/18

Что происходит?

▶ RTB engine, up to 100k RPS▶ Soft real-time, latency sensitive▶ Server-server, client-server streams▶ I/O bound▶ NIO? Current implementation: 12k RPS, garbage,queues, locks

Page 4: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.4/18

Что происходит?

▶ RTB engine, up to 100k RPS▶ Soft real-time, latency sensitive▶ Server-server, client-server streams▶ I/O bound▶ NIO? Current implementation: 12k RPS, garbage,queues, locks

▶ Надо что-то делать

Page 5: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.5/18

NIO puzzle

Сколько локов захватывается в процессе переходаacceptable -> readable при использованииjava.nio.channels.Selector?

Page 6: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.6/18

NIO puzzle

Сколько локов захватывается в процессе переходаacceptable -> readable при использованииjava.nio.channels.Selector?

▶ 6-9 на select()▶ Еще 3 на accept()▶ 4 на register()

Page 7: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.7/18

NIO puzzle

Сколько локов захватывается в процессе переходаacceptable -> readable при использованииjava.nio.channels.Selector?

▶ 6-9 на select()▶ Еще 3 на accept()▶ 4 на register()▶ Все еще не потокобезопасен!

Page 8: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.8/18

Ну вы поняли

Page 9: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.9/18

А если серьезно

▶ Finalizable sockets▶ Compatibility issues (no custom socket options)▶ No epoll▶ Too old▶ Artificial limitations (selection keys, blockingselector, locks)

▶ GC pressure, concurrent queues , death and despair

Page 10: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.10/18

Что делать?

▶ JNI library inspired by Netty/Tomcat native▶ Edge-triggered epoll▶ Reactor, fixed threading model▶ Lightweight, no ssl▶ Custom socket options

Page 11: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.11/18

Tips and tricks

▶ Cache jmethodID/jfieldID▶ Threads affinity▶ Blocking mode with epoll2▶ Reusable buffers (G1 is shining)▶ TCP_DEFER_ACCEPT, TCP_NO_DELAY/TCP_CORK [,SO_REUSE_PORT, TCP_NOTSENT_LOWAT]

▶ Java fallback: reflection hacks, biased locking,JCTools queues

2Paul Tyma: Thousands of Threads and Blocking I/O

Page 12: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.12/18

Нагружаем

▶ Yandex.Tank▶ CentOS▶ HdrHistogram▶ Local/outer network interfaces▶ irqbalance, no tuning▶ Blocking/non-blocking modes, TCP_*

Page 13: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.13/18

Графики vs baseline

Page 14: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.14/18

Графики. Scaling

Page 15: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.15/18

Результат

▶ Ненависть к JNI▶ Faster, better, stronger▶ OS-tuning bound▶ Huge tuning space (650k Akka over Aeron)▶ Evaluate integration to core▶ Bunch of things to do

Page 16: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.16/18

Q & A

Page 17: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.17/18

Netty

▶ Dependency hell, compatibility issues▶ Event-driven model (queues and on*() everywhere)▶ Bunch of garbage▶ ByteBuf problems (till jemalloc)▶ Netty is nice▶ Netty native is awesome

Page 18: Java библиотека для эффективной работы с IO. Презентация участников

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.18/18

Epoll

▶ sun.nio.ch.EPollSelectorImpl :(▶ Level-triggered (aka repeatable)▶ Internal magic: using fake FD and workarounds▶ Still NIO