chronicle map

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

Upload: roman-leventov

Post on 15-Apr-2017

384 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Chronicle Map

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

Page 2: Chronicle Map

Chronicle Software

ПО для

высокопроизводительных

систем на Java

• Финтех, трейдинг

• Ставки

• Туризм

Page 3: Chronicle Map

Chronicle Map

Key‐value store в памяти github.com/OpenHFT/Chronicle-Map

LGPL v3

Page 4: Chronicle Map

Зачем?

Page 5: Chronicle Map

Нужды трейдинга (1)

Задержки = деньги

Обычные реляционные БД

Out-of-process кеши (redis)

Chronicle Map: медианная

задержка (latency)

< 1 микросекунды

Page 6: Chronicle Map

Нужды трейдинга (2)

Много источников событий

из разных процессов

Пример: агрегация данных

из нескольких бирж

Page 7: Chronicle Map

Зачем еще нужен

доступ

из нескольких

процессов?

Page 8: Chronicle Map

Тренды в железе

Сотни ГБ памяти

Несколько сокетов

⇒ NUMA

Page 9: Chronicle Map

NUMA

Page 10: Chronicle Map

NUMA

Доступ к памяти «чужого»

сокета на ~30% медленнее

Page 11: Chronicle Map

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

NUMA node 1

core core core

NUMA node 2

core core core

Процесс

Page 12: Chronicle Map

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

NUMA node 1

core core core

NUMA node 2

core core core

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

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

Page 13: Chronicle Map

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

Сборка мусора

• Меньше heap — меньше

паузы

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

– Без пауз

– Цена барьеров

Page 14: Chronicle Map

Compressed Oops

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

Heap = 40 GB

64-битные ссылки

Heap = 15 GB

32-битные ссылки

Heap = 15 GB

32-битные ссылки

Профит

Page 15: Chronicle Map

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

Конфигурация на уровне ОС

• Affinity

• Приоритеты

• cgroups

Page 16: Chronicle Map

Нужды трейдинга (2)

Много источников событий

из разных процессов

Hazelcast

Большинство IMDG

MapDB

Page 17: Chronicle Map

Много источников

Chronicle Map:

Доступ из нескольких

процессов

Масштабирование записи

ограничено кол-вом ядер в

системе

Page 18: Chronicle Map

Нужды трейдинга (3)

Очень большая частота

событий ⇒ обновлений базы

Репликация:

200k RPS

× 3 KB state updates

= 5 Gbit

Page 19: Chronicle Map

Нужды трейдинга (3)

Сеть не тянет ⇒ очереди

репликации переполняются

Нужна «фильтрация»

Chronicle Map: репликация

без очередей, гарантия

прогресса

Page 20: Chronicle Map
Page 21: Chronicle Map

Не серебряная пуля

Multi‐key запросы

изолированы,

но не атомарны

Не durable, только persistent

Только асинхронная

репликация

Page 22: Chronicle Map
Page 23: Chronicle Map

Как?

Page 24: Chronicle Map

Как сделать доступ

из нескольких

процессов?

Page 25: Chronicle Map

Loopback, sockets

JVM 1 DB process

JVM 2Kernel

DB memory

Page 26: Chronicle Map

Loopback, sockets

Поход в ядро: 100s of ns

× 4

2…∞ лишних копирований

данных

Непредсказуемые задержки:

1..10 микросекунд

Page 27: Chronicle Map

Loopback, sockets

• Redis, Memcached

Page 28: Chronicle Map

Разделяемая память

БД на C + JNI

БД на Java

• sun.misc.Unsafe

Page 29: Chronicle Map

БД на C + JNI

Java code DB code

JNIJVM 1

Kernel

DB shared memory

JVM 2

Page 30: Chronicle Map

БД на Java (Unsafe)

Java codeDB code

Unsafe

JVM

Kernel

DB shared memory

JVM 2

Page 31: Chronicle Map

Конечно, Unsafe!

Минусы JNI

• 50 ns

• 2 лишних копирования

• putIfAbsent(лямбда)

Минус Unsafe:

геморрой с блокировками

Page 32: Chronicle Map

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

Page 33: Chronicle Map

Блокировки

LockSupport.parkNanos(1000)

8000

Context switches — зло

Spin loops, жжем CPU

Page 34: Chronicle Map

Бенчмарк:

Chronicle Map*,

one-nio*,

ConcurrentHashMap

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

и Андрею Пангину

Page 35: Chronicle Map

Ответы на заявки

Запрос:orderId, instrument, price, ± amount

+ покупка, − продажа

Key-value хранилище:instrument, price → orderId, ± leftover

4, 8 → 8, 8 байтов

28 байтов всего

Page 36: Chronicle Map

Пример

#1, AAPL, $600, +10

AAPL, $600 → #1, +10

#2, AAPL, $600, −7

AAPL, $600 → #1, +3

#3, AAPL, $600, −5

AAPL, $600 → #3, −2

Page 37: Chronicle Map

Реалистичные данные

5000

инструментов

Расп. Ципфа

Цены:

биномиальное

Page 38: Chronicle Map

Бенчмарк

10 млн заявок, 8 потоков

~ 160 тыс. различных пар

(instrument, price)

Xeon E5-2650 v2 @ 2.60GHz

8 Cores / 16 HW Threads,

2 NUMA nodes, L3: 20MB

Page 39: Chronicle Map

Скорость

174

296

367

Chronicle Map one-nio ConcurrentHashMap

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

Page 40: Chronicle Map

Память

7,5

10,1

14,4

Chronicle Map one-nio ConcurrentHashMap

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

Page 41: Chronicle Map

Потребление памяти

определяет скорость

Page 42: Chronicle Map

Память

7,5

10,1

14,4 15

20

ChronicleMap

one-nio CHM redis 32-bit,approx.

redis 64-bit,approx.

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

Payload — 4,5 MB

Page 43: Chronicle Map

Репликация

Page 44: Chronicle Map

Репликация: боль

Сеть не тянет частые

обновления

⇒ Очередь переполняется

⇒ Надо делать сжатие

• Сложно

• Задержки

Page 45: Chronicle Map

Репликация без логов

Записи помечаются на

репликацию в bit maps

Потребление памяти

не меняется

Но: только асинхронная,

eventually consistent

репликация

Page 46: Chronicle Map

Кратко

По процессу на сокет

Аffinity, приоритеты

syscalls, JNI

Context switches

IPC через shared memory

Меньше памяти

Page 47: Chronicle Map
Page 48: Chronicle Map

Ссылки

http://chronicle.software/

key-value-stories.blogspot.com

@leventov

[email protected]