Chronicle Map — key-value хранилище для трейдинга на Java /...

48
Chronicle Map Роман Левентов

Transcript of Chronicle Map — key-value хранилище для трейдинга на Java /...

Page 1: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Chronicle MapРоман Левентов

Page 2: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Chronicle SoftwareПО для высокопроизводительных систем на Java• Финтех, трейдинг• Ставки• Туризм

Page 3: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Chronicle MapKey‐value store в памяти github.com/OpenHFT/Chronicle-MapLGPL v3

Page 4: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Зачем?

Page 5: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Нужды трейдинга (1)Задержки = деньгиОбычные реляционные БДOut-of-process кеши (redis)Chronicle Map: медианная задержка (latency)< 1 микросекунды

Page 6: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Нужды трейдинга (2)Много источников событийиз разных процессов

Пример: агрегация данных из нескольких бирж

Page 7: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Зачем еще нужен доступиз нескольких процессов?

Page 8: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Тренды в железеСотни ГБ памятиНесколько сокетов⇒ NUMA

Page 9: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

NUMA

Page 10: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

NUMAДоступ к памяти «чужого» сокета на ~30% медленнее

Page 11: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

NUMA: архитектура 1

NUMA node 1

core core core

NUMA node 2

core core core

Процесс

Page 12: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

NUMA: архитектура 2

NUMA node 1

core core core

NUMA node 2

core core core

Процесс 1 Процесс 2

Выигрыш до 30% / 2 = 15%

Page 13: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Зачем несколько JVM?Сборка мусора• Меньше heap — меньше

паузы• Garbage-free подсистемы

– Без пауз– Цена барьеров

Page 14: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Compressed Oops

Зачем несколько JVM?

Heap = 40 GB64-битные ссылки

Heap = 15 GB32-битные ссылки

Heap = 15 GB32-битные ссылки

Профит

Page 15: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Зачем несколько JVM?Конфигурация на уровне ОС • Affinity• Приоритеты• cgroups

Page 16: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Нужды трейдинга (2)Много источников событийиз разных процессовHazelcastБольшинство IMDGMapDB

Page 17: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Много источниковChronicle Map:Доступ из нескольких процессовМасштабирование записи ограничено кол-вом ядер в системе

Page 18: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Нужды трейдинга (3)Очень большая частота событий ⇒ обновлений базыРепликация:200k RPS× 3 KB state updates= 5 Gbit

Page 19: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Нужды трейдинга (3)Сеть не тянет ⇒ очереди репликации переполняютсяНужна «фильтрация»Chronicle Map: репликация без очередей, гарантия прогресса

Page 20: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)
Page 21: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Не серебряная пуляMulti‐key запросы изолированы,но не атомарныНе durable, только persistentТолько асинхронная репликация

Page 22: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)
Page 23: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Как?

Page 24: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Как сделать доступиз нескольких процессов?

Page 25: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Loopback, sockets

JVM 1 DB process

JVM 2Kernel

DB memory

Page 26: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Loopback, socketsПоход в ядро: 100s of ns× 42…∞ лишних копирований данныхНепредсказуемые задержки: 1..10 микросекунд

Page 27: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Loopback, sockets• Redis, Memcached

Page 28: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Разделяемая памятьБД на C + JNIБД на Java• sun.misc.Unsafe

Page 29: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

БД на C + JNI

Java code DB code

JNIJVM 1

Kernel

DB shared memory

JVM 2

Page 30: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

БД на Java (Unsafe)

Java code DB codeUnsafe

JVM

Kernel

DB shared memory

JVM 2

Page 31: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Конечно, Unsafe!Минусы JNI• 50 ns• 2 лишних копирования• putIfAbsent(лямбда)Минус Unsafe:геморрой с блокировками

Page 32: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Блокировкине нужны

Page 33: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

БлокировкиLockSupport.parkNanos(1000)8000Context switches — зло

Spin loops, жжем CPU

Page 34: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Бенчмарк:Chronicle Map*,one-nio*,ConcurrentHashMap

Спасибо Андрею Барюдинуи Андрею Пангину

Page 35: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Ответы на заявкиЗапрос:orderId, instrument, price, ± amount

+ покупка, − продажаKey-value хранилище:instrument, price → orderId, ± leftover

4, 8 → 8, 8 байтов28 байтов всего

Page 36: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Пример#1, AAPL, $600, +10  

AAPL, $600 → #1, +10

#2, AAPL, $600, −7AAPL, $600 → #1, +3

#3, AAPL, $600, −5AAPL, $600 → #3, −2

Page 37: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Реалистичные данные5000 инструментов Расп. Ципфа

Цены:биномиальное

Page 38: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Бенчмарк10 млн заявок, 8 потоков~ 160 тыс. различных пар(instrument, price)

Xeon E5-2650 v2 @ 2.60GHz8 Cores / 16 HW Threads,2 NUMA nodes, L3: 20MB

Page 39: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Скорость

Chronicle Map one-nio ConcurrentHashMap

174

296

367

В среднем наносекунд на запрос, меньше — лучше

Page 40: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Память

Chronicle Map one-nio ConcurrentHashMap

7.5

10.1

14.4

Общее потребление памяти, MB, меньше — лучше

Page 41: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Потребление памяти определяет скорость

Page 42: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Память

ChronicleMap

one-nio CHM redis 32-bit,approx.

redis 64-bit,approx.

7.510.1

14.4 15

20

Общее потребление памяти, MB, меньше — лучше

Payload — 4,5 MB

Page 43: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Репликация

Page 44: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Репликация: больСеть не тянет частые обновления⇒ Очередь переполняется⇒ Надо делать сжатие• Сложно• Задержки

Page 45: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

Репликация без логовЗаписи помечаются на репликацию в bit mapsПотребление памятине меняетсяНо: только асинхронная, eventually consistent репликация

Page 46: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)

КраткоПо процессу на сокетАffinity, приоритетыsyscalls, JNIContext switchesIPC через shared memoryМеньше памяти

Page 47: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)