SlideShare a Scribd company logo
Максим Хижинский, C++ CoreHard Autumn 2017
ПрологПролог
3 вечных вопроса
Что делать?Что делать?
Кто виноват?Кто виноват?
Максим Хижинский, C++ CoreHard Autumn 2017
ПрологПролог
3 вечных вопроса
Что делать?Что делать?
Кто виноват?Кто виноват? Почему такПочему так
получилось?получилось?
Как сделать?Как сделать?
Максим Хижинский, C++ CoreHard Autumn 2017
4x10G NIC (Network Interface Card)4x10G NIC (Network Interface Card)
Максим Хижинский, C++ CoreHard Autumn 2017
4x10G NIC
Инструменты:
●
Netmap — opensource
●
pf_ring — proprietary
●
DPDK (Data Plane Dev Kit) — opensource
Key features:
●
Работа в userspace, минуя kernel
●
DMA, no copy
Максим Хижинский, C++ CoreHard Autumn 2017
4x10G NIC4x10G NIC
Пакет = 512 байт = 2**9 байт = 2**17 бит
Поток = 40 x 2**30 бит
Итого: 40 x 2**30 / 2**17 = 40 x 2**13 пакетов/сек
Процессор = 4 ГГц ~ 4 x 2**30
На пакет: 4 x 2**30 / 40 x 2**13 = 0.1 x 2**17
~ 2**14 = 16K тактов на пакет
Максим Хижинский, C++ CoreHard Autumn 2017
Port 0
RSS RSS RSS RSS
Port 3
RSS RSS RSS RSS
Port 1
RSS RSS RSS RSS
Port 2
RSS RSS RSS RSS
NIC Application
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
Thread 5
Thread 6
Thread 7
Thread N
Hash
Порочные практикиПорочные практики
Безумное количество потоков — потоков
много больше, чем ядер
Создание потоков «на лету», под
выполнение конкретного действия
Максим Хижинский, C++ CoreHard Autumn 2017
Распараллеливание
Thread Thread Thread Thread Thread Thread
Число потоков <= число ядер
Распараллеливание
Thread Thread Thread Thread Thread
Core 0 — свободен (для OS)
Hard pinning threads to cores
Worker thread
ХарактеристикиХарактеристики:
●
No memory allocation
●
Hard pinned to processor
core
●
No memcpy (по
возможности)
Thread
In port
Out port
Максим Хижинский, C++ CoreHard Autumn 2017
Worker thread
Характеристики:
●
No memory allocation (= no std containers)
●
Hard pinned to processor core
●
No memcpy (по возможности)
ПроблемыПроблемы:
●
Длительные/отложенные действия
(авторизация абонента)
●
Периодические задачи (тайм-ауты)
●
Мониторинг внутреннего состояния
●
Взаимодействие со сторонними системами
(DHCP, Radius, ...)
Thread
Максим Хижинский, C++ CoreHard Autumn 2017
Ядро DPIЯдро DPI
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
NIC Application
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
Thread 5
Thread 6
Thread 7
Thread N
Hash
Apartment modelApartment model
Служебные потоки:Служебные потоки:
Мониторинг, отложенные действия, взаимодействиеМониторинг, отложенные действия, взаимодействие
со сторонними системами, ...со сторонними системами, ...
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment modelApartment model - концепция
●
Поток (thread) — низкоуровневая абстракция,
не связанная с предметной областью
●
Понятия «управление потоками» не должно
быть в принципе
●
ITC (inter-thread communication) — глубоко
спрятано. Вызываем member function, где и
как она выполняется — определяет владелец
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment modelApartment model - концепция
Msg queue
Apartment == thread
Apartment — замкнутая система
Взаимодействие — только через
MPSC-очередь сообщений
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment modelApartment model - концепция
Apartment 1 Apartment 2
MsgQ MsgQ
Апартменты заселяются компонентами
Заселение - на этапе старта, положение компонента
задается в conf-файле
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment modelApartment model - концепция
Apartment 1 Apartment 2
MsgQ MsgQ
Каждый компонент — single threaded
Общение между компонентами — async call
Компоненты не знают о расположении друг друга
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment modelApartment model
class Component {
public:
Component( Apartment& ap ): apartment_( ap ) {}
void foo( int arg1, void* arg2 ) {
if ( current_apartment() != apartment_ )
apartment_.invoke( this, foo, arg1, arg2 );
else {
// находимся в своем апартменте
// выполняем свою работу
}
}
// Вызов — всегда асинхронный
void bar() {
apartment_.invoke( this, do_bar );
}
private:
void do_bar() { … }
private:
Apartment& apartment_; // в какой апартмент заселен
};
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment model - сервисыApartment model - сервисы
Компоненты хотят:
✔Распределять память
✔Выполнять периодические или отложенные действия
✔Следить за внешними событиями (сетевое
взаимодействие)
Apartment 1
MsgQ
Apartment 2
MsgQ
Apartment allocator (single-threaded!)
Apartment model - allocatorApartment model - allocator
Apartment 1
MsgQ
Apartment 2
MsgQ
1
1
2
3
4
A: ptr = ap1.alloc( 64 )
2 A: B.invoke( foo, ptr );
A
B
3 B: foo( ptr ) { ...
4 B: ap1.free( ptr ); }
Apartment model - allocatorApartment model - allocator
Apartment 1
MsgQ
Apartment 2
MsgQ
1
1
A: ptr = ap1.alloc( 64 )
2 A: B.invoke( foo, ptr );
A
3 B: foo( ptr ) { ...
4 B: ap2.free( ptr ); }
B
2
3
4
Apartment model - allocatorApartment model - allocator
Apartment 1
MsgQ
Apartment 2
MsgQ
1
A
4 B: ap2.free( ptr );
B
2
3
4
5
5 ap1.invoke( free, ptr );
6
6 A: ap1.free( ptr );
Apartment allocatorApartment allocator
ТребованияТребования:
●
Избежать фрагментации / вспенивания
●
Для каждого распределенного блока памяти
при вызове free() нужно быстро понять, к
какому аллокатору (апартменту) он
относится
●
Выделенный блок памяти не должен иметь
префиксов / управляющих структур
РешениеРешение: страничный single-threaded
субаллокатор
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment allocatorApartment allocator
Page header
Block 1
Block 1
Block 1
Block N
64 byte blocks
Page header
Block 1
Block 2
Block 3
Block N
128 byte blocks
Page header
Block 1
Block 2
Block 3
Block N
256 byte blocks
Page header
Block 1
Block 2
Block 3
Block N
Page header
Block 1
Block 2
Block 3
Block N
64K byte blocks
1 2 3 k
●
Размер страницы — фиксированный (2M)
●
Для каждой страницы - блоки фиксированного размера
●
Выделение M байт:
●
size_class = ближайшая сверху к M степень двойки
●
Выделяем свободный блок из страницы для size_class
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment allocatorApartment allocator
struct page_header {
size_class_desc* psc; // дескриптор size_class
apartment* owner; // апартмент-владелец страницы
void* first_free_block; // 1-й свободный блок страницы
page_header* next; // связь в списки для size_class
};
struct size_class_desc {
apartment* owner;
page_header* current_page; // с этой страницы выделяем
page_header* part_page_list; // список неполных страниц
page_header* full_page_list; // список полных страниц
};
Размер страницы — 2M (2**21 — Linux huge page), выравненный
по 2M
x x x x 0 0 0
02063
page header
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment model - сервисыApartment model - сервисы
Компоненты хотят:
✔Распределять память - done
✔Выполнять периодические или отложенные действия
✔Следить за внешними событиями (сетевое
взаимодействие)
Apartment 1
MsgQ
Apartment 2
MsgQ
Максим Хижинский, C++ CoreHard Autumn 2017
Apartment model - schedulerApartment model - scheduler
Apartment 1
MsgQ
Apartment 2
MsgQ
Root apartment
MsgQ
Scheduler +
Connection monitor
add fdschedule
Выполнить foo()
в apartment 1
через T ms
(в т.ч. периоди-
чески)
add/remove fd to
connection monitor,
invoke bar() on event
in apartment 2
Apartment model - schedulerApartment model - scheduler
Root apartment
MsgQ
Scheduler +
Connection monitor
epoll_wait()
int epoll_wait(int epfd,
struct epoll_event *events, int maxevents,
int timeout );
Максим Хижинский, C++ CoreHard Autumn 2017
Ядро DPIЯдро DPI
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
NIC Application
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
Thread 5
Thread 6
Thread 7
Thread N
Hash
Shared dataShared data
Hash — не всегда распределит в нужный поток — появляются
shared data между worker threads
Persistent data (например, сессии) — создаются в apartment,
используются в worker threads
Shared dataShared data
По месту созданияПо месту создания:
●
Worker threads — нет аллокатора, на
предраспределенных массивах (pointer =
индекс в массиве)
●
Apartment — есть аллокатор, истинно
динамические контейнеры
Постоянная задачаПостоянная задача: по возможности вывести
создание/удаление shared data в apartment
Максим Хижинский, C++ CoreHard Autumn 2017
Shared dataShared data
Intrusive (in-place) containersIntrusive (in-place) containers
●
std — хранит копии, intrusive — no copy
●
Разделено создание данных и операции с
контейнером
●
Одни и те же данные можно одновременно
хранить в разных контейнерах
пример: boost::intrusiveboost::intrusive
Максим Хижинский, C++ CoreHard Autumn 2017
Intrusive containersIntrusive containers
template <typename Tag = void>
struct slist_node {
slist_node<Tag>* next_;
};
template <typename Tag = void>
struct rbtree_node {
rbtree_node<Tag>* parent_, * left_, * right_;
int color;
};
struct tag_list1 {};
struct tag_list2 {};
struct my_data: slist_node<tag_list1>,
slist_node<tag_list2>,
rbtree_node<>
{
std::string key;
// прочие данные
};
Максим Хижинский, C++ CoreHard Autumn 2017
P – thread count
Thread 0
Thread HP Manager
0
1
…
K - 1
HP[K]
0
1
2
…
R - 1
Retired[R]
Hazard Pointer Singleton
Thread
1
Thread
P - 1
K = 4 R = 2 KP
<K,P, R> : R > K * P
Hazard PointersHazard Pointers
Максим Хижинский, C++ CoreHard Autumn 2017
Удаление элемента
void hp_retire( T * what ) {
push what to current_thread.Retired array
if ( current_thread.Retired is full )
hp.Scan( current_thread );
}
void hp::Scan() {
void * guarded[K*P] = union HP[K] for all P thread;
foreach ( p in current_thread.Retired[R] )
if ( p not in guarded[] )
delete p;
}
<K,P, R> : R > K * P
0
1
2
…
R - 1
Retired[R]
0
1
…
K - 1
HP[K]
Гарантия scan():
Hazard PointersHazard Pointers
Максим Хижинский, C++ CoreHard Autumn 2017
Ядро DPIЯдро DPI
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
RSS RSS RSS RSS
NIC Application
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
Thread 5
Thread 6
Thread 7
Thread N
Hash
Hazard PointersHazard Pointers
HP применима, если:
●
Либо Scan() вызывается в apartment, не в worker thread
●
Либо Scan() в worker threads подменяет Retired array на
пустой из пула и передает заполненный Retired array в
apartment
Спасибо за вниманиеСпасибо за внимание
Максим Хижинский, C++ CoreHard Autumn 2017

More Related Content

Viewers also liked

Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
corehard_by
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
corehard_by
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
corehard_by
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
corehard_by
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
corehard_by
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
corehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
corehard_by
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
COMAQA.BY
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
corehard_by
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
corehard_by
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборок
corehard_by
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
corehard_by
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
corehard_by
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
COMAQA.BY
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Ontico
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Ontico
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
COMAQA.BY
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
Sergey Zubkov
 

Viewers also liked (19)

Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборок
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 

Similar to Обработка потока данных на примере deep packet inspection: внутренняя архитектура и решения

Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
corehard_by
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
CodeFest
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Ontico
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)
Alexander Bausk
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
corehard_by
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
Platonov Sergey
 
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилирование
Кирилл Борисов
 
Телепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup MinskТелепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup Minsk
MODX Беларусь
 
Пространственно-распределенная мультикластерная вычислительная система: архит...
Пространственно-распределенная мультикластерная вычислительная система: архит...Пространственно-распределенная мультикластерная вычислительная система: архит...
Пространственно-распределенная мультикластерная вычислительная система: архит...
Mikhail Kurnosov
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Yandex
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
Technopark
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
Программирование под Maemo
Программирование под MaemoПрограммирование под Maemo
Программирование под Maemo
dmitryml
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Ontico
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Ontico
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Nikolay Samokhvalov
 

Similar to Обработка потока данных на примере deep packet inspection: внутренняя архитектура и решения (20)

Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилирование
 
Телепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup MinskТелепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup Minsk
 
Пространственно-распределенная мультикластерная вычислительная система: архит...
Пространственно-распределенная мультикластерная вычислительная система: архит...Пространственно-распределенная мультикластерная вычислительная система: архит...
Пространственно-распределенная мультикластерная вычислительная система: архит...
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
directx
directxdirectx
directx
 
Программирование под Maemo
Программирование под MaemoПрограммирование под Maemo
Программирование под Maemo
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
 

Обработка потока данных на примере deep packet inspection: внутренняя архитектура и решения

  • 2. ПрологПролог 3 вечных вопроса Что делать?Что делать? Кто виноват?Кто виноват? Максим Хижинский, C++ CoreHard Autumn 2017
  • 3. ПрологПролог 3 вечных вопроса Что делать?Что делать? Кто виноват?Кто виноват? Почему такПочему так получилось?получилось? Как сделать?Как сделать? Максим Хижинский, C++ CoreHard Autumn 2017
  • 4. 4x10G NIC (Network Interface Card)4x10G NIC (Network Interface Card) Максим Хижинский, C++ CoreHard Autumn 2017
  • 5. 4x10G NIC Инструменты: ● Netmap — opensource ● pf_ring — proprietary ● DPDK (Data Plane Dev Kit) — opensource Key features: ● Работа в userspace, минуя kernel ● DMA, no copy Максим Хижинский, C++ CoreHard Autumn 2017
  • 6. 4x10G NIC4x10G NIC Пакет = 512 байт = 2**9 байт = 2**17 бит Поток = 40 x 2**30 бит Итого: 40 x 2**30 / 2**17 = 40 x 2**13 пакетов/сек Процессор = 4 ГГц ~ 4 x 2**30 На пакет: 4 x 2**30 / 40 x 2**13 = 0.1 x 2**17 ~ 2**14 = 16K тактов на пакет Максим Хижинский, C++ CoreHard Autumn 2017
  • 7. Port 0 RSS RSS RSS RSS Port 3 RSS RSS RSS RSS Port 1 RSS RSS RSS RSS Port 2 RSS RSS RSS RSS NIC Application Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread N Hash
  • 8. Порочные практикиПорочные практики Безумное количество потоков — потоков много больше, чем ядер Создание потоков «на лету», под выполнение конкретного действия Максим Хижинский, C++ CoreHard Autumn 2017
  • 9. Распараллеливание Thread Thread Thread Thread Thread Thread Число потоков <= число ядер
  • 10. Распараллеливание Thread Thread Thread Thread Thread Core 0 — свободен (для OS) Hard pinning threads to cores
  • 11. Worker thread ХарактеристикиХарактеристики: ● No memory allocation ● Hard pinned to processor core ● No memcpy (по возможности) Thread In port Out port Максим Хижинский, C++ CoreHard Autumn 2017
  • 12. Worker thread Характеристики: ● No memory allocation (= no std containers) ● Hard pinned to processor core ● No memcpy (по возможности) ПроблемыПроблемы: ● Длительные/отложенные действия (авторизация абонента) ● Периодические задачи (тайм-ауты) ● Мониторинг внутреннего состояния ● Взаимодействие со сторонними системами (DHCP, Radius, ...) Thread Максим Хижинский, C++ CoreHard Autumn 2017
  • 13. Ядро DPIЯдро DPI RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS NIC Application Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread N Hash Apartment modelApartment model Служебные потоки:Служебные потоки: Мониторинг, отложенные действия, взаимодействиеМониторинг, отложенные действия, взаимодействие со сторонними системами, ...со сторонними системами, ... Максим Хижинский, C++ CoreHard Autumn 2017
  • 14. Apartment modelApartment model - концепция ● Поток (thread) — низкоуровневая абстракция, не связанная с предметной областью ● Понятия «управление потоками» не должно быть в принципе ● ITC (inter-thread communication) — глубоко спрятано. Вызываем member function, где и как она выполняется — определяет владелец Максим Хижинский, C++ CoreHard Autumn 2017
  • 15. Apartment modelApartment model - концепция Msg queue Apartment == thread Apartment — замкнутая система Взаимодействие — только через MPSC-очередь сообщений Максим Хижинский, C++ CoreHard Autumn 2017
  • 16. Apartment modelApartment model - концепция Apartment 1 Apartment 2 MsgQ MsgQ Апартменты заселяются компонентами Заселение - на этапе старта, положение компонента задается в conf-файле Максим Хижинский, C++ CoreHard Autumn 2017
  • 17. Apartment modelApartment model - концепция Apartment 1 Apartment 2 MsgQ MsgQ Каждый компонент — single threaded Общение между компонентами — async call Компоненты не знают о расположении друг друга Максим Хижинский, C++ CoreHard Autumn 2017
  • 18. Apartment modelApartment model class Component { public: Component( Apartment& ap ): apartment_( ap ) {} void foo( int arg1, void* arg2 ) { if ( current_apartment() != apartment_ ) apartment_.invoke( this, foo, arg1, arg2 ); else { // находимся в своем апартменте // выполняем свою работу } } // Вызов — всегда асинхронный void bar() { apartment_.invoke( this, do_bar ); } private: void do_bar() { … } private: Apartment& apartment_; // в какой апартмент заселен }; Максим Хижинский, C++ CoreHard Autumn 2017
  • 19. Apartment model - сервисыApartment model - сервисы Компоненты хотят: ✔Распределять память ✔Выполнять периодические или отложенные действия ✔Следить за внешними событиями (сетевое взаимодействие) Apartment 1 MsgQ Apartment 2 MsgQ Apartment allocator (single-threaded!)
  • 20. Apartment model - allocatorApartment model - allocator Apartment 1 MsgQ Apartment 2 MsgQ 1 1 2 3 4 A: ptr = ap1.alloc( 64 ) 2 A: B.invoke( foo, ptr ); A B 3 B: foo( ptr ) { ... 4 B: ap1.free( ptr ); }
  • 21. Apartment model - allocatorApartment model - allocator Apartment 1 MsgQ Apartment 2 MsgQ 1 1 A: ptr = ap1.alloc( 64 ) 2 A: B.invoke( foo, ptr ); A 3 B: foo( ptr ) { ... 4 B: ap2.free( ptr ); } B 2 3 4
  • 22. Apartment model - allocatorApartment model - allocator Apartment 1 MsgQ Apartment 2 MsgQ 1 A 4 B: ap2.free( ptr ); B 2 3 4 5 5 ap1.invoke( free, ptr ); 6 6 A: ap1.free( ptr );
  • 23. Apartment allocatorApartment allocator ТребованияТребования: ● Избежать фрагментации / вспенивания ● Для каждого распределенного блока памяти при вызове free() нужно быстро понять, к какому аллокатору (апартменту) он относится ● Выделенный блок памяти не должен иметь префиксов / управляющих структур РешениеРешение: страничный single-threaded субаллокатор Максим Хижинский, C++ CoreHard Autumn 2017
  • 24. Apartment allocatorApartment allocator Page header Block 1 Block 1 Block 1 Block N 64 byte blocks Page header Block 1 Block 2 Block 3 Block N 128 byte blocks Page header Block 1 Block 2 Block 3 Block N 256 byte blocks Page header Block 1 Block 2 Block 3 Block N Page header Block 1 Block 2 Block 3 Block N 64K byte blocks 1 2 3 k ● Размер страницы — фиксированный (2M) ● Для каждой страницы - блоки фиксированного размера ● Выделение M байт: ● size_class = ближайшая сверху к M степень двойки ● Выделяем свободный блок из страницы для size_class Максим Хижинский, C++ CoreHard Autumn 2017
  • 25. Apartment allocatorApartment allocator struct page_header { size_class_desc* psc; // дескриптор size_class apartment* owner; // апартмент-владелец страницы void* first_free_block; // 1-й свободный блок страницы page_header* next; // связь в списки для size_class }; struct size_class_desc { apartment* owner; page_header* current_page; // с этой страницы выделяем page_header* part_page_list; // список неполных страниц page_header* full_page_list; // список полных страниц }; Размер страницы — 2M (2**21 — Linux huge page), выравненный по 2M x x x x 0 0 0 02063 page header Максим Хижинский, C++ CoreHard Autumn 2017
  • 26. Apartment model - сервисыApartment model - сервисы Компоненты хотят: ✔Распределять память - done ✔Выполнять периодические или отложенные действия ✔Следить за внешними событиями (сетевое взаимодействие) Apartment 1 MsgQ Apartment 2 MsgQ Максим Хижинский, C++ CoreHard Autumn 2017
  • 27. Apartment model - schedulerApartment model - scheduler Apartment 1 MsgQ Apartment 2 MsgQ Root apartment MsgQ Scheduler + Connection monitor add fdschedule Выполнить foo() в apartment 1 через T ms (в т.ч. периоди- чески) add/remove fd to connection monitor, invoke bar() on event in apartment 2
  • 28. Apartment model - schedulerApartment model - scheduler Root apartment MsgQ Scheduler + Connection monitor epoll_wait() int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout ); Максим Хижинский, C++ CoreHard Autumn 2017
  • 29. Ядро DPIЯдро DPI RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS NIC Application Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread N Hash Shared dataShared data Hash — не всегда распределит в нужный поток — появляются shared data между worker threads Persistent data (например, сессии) — создаются в apartment, используются в worker threads
  • 30. Shared dataShared data По месту созданияПо месту создания: ● Worker threads — нет аллокатора, на предраспределенных массивах (pointer = индекс в массиве) ● Apartment — есть аллокатор, истинно динамические контейнеры Постоянная задачаПостоянная задача: по возможности вывести создание/удаление shared data в apartment Максим Хижинский, C++ CoreHard Autumn 2017
  • 31. Shared dataShared data Intrusive (in-place) containersIntrusive (in-place) containers ● std — хранит копии, intrusive — no copy ● Разделено создание данных и операции с контейнером ● Одни и те же данные можно одновременно хранить в разных контейнерах пример: boost::intrusiveboost::intrusive Максим Хижинский, C++ CoreHard Autumn 2017
  • 32. Intrusive containersIntrusive containers template <typename Tag = void> struct slist_node { slist_node<Tag>* next_; }; template <typename Tag = void> struct rbtree_node { rbtree_node<Tag>* parent_, * left_, * right_; int color; }; struct tag_list1 {}; struct tag_list2 {}; struct my_data: slist_node<tag_list1>, slist_node<tag_list2>, rbtree_node<> { std::string key; // прочие данные }; Максим Хижинский, C++ CoreHard Autumn 2017
  • 33. P – thread count Thread 0 Thread HP Manager 0 1 … K - 1 HP[K] 0 1 2 … R - 1 Retired[R] Hazard Pointer Singleton Thread 1 Thread P - 1 K = 4 R = 2 KP <K,P, R> : R > K * P Hazard PointersHazard Pointers Максим Хижинский, C++ CoreHard Autumn 2017
  • 34. Удаление элемента void hp_retire( T * what ) { push what to current_thread.Retired array if ( current_thread.Retired is full ) hp.Scan( current_thread ); } void hp::Scan() { void * guarded[K*P] = union HP[K] for all P thread; foreach ( p in current_thread.Retired[R] ) if ( p not in guarded[] ) delete p; } <K,P, R> : R > K * P 0 1 2 … R - 1 Retired[R] 0 1 … K - 1 HP[K] Гарантия scan(): Hazard PointersHazard Pointers Максим Хижинский, C++ CoreHard Autumn 2017
  • 35. Ядро DPIЯдро DPI RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS RSS NIC Application Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread N Hash Hazard PointersHazard Pointers HP применима, если: ● Либо Scan() вызывается в apartment, не в worker thread ● Либо Scan() в worker threads подменяет Retired array на пустой из пула и передает заполненный Retired array в apartment
  • 36. Спасибо за вниманиеСпасибо за внимание Максим Хижинский, C++ CoreHard Autumn 2017