Chronicle Map — key-value хранилище для трейдинга на Java /...
-
Upload
ontico -
Category
Engineering
-
view
858 -
download
6
Transcript of Chronicle Map — key-value хранилище для трейдинга на Java /...
Chronicle MapРоман Левентов
Chronicle SoftwareПО для высокопроизводительных систем на Java• Финтех, трейдинг• Ставки• Туризм
Chronicle MapKey‐value store в памяти github.com/OpenHFT/Chronicle-MapLGPL v3
Зачем?
Нужды трейдинга (1)Задержки = деньгиОбычные реляционные БДOut-of-process кеши (redis)Chronicle Map: медианная задержка (latency)< 1 микросекунды
Нужды трейдинга (2)Много источников событийиз разных процессов
Пример: агрегация данных из нескольких бирж
Зачем еще нужен доступиз нескольких процессов?
Тренды в железеСотни ГБ памятиНесколько сокетов⇒ NUMA
NUMA
NUMAДоступ к памяти «чужого» сокета на ~30% медленнее
NUMA: архитектура 1
NUMA node 1
core core core
NUMA node 2
core core core
Процесс
NUMA: архитектура 2
NUMA node 1
core core core
NUMA node 2
core core core
Процесс 1 Процесс 2
Выигрыш до 30% / 2 = 15%
Зачем несколько JVM?Сборка мусора• Меньше heap — меньше
паузы• Garbage-free подсистемы
– Без пауз– Цена барьеров
Compressed Oops
Зачем несколько JVM?
Heap = 40 GB64-битные ссылки
Heap = 15 GB32-битные ссылки
Heap = 15 GB32-битные ссылки
Профит
Зачем несколько JVM?Конфигурация на уровне ОС • Affinity• Приоритеты• cgroups
Нужды трейдинга (2)Много источников событийиз разных процессовHazelcastБольшинство IMDGMapDB
Много источниковChronicle Map:Доступ из нескольких процессовМасштабирование записи ограничено кол-вом ядер в системе
Нужды трейдинга (3)Очень большая частота событий ⇒ обновлений базыРепликация:200k RPS× 3 KB state updates= 5 Gbit
Нужды трейдинга (3)Сеть не тянет ⇒ очереди репликации переполняютсяНужна «фильтрация»Chronicle Map: репликация без очередей, гарантия прогресса
Не серебряная пуляMulti‐key запросы изолированы,но не атомарныНе durable, только persistentТолько асинхронная репликация
Как?
Как сделать доступиз нескольких процессов?
Loopback, sockets
JVM 1 DB process
JVM 2Kernel
DB memory
Loopback, socketsПоход в ядро: 100s of ns× 42…∞ лишних копирований данныхНепредсказуемые задержки: 1..10 микросекунд
Loopback, sockets• Redis, Memcached
Разделяемая памятьБД на C + JNIБД на Java• sun.misc.Unsafe
БД на C + JNI
Java code DB code
JNIJVM 1
Kernel
DB shared memory
JVM 2
БД на Java (Unsafe)
Java code DB codeUnsafe
JVM
Kernel
DB shared memory
JVM 2
Конечно, Unsafe!Минусы JNI• 50 ns• 2 лишних копирования• putIfAbsent(лямбда)Минус Unsafe:геморрой с блокировками
Блокировкине нужны
БлокировкиLockSupport.parkNanos(1000)8000Context switches — зло
Spin loops, жжем CPU
Бенчмарк:Chronicle Map*,one-nio*,ConcurrentHashMap
Спасибо Андрею Барюдинуи Андрею Пангину
Ответы на заявкиЗапрос:orderId, instrument, price, ± amount
+ покупка, − продажаKey-value хранилище:instrument, price → orderId, ± leftover
4, 8 → 8, 8 байтов28 байтов всего
Пример#1, AAPL, $600, +10
AAPL, $600 → #1, +10
#2, AAPL, $600, −7AAPL, $600 → #1, +3
#3, AAPL, $600, −5AAPL, $600 → #3, −2
Реалистичные данные5000 инструментов Расп. Ципфа
Цены:биномиальное
Бенчмарк10 млн заявок, 8 потоков~ 160 тыс. различных пар(instrument, price)
Xeon E5-2650 v2 @ 2.60GHz8 Cores / 16 HW Threads,2 NUMA nodes, L3: 20MB
Скорость
Chronicle Map one-nio ConcurrentHashMap
174
296
367
В среднем наносекунд на запрос, меньше — лучше
Память
Chronicle Map one-nio ConcurrentHashMap
7.5
10.1
14.4
Общее потребление памяти, MB, меньше — лучше
Потребление памяти определяет скорость
Память
ChronicleMap
one-nio CHM redis 32-bit,approx.
redis 64-bit,approx.
7.510.1
14.4 15
20
Общее потребление памяти, MB, меньше — лучше
Payload — 4,5 MB
Репликация
Репликация: больСеть не тянет частые обновления⇒ Очередь переполняется⇒ Надо делать сжатие• Сложно• Задержки
Репликация без логовЗаписи помечаются на репликацию в bit mapsПотребление памятине меняетсяНо: только асинхронная, eventually consistent репликация
КраткоПо процессу на сокетАffinity, приоритетыsyscalls, JNIContext switchesIPC через shared memoryМеньше памяти
Ссылкиhttp://chronicle.software/
key-value-stories.blogspot.com@[email protected]