Bank Technology Centre Пример взаимодействия с Order Management System (OMS) 1 15/08/2017 Deutsche Bank Клиент Bloomberg Коннектор Дилер Order Management System
Bank Technology Centre О приложении 2 15/08/2017 Order Management System (OMS): — хранение состояния заявок; — маршрутизация; — заполнение данными клиента и инструмента; — проверки прав; — проверки рисков. Написано на Java. Протокол сообщений — protobuf. В памяти находятся данные по клиентам и инструментам, Xmx=Xms=[8; 30] Гб в зависимости от бизнеса.
Bank Technology Centre Процессинг заявки на квоту Результаты до оптимизации 3 15/08/2017 18:42:12 2010 DB Blue template Процессинг квоты Перцентиль Полное время Бизнес логика 50% 4130 2583 95% 5920 3711 99% 7208 5532 Перцентиль Полное время Бизнес логика 50% 3372 1746 95% 3924 2552 99% 4831 3218 Единицы измерения – микросекунды. Полное время – от момента получения последнего байта до отправки первого байта. Профиль нагрузки – около 1000 сообщений в секунду.
Bank Technology Centre Что оптимизировали и как тестировали 4 15/08/2017 — Оптимизируем медиану времени обработки одного сообщения внутри OMS. — Данные получены с помощью отдельно написанной тестовой программы. — В продакшене данные по времени обработки публикуются в отдельную систему. — Sampling профайлинг помог найти узкие места и избавиться примерно от одной миллисекунды по медиане. — Все дальнейшие действия стоит делать уже после sampling профайлинга.
Bank Technology Centre Конфигурирование ненадёжности 5 15/08/2017 2010 DB Blue template Журнал Полезная работа Секвенсер Чтение данных из сокета Запись данных в сокет Распределенное хранилище данных Публикатор Подтверждение о записи в хранилище Ждём подтверждения? Медиана лучше 250 микросекунд, если не ждать подтверждения
Bank Technology Centre Busy spin wait: while ((availableSequence = dependentSequence.get()) < sequence) { } Blocking wait: while ((availableSequence = cursorSequence.get()) < sequence) { processorNotifyCondition.await(); } Simplified from https://github.com/LMAX-Exchange/disruptor Как ждём событие 6 15/08/2017 2010 DB Blue template
Bank Technology Centre — Busy spin wait улучшил медиану на 90 микросекунд. — Важно, чтобы машина была невиртуализированной и hyper trading был отключен. Как ждём событие 7 15/08/2017 2010 DB Blue template
Bank Technology Centre Проблема: при переключении в WARN режим из INFO тайминги улучшаются на 300 микросекунд. Что использовалось: log4j1 and AsyncAppender. Что можно сделать: — Написать свой аппендер вместо log4j.AsyncAppender. — Перейти на log4j2. Выигрыш от обновления инфраструктуры логирования составил около 250 микросекунд в медиане. Логирование 8 15/08/2017 2010 DB Blue template
Bank Technology Centre Кардинальное решение проблемы логирования: логирование на пассивном инстансе 9 15/08/2017 2010 DB Blue template Активный инстанс ОМС Клиент Дилер Пассивный инстанс ОМС Логи Снэпшот состояния
Bank Technology Centre Проблема: каждая запись лога вызывает чтение/запись в volatile переменные для проверки уровня логирования и обновления дизраптора. Что можно сделать: — Написать более кастомный и потоконебозапасный логер для бизнес логики. — Добавлять логи событий после обработки бизнес логики. Выигрыш составил 50 микросекунд по медиане. Логирование 10 15/08/2017 2010 DB Blue template
Bank Technology Centre Время отклика с разной нагрузкой Проблема низкой нагрузки 11 15/08/2017 18:42:13 2010 DB Blue template Количество сообщений в секунду Медианное время отклика (мкс) 1000 739 0,5 1897Total 300.0 Text Text or number Проблема: инстанс с маленькой нагрузкой имеет время отклика хуже, чем инстанс с более высокой нагрузкой.
Bank Technology Centre Проблема: некоторые ядра работают с частотой 1.2 ГГц вместо 2.2 ГГц. Частота каждого ядра доступна на /proc/cpuinfo. Решение: установить /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor в performance. Проблема: swap файл используется, даже если доступна свободная оперативная память. Решение: установить /proc/sys/vm/swappiness в 0. Выигрыш составил 30 микросекунд по медиане. Базовая конфигурация машины: frequency governor и swappiness 12 15/08/2017 2010 DB Blue template
Bank Technology Centre CPU(s): 64 Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 4 CPU MHz: 2200.000 L3 cache size: 16384 KB Total RAM: 256 Gb OS: SUSE Linux Enterprise Server 11 Спецификация машины 13 15/08/2017 2010 DB Blue template
Bank Technology Centre Привязка процесса к NUMA ноде 15 15/08/2017 2010 DB Blue template Лучше делать байндинг во время старта процесса с помощью numactl: numactl --cpunodebind=3 --preferred=3 java …
Bank Technology Centre Отдельные ядра могут быть изолированы, чтобы планировщик линукса не использовал их по умолчанию. Опция может быть выставлена в /proc/cmdline: isolcpus=0-3,16-19 Изоляция ядер 16 15/08/2017 2010 DB Blue template
Bank Technology Centre Проблема: в зависимости от версии ядра автоматическая балансировка внутри изолированого диапозона может не работать с isolcpus. Решение: Если NUMA нода содержит 8 ядер, то можно применить следующую схему: — Изолировать 5 ядер. — Привязать 5 самых полезных потоков к изолированным ядрам с помощью taskset и jstack. — Привязать все остальные потоки к оставшимся 3 ядрам. Изоляция ядер 17 15/08/2017 2010 DB Blue template
Bank Technology Centre Решена путём привязки и изолирования приложения на NUMA ноде. Пенальти за низкую нагрузку составляет 50 микросекунд в медиане вместо 1 миллисекунды. Проблема низкой нагрузки 18 15/08/2017 2010 DB Blue template
Bank Technology Centre — JDK: 1.8.0_131-b31 — Опции компиляции могут помочь сократить время разогрева. Нам больше всего подошла опция -XX:-TieredCompilation -XX:CompileThreshold=100. — G1 сборщик увеличивал и медианное время и время GC сборок. Самыми подходящими сборщиками остались ConcurrentMarkSweep+Par New. JVM конфигурация: компиляция, сборка мусора 19 15/08/2017 2010 DB Blue template
Bank Technology Centre — Профилировать приложение с помощью perf — Посмотреть в инструментацию планировщика задач: cat /proc/${pid}/task/${tid}/sched Например, можно посмотреть статистику выполнения потока: se.sum_exec_runtime – время выполнения se.statistics.wait_sum – время ожидания планировщика задач se.statistics.sum_sleep_runtime – время ожидания в блокировке Что можно было сделать ещё? 20 15/08/2017 2010 DB Blue template
Bank Technology Centre Процессинг заявки на квоту Результаты после оптимизации 21 15/08/2017 18:42:13 2010 DB Blue template Процессинг квоты Перцентиль Полное время Бизнес логика До оптимизации: 50% 4130 2583 95% 5920 3711 99% 7208 5532 После оптимизации: 50% 611 381 95% 707 451 99% 765 494otal00.0 Перцентиль Полное время Бизнес логика До оптимизации: 50% 3372 1746 95% 3924 2552 99% 4831 3218 После оптимизации: 50% 452 248 95% 476 266 99% 521 290
Bank Technology Centre — Конфигурирование ненадёжности — Стратегия ожидания события в дизрапторе — Оптимизация логирования — Конфигурация linux: frequency governor и vw.swappiness — Привязка процесса к NUMA ноде — Изоляция ядер и привязка потоков к ядрам — JVM конфигурация: компиляция и сборка мусора Что было сделано в инфраструктуре: 22 15/08/2017 2010 DB Blue template
Bank Technology Centre Данный материал не является предложением или предоставлением какой-либо услуги. Данный материал предназначен исключительно для информационных и иллюстративных целей и не предназначен для распространения в рекламных целях. Любой анализ третьих сторон не предполагает какого-либо одобрения или рекомендации. Мнения, выраженные в данном материале, являются актуальными на текущий момент, появляются только в этом материале и могут быть изменены без предварительного уведомления. Эта информация предоставляется с пониманием того, что в отношении материала, предоставленного здесь, вы будете принимать самостоятельное решение в отношении любых действий в связи с настоящим материалом, и это решение является основанным на вашем собственном суждении, и что вы способны понять и оценить последствия этих действий. ООО “Технологический Центр Дойче Банка" не несет никакой ответственности за любые убытки любого рода, относящихся к этому материалу. 24 15/08/2017 2010 DB Blue template