chronicle map — key-value хранилище для трейдинга на java /...
TRANSCRIPT
![Page 1: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/1.jpg)
Chronicle MapРоман Левентов
![Page 2: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/2.jpg)
Chronicle SoftwareПО для высокопроизводительных систем на Java• Финтех, трейдинг• Ставки• Туризм
![Page 3: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/3.jpg)
Chronicle MapKey‐value store в памяти github.com/OpenHFT/Chronicle-MapLGPL v3
![Page 4: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/4.jpg)
Зачем?
![Page 5: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/5.jpg)
Нужды трейдинга (1)Задержки = деньгиОбычные реляционные БДOut-of-process кеши (redis)Chronicle Map: медианная задержка (latency)< 1 микросекунды
![Page 6: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/6.jpg)
Нужды трейдинга (2)Много источников событийиз разных процессов
Пример: агрегация данных из нескольких бирж
![Page 7: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/7.jpg)
Зачем еще нужен доступиз нескольких процессов?
![Page 8: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/8.jpg)
Тренды в железеСотни ГБ памятиНесколько сокетов⇒ NUMA
![Page 9: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/9.jpg)
NUMA
![Page 10: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/10.jpg)
NUMAДоступ к памяти «чужого» сокета на ~30% медленнее
![Page 11: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/11.jpg)
NUMA: архитектура 1
NUMA node 1
core core core
NUMA node 2
core core core
Процесс
![Page 12: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/12.jpg)
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)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/13.jpg)
Зачем несколько JVM?Сборка мусора• Меньше heap — меньше
паузы• Garbage-free подсистемы
– Без пауз– Цена барьеров
![Page 14: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/14.jpg)
Compressed Oops
Зачем несколько JVM?
Heap = 40 GB64-битные ссылки
Heap = 15 GB32-битные ссылки
Heap = 15 GB32-битные ссылки
Профит
![Page 15: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/15.jpg)
Зачем несколько JVM?Конфигурация на уровне ОС • Affinity• Приоритеты• cgroups
![Page 16: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/16.jpg)
Нужды трейдинга (2)Много источников событийиз разных процессовHazelcastБольшинство IMDGMapDB
![Page 17: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/17.jpg)
Много источниковChronicle Map:Доступ из нескольких процессовМасштабирование записи ограничено кол-вом ядер в системе
![Page 18: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/18.jpg)
Нужды трейдинга (3)Очень большая частота событий ⇒ обновлений базыРепликация:200k RPS× 3 KB state updates= 5 Gbit
![Page 19: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/19.jpg)
Нужды трейдинга (3)Сеть не тянет ⇒ очереди репликации переполняютсяНужна «фильтрация»Chronicle Map: репликация без очередей, гарантия прогресса
![Page 20: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/20.jpg)
![Page 21: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/21.jpg)
Не серебряная пуляMulti‐key запросы изолированы,но не атомарныНе durable, только persistentТолько асинхронная репликация
![Page 22: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/22.jpg)
![Page 23: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/23.jpg)
Как?
![Page 24: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/24.jpg)
Как сделать доступиз нескольких процессов?
![Page 25: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/25.jpg)
Loopback, sockets
JVM 1 DB process
JVM 2Kernel
DB memory
![Page 26: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/26.jpg)
Loopback, socketsПоход в ядро: 100s of ns× 42…∞ лишних копирований данныхНепредсказуемые задержки: 1..10 микросекунд
![Page 27: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/27.jpg)
Loopback, sockets• Redis, Memcached
![Page 28: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/28.jpg)
Разделяемая памятьБД на C + JNIБД на Java• sun.misc.Unsafe
![Page 29: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/29.jpg)
БД на C + JNI
Java code DB code
JNIJVM 1
Kernel
DB shared memory
JVM 2
![Page 30: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/30.jpg)
БД на Java (Unsafe)
Java code DB codeUnsafe
JVM
Kernel
DB shared memory
JVM 2
![Page 31: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/31.jpg)
Конечно, Unsafe!Минусы JNI• 50 ns• 2 лишних копирования• putIfAbsent(лямбда)Минус Unsafe:геморрой с блокировками
![Page 32: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/32.jpg)
Блокировкине нужны
![Page 33: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/33.jpg)
БлокировкиLockSupport.parkNanos(1000)8000Context switches — зло
Spin loops, жжем CPU
![Page 34: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/34.jpg)
Бенчмарк:Chronicle Map*,one-nio*,ConcurrentHashMap
Спасибо Андрею Барюдинуи Андрею Пангину
![Page 35: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/35.jpg)
Ответы на заявкиЗапрос:orderId, instrument, price, ± amount
+ покупка, − продажаKey-value хранилище:instrument, price → orderId, ± leftover
4, 8 → 8, 8 байтов28 байтов всего
![Page 36: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/36.jpg)
Пример#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)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/37.jpg)
Реалистичные данные5000 инструментов Расп. Ципфа
Цены:биномиальное
![Page 38: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/38.jpg)
Бенчмарк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)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/39.jpg)
Скорость
Chronicle Map one-nio ConcurrentHashMap
174
296
367
В среднем наносекунд на запрос, меньше — лучше
![Page 40: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/40.jpg)
Память
Chronicle Map one-nio ConcurrentHashMap
7.5
10.1
14.4
Общее потребление памяти, MB, меньше — лучше
![Page 41: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/41.jpg)
Потребление памяти определяет скорость
![Page 42: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/42.jpg)
Память
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)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/43.jpg)
Репликация
![Page 44: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/44.jpg)
Репликация: больСеть не тянет частые обновления⇒ Очередь переполняется⇒ Надо делать сжатие• Сложно• Задержки
![Page 45: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/45.jpg)
Репликация без логовЗаписи помечаются на репликацию в bit mapsПотребление памятине меняетсяНо: только асинхронная, eventually consistent репликация
![Page 46: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/46.jpg)
КраткоПо процессу на сокетАffinity, приоритетыsyscalls, JNIContext switchesIPC через shared memoryМеньше памяти
![Page 47: Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (Chronicle Software)](https://reader036.vdocuments.mx/reader036/viewer/2022062302/586f915f1a28ab54768b7bfb/html5/thumbnails/47.jpg)