1hippeus - zerocopy messaging по законам Спарты, Леонид Юрьев...
DESCRIPTION
Доклад Леонида Юрьева на HighLoad++ 2014.TRANSCRIPT
StarWars
^| *---+| || | +-----+| | | | +-------+| | | | | | +---------> 1000,000K
0 = | | | | | | msg/sec| | | | | | || | | | | +--------+| | | +------+| +----+|v
BitMining
•
•
•
•
•
•
•
•
XYZ
+---------+ +--------------+ +-----------+| NGINX | | LINUX KERNEL | | TARANTOOL ||---------| |--------------| |-----------|| | | | | || | | | | |+---------+ +--------------+ +-----------+
+--------------------------------------------+| || RAM, a lof of... || DMA_RING |+--------------------------------------------++--------------------------------------------+| PCI Express |+--------------------------------------------+
+-----+ +------+ +-------+ +----------+| NIC | | DISK | | GPU | | Xeon Phi |+-----+ +------+ +-------+ +----------+
xyz xyz xyz
3. MPI
4. ØMQ, nanomsg, …
•
≈ 2
• libt1h.1.0.so
•
+----------+| PRODUCER ||----------|| push() |+----------+
||\/
+----------+| || QUEUE || |+----------+
||\/
+----------+| pull() ||----------|| CONSUMER |+----------+
↔ ↔ ↔
+----------+| PRODUCER ||----------|| push() |+----------+
||\/
+----------+| || QUEUE || |+----------+
||\/
+----------+| pull() ||----------|| CONSUMER |+----------+
HOST_A
HOST_B
+----------+ SHARED MEMORY #1| PRODUCER | +-------+| push() | ==>> | QUEUE |+----------+ +-------+
||\/
+-----------+| pull() || TRANSPORT || push() |+-----------+
||\/
+-------+ +----------+| QUEUE | ==>> | CONSUMER |+-------+ | pull() |
SHARED MEMORY #2 +----------+
+---------+ +--------+| QUEUE | | BUFFER ||---------| | || 0 | | begin##|| 0 | |########| +--------+
TAIL-> PTR------->|####end | | BUFFER || PTR | +--------+ | || ... | | begin##|| PTR------->+--------+ |########|
HEAD-> 0 | | BUFFER | |########|| 0 | | chunk1----->|####end || 0 | | chunk2 | +--------+| 0 | | ... |+---------+ | chunkN----->+--------+
| | | BUFFER |+--------+ | |
| begin##||####end |+--------+
TAGGET_POINTER := pointer | flags
+---------+| POINTER ||---------|| | ALIEN| bit_0 | SLIM| bit_1 | => PARCEL| bit_2 | INCORPOREAL| | ...| bit_3 | \| ... | \ +--------+| | ------------->| BUFFER || | / |--------|| | / | |+---------+ | data |
| |+--------+
+-------------+ +-------------+ +-------------+| 1) SOLID | | 2) INDIRECT | | 3) WEAK ||-------------| |-------------| |-------------|| ref_counter | | ref_counter | | ref_counter || tag | | tag | | tag || _data >---------+ | _data >---------+ | _data >-----|--> ?..| | | +-------------+ | | VMT || ----------- | | | +----------+--+| |<--+ +-----------+ | || | | | | || space | | sk_buff |<--+ v| | | | class my_buffer| | +-----------+ : public T1H::buffer {| || || | virtual ~my_buffer();| | };| |+-------------+
SERVER COMMON / SHARED+--------+ +----------------+| OBJECT | = CreateObject(TypeId, ------>| BINDER ||--------| "libprovider.so"); |----------------|| Body |<----------------------------------------| || TypeId | | TypeId || Handle >----------------+ | Handle |+--------+ | | libprovider.so |
| | Body ---------------+| | | || | | v
CLIENT | | +----------------------++--------+ v | | OBJECT's SHARED BODY || OBJECT | = TakeObject(Handle); ----------------->| |----------------------||--------| | | oxoo .... .... .... || TypeId |<------------------------------o---------| | xxox .... .... .... || Body | | +--| oooo .... .... .... || Handle | +----------------+ | | || Code |<---| libprovider.so |<--load--+ | data .... .... .... |+--------+ +----------------+ +----------------------+
t1h::thread_assign_policy(HIPPEUS_WAITFREE);v|
+---------+ || TLS | ||---------| || policy | <-----------+
+----index || +---------+||| +---------------------------| | QUEUE| |-------------------------| || | +------------++---->| ACTOR SLOT |
| |------------|| | futex || | tid || | ... || +------------+||
void my_service::process(t1h::junction &io){
t1h::batcher batch(io);
while(msg = batch.pull()) {/* ... */batch.push(msg); ----------------+
} |/* batcher's destructor here */ |
} |||
commit/flush * || +---------------+ || | ON STACK FIFO |<---+| +---------------+v
+-------+| QUEUE |+-------+
+-------------------------------------+| ALLOT ||-------------------------------------|| battery |
+---------+ +---------+ +---------+| DEPOT_1 | | DEPOT_2 | | DEPOT16 ||---------| |---------| ... |---------|| 256 | | 512 | | 16M |+---------+ +---------+ +---------+
+----------+ +------------+ +----+ +----+| BASKET_1 | | ACTOR SLOT |+ |TILE| |TILE||----------|+ |------------||+ |----|...|----|| usual || | |||+ | | | |+----------+|+ | CACHE FIFO |||| +----+ +----+| reserve || | ........ ||||+----------+|+ | ..BBBBBB |||| +----+ +----+|dedicated || | BBBBB... |||| |TILE| |TILE|+----------+| | |||| |----|...|----|| offline | +------------+||| |BBBB| |BBBB|+----------+ +------------+|| +----+ +----+
+------------+|+------------+
+----------+ +----------+| JUNCTION | | JUNCTION ||----------| |----------|| | | || in <<<<<<<<<<< QUEUE <<<<<<<<<<< out || | | || out >>>>>>>>>>> QUEUE >>>>>>>>>>> in || | | || allot ------------+ +---------- allot || | | | | || options | | | | options || | v v | |+----------+ +-------------+ +----------+
| ALLOCATOR ||-------------|| BUF BUF BUF || BUF BUF BUF || || BUF BUF BUF || BUF BUF BUF |+-------------+
•
•
•
•
+----------1 +----------1| PRODUCER |2 | CONSUMER |2|----------||3 |----------||3| push() |||4 | pull() |||4+----------+||| +----------+|||+----------+|| +----------+||+----------+| +----------+|+----------+ +----------+
v ^| || || +-------+ || | QUEUE | || |-------| |+-------> | | >------+
| |+-------+
ØMQ,
• R&D подразделение в Сколково
• решения для крупных операторов связи:BSS, Telco protocols, BigData, HA & Highload
• ≈ 21 год полного цикла:разработка, внедрение и сопровождение
• более 100 миллионов абонентовобслуживается при участии наших систем
http://www.billing.ru
https://github.com/1Hippeus